以前在做图像处理的时候用到了图像的旋转,opencv自带的flip函数只能180度,因为需要旋转任意角度,顺时针和逆时针的情况,所以去找了些效果比较好的函数来实现。网上有的旋转函数有内存泄露的现象,现在把修改过我用过的无内存泄露的函数分享一下:

一:

void  cvRotate(IplImage* src,int angle){ IplImage * dst = 0;dst = cvCloneImage (src);double delte = 1.0;double factor = 1.0;float m[6];CvMat M = cvMat( 2, 3, CV_32F, m );int w = src->width;int h = src->height;m[0] = (float)(factor*cos(-angle*2*CV_PI/180.));m[1] = (float)(factor*sin(-angle*2*CV_PI/180.));m[2] = w*0.5f;m[3] = -m[1];m[4] = m[0];m[5] = h*0.5f;cvZero (dst);cvGetQuadrangleSubPix( src, dst, &M);
*src = *dst;
}

二:

IplImage*  cvRotate2(IplImage* src,IplImage * dst )
{double delte = 1.0;double factor =1.0;float m[6];int angle =90;int tempLength = (int)sqrt(float(src->width * src->width + src->height * src->height)) + 10;
int tempX = (tempLength + 1) / 2 - src->width / 2;
int tempY = (tempLength + 1) / 2 - src->height / 2;    IplImage* temp = cvCreateImage(cvSize(src->width,src->height), src->depth, src->nChannels);
cvZero(temp);    cvCopy(src, temp, NULL);   int w = temp->width;
int h = temp->height;  m[0] = (float) cos( angle * CV_PI / 180.);
m[1] = (float) sin( angle * CV_PI / 180.);   m[2] = w*0.5f;m[3] = -m[1];m[4] = m[0];m[5] = h*0.5f;CvMat M = cvMat(2, 3, CV_32F, m);
cvGetQuadrangleSubPix( temp,dst, &M);cvReleaseImage(&temp);
return dst;}

三:

IplImage *cvRotate(IplImage *imgSrc)
{  double degree = 270; // rotate 30 degree  double angle = degree  * CV_PI / 180.; // angle in radian  double a = sin(angle), b = cos(angle); // sine and cosine of angle  int w_src = imgSrc->width;  int h_src = imgSrc->height;  int w_dst = int(h_src * fabs(a) + w_src * fabs(b));  int h_dst = int(w_src * fabs(a) + h_src * fabs(b));  // map matrix for WarpAffine, stored in statck array  double map[6];  CvMat map_matrix = cvMat(2, 3, CV_64FC1, map);  // Rotation center needed for cv2DRotationMatrix  CvPoint2D32f pt = cvPoint2D32f(w_src / 2, h_src / 2);  cv2DRotationMatrix(pt, degree, 1.0, &map_matrix);  // Adjust rotation center to dst's center,  // otherwise you will get only part of the result  map[2] += (w_dst - w_src) / 2;  map[5] += (h_dst - h_src) / 2;  // We need a destination image  IplImage *imgDst = cvCreateImage(cvSize(w_dst, h_dst), 8, 3);  cvWarpAffine(  imgSrc,   imgDst,  &map_matrix,  CV_INTER_LINEAR | CV_WARP_FILL_OUTLIERS,  cvScalarAll(0)  );  return imgDst;}

四:

cvTranspose( const CvArr* src, CvArr* dst );的使用

五:推荐

void  cvRotate(IplImage* img,IplImage *img_rotate,int degree)
{//旋转中心为图像中心  CvPoint2D32f center;    center.x=float (img->width/2.0+0.5);  center.y=float (img->height/2.0+0.5);  //计算二维旋转的仿射变换矩阵  float m[6];              CvMat M = cvMat( 2, 3, CV_32F, m );  cv2DRotationMatrix( center, degree,1, &M);  //变换图像,并用黑色填充其余值  cvWarpAffine(img,img_rotate, &M,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,cvScalarAll(0) );
}

OpenCV基础篇——图形图像旋转相关推荐

  1. [Python从零到壹] 三十八.图像处理基础篇之图像几何变换(平移缩放旋转)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  2. [Python从零到壹] 三十九.图像处理基础篇之图像几何变换(镜像仿射透视)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  3. [Python从零到壹] 四十一.图像处理基础篇之图像采样处理

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  4. [Python从零到壹] 四十.图像处理基础篇之图像量化处理

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  5. OpenCV基础篇之读取显示图片

    程序及分析 /* * FileName : read.cpp * Author : xiahouzuoxin @163.com * Version : v1.0 * Date : Tue 13 May ...

  6. [Python从零到壹] 三十七.图像处理基础篇之图像融合处理和ROI区域绘制

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  7. [Python从零到壹] 三十六.图像处理基础篇之图像算术与逻辑运算详解

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  8. linux opencv cmake,OpenCV基础篇之使用CMake管理工程

    OpenCV基础篇之使用CMake管理工程 程序及分析 /* * FileName : read.cpp * Author  : xiahouzuoxin @163.com * Version  : ...

  9. Java OpenCV 图像处理34 图形图像 分水岭 watershed

    Java OpenCV 图像处理34 图形图像 分水岭 watershed package com.xu.opencv;import org.opencv.core.Core; import org. ...

最新文章

  1. Spring Boot集成持久化Quartz定时任务管理
  2. Crypto windows 安装
  3. 神经网络十大学习率衰减提效策略
  4. Android 底层驱动开发步骤——linux内核层、HAL层、JNI层
  5. [SceneKit专题]11-Reference-Nodes引用节点
  6. 关键词分词工具_快图制作工具 | 如何制作词云图?
  7. 国内第四大运营商中国广电成立:5G 192号段要来了!
  8. 怎么遍历list集合赋值_Java 集合入门知识
  9. Mono 基于Jexus发布,创建中文文件名乱码及解决办法
  10. Windows文件系统
  11. mac上如何官网下载安装virtualbox
  12. 斐讯路由器K2弹广告-刷机过程
  13. js监听移动端横屏和竖屏状态
  14. 什么叫做镶件?什么情况下需要做镶件?模具做镶件有什么缺陷?
  15. 全球首个中文PaaS支撑平台----天翎myApps快速开发平台
  16. JS设计模式——Mixin模式
  17. 蚂蚁全媒体中心总编刘鑫炜解答:「李子柒说时代给了我一阵风」,成就自媒体网红需要哪些助力?
  18. php lanyu idea,IDEA使用
  19. Mac下安装DBeaver
  20. 10大高权重博客_你知道几个?

热门文章

  1. linux 磁盘io技术3------libaio使用介绍
  2. mysql客户端与服务端的区别,终于彻底把握了
  3. Anaconda,tensorflow,keras安装过程以及遇到的问题和解决方案
  4. HiveSql面试题11详解(count(1)、count(*)和count(列名)的区别)
  5. excel 关联数据
  6. 有关计算机软件的心得1500,plc心得体会1500字
  7. 韩国多佑集团软件和服务外包基地纳米大厦大连揭幕
  8. 华为鸿蒙os2.0系统是什么,6月2日,华为鸿蒙2.0手机系统正式登场!苹果有什么动作?...
  9. Telegram Android开源源码运行
  10. 如何准备测试数据?用 DbUnit 和 Anthill 控制测试环境