数字图像处理基础(十一)---缩放、角度旋转和仿射变换及代码实现




源码如下:

int  picProcessBasics::IMGAffineTransform(Mat* srcImage, Mat* dstImage_warp,double angle,double scale)
 {
  if(NULL == srcImage)
   return -1;

    int res = 0;
 //定义两组点,代表两个三角形
 Point2f srcTriangle[3];
 Point2f dstTriangle[3];
 //定义一些Mat变量
 Mat rotMat( 2, 3, CV_32FC1 );
 Mat warpMat( 2, 3, CV_32FC1 );
 Mat dstImage_warp_rotate;

 // 设置目标图像的大小和类型与源图像一致
 *dstImage_warp = Mat::zeros( srcImage->rows, srcImage->cols, srcImage->type() );

 //设置源图像和目标图像上的三组点以计算仿射变换
 srcTriangle[0] = Point2f( 0,0 );
 srcTriangle[1] = Point2f( static_cast<float>(srcImage->cols - 1), 0 );
 srcTriangle[2] = Point2f( 0, static_cast<float>(srcImage->rows - 1 ));

 dstTriangle[0] = Point2f( static_cast<float>(srcImage->cols*0.0), static_cast<float>(srcImage->rows*0.33));
 dstTriangle[1] = Point2f( static_cast<float>(srcImage->cols*0.65), static_cast<float>(srcImage->rows*0.35));
 dstTriangle[2] = Point2f( static_cast<float>(srcImage->cols*0.15), static_cast<float>(srcImage->rows*0.6));

 //求得仿射变换
 warpMat = getAffineTransform( srcTriangle, dstTriangle );

 //对源图像应用刚刚求得的仿射变换
 warpAffine( *srcImage, *dstImage_warp, warpMat, dstImage_warp->size() );

 //对图像进行缩放后再旋转
 // 计算绕图像中点顺时针旋转angle度缩放因子为scale的旋转矩阵
 Point center = Point( dstImage_warp->cols/2, dstImage_warp->rows/2 );

 // 通过上面的旋转细节信息求得旋转矩阵
 rotMat = getRotationMatrix2D( center, angle, scale );
 // 旋转已缩放后的图像
 warpAffine( *dstImage_warp, dstImage_warp_rotate, rotMat, dstImage_warp->size() );
 dstImage_warp_rotate.copyTo(*dstImage_warp);
    return res;  

 }

变换前图像:

仿射变换后旋转90度缩放比例为1:

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值