图像旋转作为图像处理的基础功能,但在实现细节上是多种多样的,我这里介绍一种基于旋转+平移完成图像的旋转。
1、仿射变换矩阵
其中α为旋转角度,dx以及dy为仿射变换的平移量,在这种形式的矩阵下,可以认为图像的仿射变换分两步走,首先以
原点逆时针旋转α,随后平移(dx,dy)得到最终的图像。下面结合代码分步解释仿射变换的图像如何获得。
2、操作图像
原图:
获得旋转仿射变换矩阵
float radian = (float) (angle /180.0 * CV_PI); //旋转角度
Point2f center( 0.0 , 0.0); //旋转中心
float sinVal = fabs(sin(radian));
float cosVal = fabs(cos(radian));
Size targetSize( (int)(Img.cols * cosVal + Img.rows * sinVal),
(int)(Img.cols * sinVal + Img.rows * cosVal) ); //获取目标图像大小
Mat affine_matrix = getRotationMatrix2D( center, angle, 1.0 ); //获取旋转仿射矩阵
如果用affine_matrix直接对图像进行变换,则会丢失较多的图像细节,下面以旋转0至90度举例:
上图是对图片单纯旋转45度后的样子,仿射矩阵如下所示:
这里dx与dy均为0,最终dx与dy值为多少,这里只对-90至0以及0至90举例,其它情况还请读者自行完善
if (angle<0)//-90至0
{
affine_matrix.at<double>(0,2)= Img.rows *sinVal ;
}
if (angle>0)//0至90
{
affine_matrix.at<double>(1,2)= Img.cols *sinVal ;
}
cout<< affine_matrix;
warpAffine(Img, tempImg, affine_matrix, targetSize);
最终可得完整变换图像