opencv中getAffineTransform、getRotationMatrix2D以及warpAffine用法

本文详细介绍使用OpenCV进行图像仿射变换的过程,包括读取图像、定义源目标点、计算变换矩阵及应用仿射变换。同时,展示了如何通过旋转中心、角度和缩放比例进行角度仿射变换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

int main()
{
	cv::Mat srcImage = cv::imread("E:\\研究生\\学习材料\\学习书籍\\OpenCV图像处理编程实例-源码-20160801\\《OpenCV图像处理编程实例-源码-20160801\\images\\hand1.jpg");
	if (!srcImage.data)
		return -1;
	cv::imshow("srcImage", srcImage);
	int nRows = srcImage.rows;
	int nCols = srcImage.cols;
	cout << "srcRows: " <<nRows<<endl;
	cout << "srcCols: " << nCols << endl;
	//定义仿射变换的二维点数组
	//源图像和目标图像对应映射的三点
	cv::Point2f srcPoint[3];
	cv::Point2f resPoint[3];
	srcPoint[0] = cv::Point2f(0, 0);
	srcPoint[1] = cv::Point2f(nCols - 1, 0);
	srcPoint[2] = cv::Point2f(0, nRows - 1);
	resPoint[0] = cv::Point2f(nCols * 0, nRows*0.33);
	resPoint[1] = cv::Point2f(nCols*0.85, nRows*0.25);
	resPoint[2] = cv::Point2f(nCols*0.15, nRows*0.7);
	// 定义仿射变换矩阵2X3
	cv::Mat warpMat(cv::Size(2, 3), CV_32F);
	cv::Mat resultImage =
		cv::Mat::zeros(nRows, nCols, srcImage.type());
	// 计算仿射变换矩阵,即仿射变换的2*3数组
	warpMat = cv::getAffineTransform(srcPoint, resPoint);
	cout << "warpMat1: " << warpMat << endl;
	// 根据仿射矩阵计算图像仿射变换
	cv::warpAffine(srcImage, resultImage,
		warpMat, resultImage.size());
	cv::imshow("resultImage1", resultImage);
	// 仿射变换参数设置
	cv::Point2f centerPoint = cv::Point2f(nCols / 2, nRows / 2);
	double angle = -50;
	double scale = 0.7;
	// 获取仿射变换矩阵
	warpMat = getRotationMatrix2D(centerPoint, angle, scale);
	cout << "warpMat2: " << warpMat << endl;
	// 对原图像角度仿射变换
	cv::warpAffine(srcImage, resultImage,
		warpMat, resultImage.size());
	cv::imshow("resultImage2", resultImage);
	cv::waitKey(0);
}

 

### OpenCV 中实现 2D 仿射变换 #### 原理概述 2D 仿射变换是一种线性映射,它保持了共线性和比例关系不变。通过这种变换可以完成图像的平移、缩放、旋转以及倾斜等操作[^1]。 #### 函数介绍 在 OpenCV 中,`cv.getAffineTransform()` 和 `warpAffine()` 是用于执行仿射变换的主要函数组合。其中: - **`cv.getAffineTransform(src, dst)`**: 计算两个三角形之间的仿射变换矩阵。输入参数为源点坐标 (`src`) 和目标点坐标 (`dst`),返回的是一个 \(2 \times 3\) 的浮点型数组表示的变换矩阵。 - **`cv.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])`**: 应用给定的仿射变换矩阵到输入图像上,生成新的输出图像。这里的关键参数有: - `M`: 变换矩阵(由 `getAffineTransform` 或其他方式得到)。 - `dsize`: 输出图像大小,通常指定为目标图像宽度和高度。 另外,在特定场景下可能还需要使用 `getRotationMatrix2D(center, angle, scale)` 来构建围绕某个中心点进行旋转并调整尺度的操作矩阵[^2][^3]。 #### 示例代码 下面提供一段完整的 Python 实现示例来演示如何利用这些工具完成基本的 2D 图像仿射变换过程: ```python import cv2 import numpy as np # 加载原始图片 img = cv2.imread('example.jpg') rows, cols, ch = img.shape # 定义三个点作为原图上的参照物位置 pts_src = np.float32([[50, 50], [200, 50], [50, 200]]) # 对应的目标区域内的新位置 pts_dst = np.float32([[10, 100], [200, 50], [100, 250]]) # 获取仿射变换矩阵 M_affine = cv2.getAffineTransform(pts_src, pts_dst) # 执行仿射变换 result_img = cv2.warpAffine(img, M_affine, (cols, rows)) # 显示结果 cv2.imshow('Original Image', img) cv2.imshow('Warped Result', result_img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 对于更复杂的案例比如仅需单纯旋转而不改变形状的情况,则可采用如下方法获取相应的转换矩阵后再调用相同的 warp 方法处理数据流: ```python rotation_matrix = cv2.getRotationMatrix2D((cols/2, rows/2), 45, 1.0) rotated_image = cv2.warpAffine(img, rotation_matrix, (cols, rows)) ``` 以上就是基于 OpenCV 进行简单有效的二维空间几何变化的具体实践指导说明文档内容总结完毕!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值