用仿射变换实现图片的角度任意旋转

Mat src,rotate_dst;
char* source_window = "Source image";
char* rotate_window = "Rotate";
 int main( int argc, char** argv )
 {
   Point2f srcTri[3];
   Point2f dstTri[3];
   //定义一个2行3列的矩阵
Mat rot_mat( 2, 3, CV_32FC1 );
     /// 加载源图像
   src = imread( argv[1], 1 );
 /// 设置目标图像的大小和类型与源图像一致
  rotate_dst = Mat::zeros( src.rows, src.cols, src.type() );

   /// 设置源图像和目标图像上的三组点以计算仿射变换
   srcTri[0] = Point2f( 0,0 );
   srcTri[1] = Point2f( src.cols - 1, 0 );
   srcTri[2] = Point2f( 0, src.rows - 1 );

   dstTri[0] = Point2f( src.cols*0.0, src.rows*0.33 );
   dstTri[1] = Point2f( src.cols*0.85, src.rows*0.25 );
   dstTri[2] = Point2f( src.cols*0.15, src.rows*0.7 );

   /// 求得仿射变换
   rot_mat = getAffineTransform( srcTri, dstTri );

   /// 对源图像应用上面求得的仿射变换
   warpAffine( src, rotate_dst, rot_mat, rotate_dst.size() );
   
   double scale = 0.6;
   double angle = 80;

   /// 计算绕图像中点顺时针旋转80度缩放因子为0.6的旋转矩阵
 
   Point center = Point( rotate_dst.cols/2, rotate_dst.rows/2 );
   /// 通过上面的旋转细节信息求得旋转矩阵
   rot_mat = getRotationMatrix2D( center, angle, scale );
   warpAffine( src, rotate_dst, rot_mat, rotate_dst.size() );
   /// 显示结果
  imshow( source_window, src );
 imshow( rotate_window, rotate_dst );

   /// 等待用户按任意按键退出程序
   //waitKey(0);

利用opencv实现仿射变换一般会涉及到warpAffine和getRotationMatrix2D两个函数,其中warpAffine可以实现通过相应矩阵变换后的图片,getRotationMatrix2D可以获得旋转矩阵,将矩阵应用于 warpAffine
warpAffine函数:
void cv::warpAffine
( InputArray src,
OutputArray dst,
InputArray M,
Size dsize,
int flags = INTER_LINEAR,
int borderMode = BORDER_CONSTANT,
const Scalar & borderValue = Scalar()
)
. src: 输入图像
. dst: 输出图像,尺寸由dsize指定,图像类型与原图像一致
. M: 2X3的变换矩阵
. dsize: 指定图像输出尺寸
. flags: 插值算法标识符,有默认值INTER_LINEAR,

猜你喜欢

转载自blog.csdn.net/weixin_43491924/article/details/85109080