opencv实现仿射变换
warpAffined
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:2*3尺寸的变换矩阵
- disze 输出图像的尺寸
- flags:插值算法标识符
- INTER_NEAREST(最近邻插值)、INTER_LINEAR(线性插值)、INTER–CUBIC(双立方插值)、INTER_AREA(区域插值)、INTER_LANCZOS4(Lanczos插值)、INTER_MAX(用于插值的掩模板)、WARP_FILL_OUTLIERS(,用于填充目标图像的像素值)、WARP_INVERSE_MAP(反变换)
- borderMode:边界模式
- borderValue:边界取值
getRotationMatrix2D
Mat getRotationMatrix2D(Point2f center, double angle, double scale)
参数解释:
- center:表示源图像的中心
- angle:旋转角度,正值为逆时针旋转
- scale:缩放系数
python
旋转
import cv2
img=cv2.imread('D://man.png')
rows,cols,_ = img.shape
#90度旋转
M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
dst = cv2.warpAffine(img,M,(cols,rows))
cv2.imshow('origin',img)
cv2.imshow('rotate',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
平移
import cv2
import numpy as np
img=cv2.imread('D://man.png')
rows,cols,_ = img.shape
# 平移矩阵M:[[1,0,x],[0,1,y]]
M = np.float32([[1,0,100],[0,1,50]])
dst = cv2.warpAffine(img,M,(cols,rows))
cv2.imshow('origin',img)
cv2.imshow('translate',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
C++
旋转
cv::Mat src = cv::imread("lenna.jpg");
cv::Mat dst;
//旋转角度
double angle = 90;
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 / 2., len / 2.);
//获取旋转矩阵(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(0);
return 0;
平移
cv::Mat src = cv::imread("lenna.jpg");
cv::Mat dst;
cv::Size dst_sz = src.size();
//定义平移矩阵
cv::Mat t_mat =cv::Mat::zeros(2, 3, CV_32FC1);
t_mat.at<float>(0, 0) = 1;
t_mat.at<float>(0, 2) = 20; //水平平移量
t_mat.at<float>(1, 1) = 1;
t_mat.at<float>(1, 2) = 10; //竖直平移量
//根据平移矩阵进行仿射变换
cv::warpAffine(src, dst, t_mat, dst_sz);
//显示平移效果
cv::imshow("image", src);
cv::imshow("result", dst);
cv::waitKey(0);
return 0;