warpAffine做图像移动和旋转

warpAffine是一个不能忽略的东西,之前大意认为是很简单的东西,然而实际用起来还是需要掌握基本的数学思想的。

 

重点是一个2*3的平移矩阵M,分别指定x方向和y方向上的平移量tx和ty,平移矩阵的形式如下:

python:

import numpy as np
import cv2img=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 cv2img = 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.2a=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(0, 0) = 1;t_mat.at(0, 2) = -100; //水平平移量t_mat.at(1, 1) = 1;t_mat.at(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函数获得);然后根据旋转矩阵进行仿射变换,即可实现任意角度和任意中心的旋转效果。旋转矩阵的形式如下:

其中,

#include
#include
#include
using namespace std;
void main()
{cv::Mat src = cv::imread("123.jpg");cv::Mat dst;//旋转角度double angle = 45;cv::Size src_sz = src.size();cv::Size dst_sz(src_sz.height*4, src_sz.width*4);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);//getAffineTransform 根据两组点集得到旋转矩阵//根据旋转矩阵进行仿射变换cv::warpAffine(src, dst, rot_mat, dst_sz);//显示旋转效果cv::imshow("image", src);cv::imshow("result", dst);cv::imwrite("dst.png", dst);cv::waitKey(0);}

参考博客:【OpenCV3】图像旋转与平移——cv::warpAffine()详解_PHILOS_THU的博客-CSDN博客_opencv平移

getRotationMatrix2D函数_普通网友的博客-CSDN博客_getrotationmatrix2d

OpenCV中仿射变换warpAffined和getRotationMatrix2D ——python_大墅哥哥的博客-CSDN博客


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部