仿射變換,其實就是不同的坐標系的相互轉換,用於圖像的平移和旋轉.
首先看一下官方的api描述.
https://docs.opencv.org/2.4/modules/imgproc/doc/geometric_transformations.html?highlight=warpaffine#void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags, int borderMode, const Scalar& borderValue)
先從圖像平移說起,假如說我們想把圖像向右平移5個像素,即(0,0)-->(5,0),(100,100)--->(105,100),更一般地表達即(x,y)-->(x+5,y),其中x,y為坐標系中的某一個像素的位置.
這個過程可以用一個矩陣的乘法來表達
M就是我們所謂的轉移矩陣,當
時,矩陣的乘法得到的效果就是將(x,y)轉變為(x+tx,y+ty),從而完成圖像的平移效果.
所以opencv中完成圖像向右平移5個像素的代碼如下,img_translation即我們得到的新矩陣:
num_rows, num_cols = img_mat.shape[:2]
tx=5
ty=0
translation_matrix = np.float32([ [1,0,tx], [0,1,ty] ])
img_translation = cv2.warpAffine(img_mat, translation_matrix, (num_cols, num_rows),borderValue=(0,0,0))
效果如下
圖像旋轉
圖像的旋轉其實和平移的原理是類似的,opencv里提供了一個api幫我們去獲取旋轉矩陣.我們只需要給出旋轉中心和旋轉角度即可.
cv::Mat src = cv::imread("lenna.jpg");
cv::Mat dst;
//旋轉角度
double angle = 45;
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;
效果如下: