OpenCV完成图像旋转


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

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);

     最终可得完整变换图像





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值