OpenCV中图像旋转 warpAffine 算法的实现过程

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

在OpenCV中,目前并没有现成的函数直接用来实现图像旋转,它是用仿射变换函数cv::warpAffine来实现的,此函数目前支持4种插值算法,最近邻、双线性、双三次、兰索斯插值,如果传进去的参数为基于像素区域关系插值算法(INTER_AREA),则按双线性插值。

通常使用2*3矩阵来表示仿射变换:

          

 

其中,T相当于变换前的原始图像,x,y为变换后的图像坐标。

对于cv::getRotationMatrix2D函数的实现公式为:

 

其中scale为缩放因子(x、y方向保持一致),angle为旋转角度(弧长),centerx,centery为旋转中心。

以lena.jpg图像旋转45度为例:   

采用最近邻插值算法的实现代码为:

 

 cv::Mat matSrc = cv::imread("lena.jpg", 2 | 4); if (matSrc.empty()) returnconst double degree = 45double angle = degree * CV_PI / 180.double alpha = cos(angle); double beta = sin(angle); int iWidth = matSrc.cols; int iHeight = matSrc.rows; int iNewWidth = cvRound(iWidth * fabs(alpha) + iHeight * fabs(beta)); int iNewHeight = cvRound(iHeight * fabs(alpha) + iWidth * fabs(beta)); double m[6]; m[0] = alpha; m[1] = beta; m[2] = (1 - alpha) * iWidth / 2. - beta * iHeight / 2.; m[3] = -m[1]; m[4] = m[0]; m[

你可能感兴趣的:(OpenCV中图像旋转 warpAffine 算法的实现过程)