warpAffine做圖像移動和旋轉

warpAffine是一個不能忽略的東西,之前大意認爲是很簡單的東西,然而實際用起來還是需要掌握基本的數學思想的。

重點是一個2*3的平移矩陣M,分別指定x方向和y方向上的平移量tx和ty,平移矩陣的形式如下:

python:

import numpy as np
import cv2

img=cv2.imread("lena.png")
#平移矩陣[[1,0,-100],[0,1,-12]]
M=np.array([[1,0,-100],[0,1,-12]],dtype=np.float32)
img_change=cv2.warpAffine(img,M,(300,300))
cv2.imshow("test",img_change)
cv2.waitKey(0)




 
import numpy as np
import cv2
 
img = cv2.imread(r"00000.png")
 
# 對圖像進行變換(三點得到一個變換矩陣)
# 我們知道三點確定一個平面,我們也可以通過確定三個點的關係來得到轉換矩陣
# 然後再通過warpAffine來進行變換
cv2.imshow("original", img)
 
rows, cols = img.shape[:2]
 
# #平移矩陣[[1,0,-100],[0,1,-12]]
# M=np.array([[1.4,0,-100],[0,1.2,-12]],dtype=np.float32) #左移100, 上移12   水平拉伸1.4  垂直拉伸1.2
 
a=np.random.randint(-2,2) #水平
b=np.random.randint(-2,2) #垂直
c=np.random.uniform(1,1) #水平拉伸
d=np.random.uniform(1,1.2) #垂直拉伸
print(a)
print(b)
print(c)
print(d)
M=np.array([[c,0,a],[0,d,b]],dtype=np.float32) #左移100, 上移12
dst = cv2.warpAffine(img, M, (cols, rows), borderValue=(0, 0, 0))
 
cv2.imshow("res", dst)
cv2.waitKey(0)
 
 

c++:

	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) = -100; //水平平移量
	t_mat.at<float>(1, 1) = 1;
	t_mat.at<float>(1, 2) = 12; //豎直平移量
 
	//根據平移矩陣進行仿射變換
	cv::warpAffine(src, dst, t_mat, dst_sz);
 
	//顯示平移效果
	cv::imshow("image", src);
	cv::imshow("result", dst);
 
	cv::waitKey(0);
 
	return 0;

借用一下圖:

2. 圖像的旋轉

圖像的旋轉具體實現分爲兩步:先根據旋轉角度旋轉中心獲取旋轉矩陣(通常採用RotatedRect函數獲得);然後根據旋轉矩陣進行仿射變換,即可實現任意角度和任意中心的旋轉效果。旋轉矩陣的形式如下:

其中,

	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;

參考博客:https://blog.csdn.net/guduruyu/article/details/70799804

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章