图像旋转和平移是图像处理中常用的一种操作,opencv2和opencv3中对图像的旋转和平移都是通过仿射变换函数cv::warpAffine()来实现的。
1、图像的旋转
图像的旋转具体实现分为两步:先根据旋转角度和旋转中心获取旋转矩阵;然后根据旋转矩阵进行仿射变换,即可实现任意角度和任意中心的旋转效果。旋转矩阵的形式如下:
其中,
具体代码如下:
cv::Mat src = cv::imread("lenna.jpg");
cv::Mat dst; //旋转角度
double angle = ; cv::Size src_sz = src.size();
cv::Size dst_sz(src_sz.height, src_sz.width);
int len = std::max(src.cols, src.rows); //指定旋转中心
cv::Point2f center(len / ., len / .); //获取旋转矩阵(2x3矩阵)
cv::Mat rot_mat = cv::getRotationMatrix2D(center, angle, 1.0); //根据旋转矩阵进行仿射变换
cv::warpAffine(src, dst, rot_mat, dst_sz); //显示旋转效果
cv::imshow("image", src);
cv::imshow("result", dst); cv::waitKey(); return ;
结果如下:
2、图像的平移
图像的平移也分为两步:首先定义好图像的平移矩阵,分别指定x方向和y方向上的平移量tx和ty,平移矩阵的形式如下:
cv::Mat src = cv::imread("lenna.jpg");
cv::Mat dst; cv::Size dst_sz = src.size(); //定义平移矩阵
cv::Mat t_mat =cv::Mat::zeros(, , CV_32FC1); t_mat.at<float>(, ) = ;
t_mat.at<float>(, ) = ; //水平平移量
t_mat.at<float>(, ) = ;
t_mat.at<float>(, ) = ; //竖直平移量 //根据平移矩阵进行仿射变换
cv::warpAffine(src, dst, t_mat, dst_sz); //显示平移效果
cv::imshow("image", src);
cv::imshow("result", dst); cv::waitKey(); return ;
平移结果如下: