OpenCV完成图像旋转


         图像旋转作为图像处理的基础功能,但在实现细节上是多种多样的,我这里介绍一种基于旋转+平移完成图像的旋转。

1、仿射变换矩阵

OpenCV完成图像旋转_第1张图片


其中α为旋转角度,dx以及dy为仿射变换的平移量,在这种形式的矩阵下,可以认为图像的仿射变换分两步走,首先以

原点逆时针旋转α,随后平移(dx,dy)得到最终的图像。下面结合代码分步解释仿射变换的图像如何获得。


2、操作图像

原图:

OpenCV完成图像旋转_第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度举例:


OpenCV完成图像旋转_第3张图片


上图是对图片单纯旋转45度后的样子,仿射矩阵如下所示:



这里dx与dy均为0,最终dx与dy值为多少,这里只对-90至0以及0至90举例,其它情况还请读者自行完善

if (angle<0)//-90至0
{
   affine_matrix.at(0,2)= Img.rows *sinVal ;
}
if (angle>0)//0至90
{
   affine_matrix.at(1,2)= Img.cols *sinVal ;
}
cout<< affine_matrix;
warpAffine(Img, tempImg, affine_matrix, targetSize);

     最终可得完整变换图像


OpenCV完成图像旋转_第4张图片



你可能感兴趣的:(OpenCV,opencv)