分享一下我老师大神的人工智能教程!零基础,通俗易懂!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()) return; const double degree = 45; double 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[