OpenCV基础篇——图形图像旋转
以前在做图像处理的时候用到了图像的旋转,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基础篇——图形图像旋转相关推荐
- [Python从零到壹] 三十八.图像处理基础篇之图像几何变换(平移缩放旋转)
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
- [Python从零到壹] 三十九.图像处理基础篇之图像几何变换(镜像仿射透视)
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
- [Python从零到壹] 四十一.图像处理基础篇之图像采样处理
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
- [Python从零到壹] 四十.图像处理基础篇之图像量化处理
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
- OpenCV基础篇之读取显示图片
程序及分析 /* * FileName : read.cpp * Author : xiahouzuoxin @163.com * Version : v1.0 * Date : Tue 13 May ...
- [Python从零到壹] 三十七.图像处理基础篇之图像融合处理和ROI区域绘制
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
- [Python从零到壹] 三十六.图像处理基础篇之图像算术与逻辑运算详解
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
- linux opencv cmake,OpenCV基础篇之使用CMake管理工程
OpenCV基础篇之使用CMake管理工程 程序及分析 /* * FileName : read.cpp * Author : xiahouzuoxin @163.com * Version : ...
- Java OpenCV 图像处理34 图形图像 分水岭 watershed
Java OpenCV 图像处理34 图形图像 分水岭 watershed package com.xu.opencv;import org.opencv.core.Core; import org. ...
最新文章
- Spring Boot集成持久化Quartz定时任务管理
- Crypto windows 安装
- 神经网络十大学习率衰减提效策略
- Android 底层驱动开发步骤——linux内核层、HAL层、JNI层
- [SceneKit专题]11-Reference-Nodes引用节点
- 关键词分词工具_快图制作工具 | 如何制作词云图?
- 国内第四大运营商中国广电成立:5G 192号段要来了!
- 怎么遍历list集合赋值_Java 集合入门知识
- Mono 基于Jexus发布,创建中文文件名乱码及解决办法
- Windows文件系统
- mac上如何官网下载安装virtualbox
- 斐讯路由器K2弹广告-刷机过程
- js监听移动端横屏和竖屏状态
- 什么叫做镶件?什么情况下需要做镶件?模具做镶件有什么缺陷?
- 全球首个中文PaaS支撑平台----天翎myApps快速开发平台
- JS设计模式——Mixin模式
- 蚂蚁全媒体中心总编刘鑫炜解答:「李子柒说时代给了我一阵风」,成就自媒体网红需要哪些助力?
- php lanyu idea,IDEA使用
- Mac下安装DBeaver
- 10大高权重博客_你知道几个?
热门文章
- linux 磁盘io技术3------libaio使用介绍
- mysql客户端与服务端的区别,终于彻底把握了
- Anaconda,tensorflow,keras安装过程以及遇到的问题和解决方案
- HiveSql面试题11详解(count(1)、count(*)和count(列名)的区别)
- excel 关联数据
- 有关计算机软件的心得1500,plc心得体会1500字
- 韩国多佑集团软件和服务外包基地纳米大厦大连揭幕
- 华为鸿蒙os2.0系统是什么,6月2日,华为鸿蒙2.0手机系统正式登场!苹果有什么动作?...
- Telegram Android开源源码运行
- 如何准备测试数据?用 DbUnit 和 Anthill 控制测试环境