opencv学习 Warp Perspective

本文介绍了OpenCV中用于图像透视变换的两个关键函数:getPerspectiveTransform用于计算透视变换矩阵,而warpPerspective则用于实际应用该矩阵进行图像变形。通过实例演示了如何使用这两个函数将源图像的四边形调整为目标图像的比例布局。

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

一、获取透视变换矩阵函数GetPerspectiveTransform

CV_EXPORTS Mat getPerspectiveTransform(const Point2f src[], const Point2f dst[], int solveMethod = DECOMP_LU);
  • 参数 src 源图像四边形顶点坐标.

  • 参数 dst 目标图像对应的四边形顶点坐标.

  • 参数 solveMethod 传递给cv::solve(#DecompTypes)的计算方法,默认是DECOMP_LU

注:此时得到的是一个矩阵(透视变换矩阵) 

二、透视变换函数warpPerspective

  • 参数:src 输入图像。

  • 参数: dst 输出图像,具有Size dsize并且和源图像具有相同的类型 .

  • 参数: M 3*3的转换矩阵.

  • 参数: dsize 输出图像的大小.

 

float w = 250, h = 350;

int main() {
	string path = "C:\\Users\\Rong\\Desktop\\Resources\\cards.jpg";
	Mat Img = imread(path);

    //两个Point2f的数组!
    //注意一下src和dst的顺序要一致!
	Point2f src[4] = { {743,384},{1021,435},{965,783},{648,710} };
	Point2f dst[4] = { {0,0},{w,0},{w,h},{0,h} };

	Mat matrix,ImgWarp;
	matrix = getPerspectiveTransform(src, dst);
	warpPerspective(Img, ImgWarp, matrix, Size(w, h));

	for (int i = 0; i < 4; i++) {
		circle(Img, src[i], 10, Scalar(0, 0, 255), FILLED);
	}

	imshow("Image", Img);
	imshow("Image Warp", ImgWarp);
	waitKey(0);


}

 

### C++ 实现 Kornia 的 `warp_perspective` 函数 为了实现类似于 Python 库 Kornia 中的 `warp_perspective` 功能,可以采用 OpenCV 或其他图像处理库作为基础工具。以下是基于 OpenCV 的一种可能实现方式: #### 原理概述 透视变换是一种通过矩阵操作改变二维平面视图的技术。给定一组输入点和对应的输出点,可以通过求解一个 \(3 \times 3\) 的单应性矩阵来完成这一过程。该矩阵用于映射原始图像中的像素到目标位置。 在 OpenGL 和着色器编程中,角度通常以弧度表示[^1]。然而,在实际应用中(如 OpenCV),我们更倾向于使用角度制进行参数化设置。因此,转换逻辑需注意单位一致性。 下面是完整的 C++ 实现代码示例: ```cpp #include <opencv2/opencv.hpp> #include <iostream> cv::Mat warpPerspective(const cv::Mat& src, const cv::Mat& M, const cv::Size& dsize) { // Check input validity if (!src.data || !M.data) { std::cerr << "Invalid input data!" << std::endl; return {}; } // Perform perspective transformation using OpenCV's built-in function cv::Mat dst; cv::warpPerspective(src, dst, M, dsize); return dst; } int main() { try { // Load an image as source cv::Mat img = cv::imread("input_image.jpg"); if (img.empty()) { std::cerr << "Error loading image." << std::endl; return -1; } // Define a custom homography matrix (example values) double M_data[] = {0.707, 0.707, 0, -0.707, 0.707, 0, 0, 0, 1}; cv::Mat M(3, 3, CV_64F, M_data); // Desired output size cv::Size dsize(img.cols / 2, img.rows / 2); // Apply the warping operation cv::Mat warped_img = warpPerspective(img, M, dsize); // Display results cv::imshow("Original Image", img); cv::imshow("Warped Perspective", warped_img); cv::waitKey(0); } catch (const std::exception &e) { std::cerr << e.what(); } return 0; } ``` 上述程序实现了基本的功能框架,并利用了 OpenCV 提供的核心 API 来执行具体的计算任务。对于高级需求,还可以引入 GPU 加速版本或者自定义优化路径。 关于随机数生成以及序列采样等内容,则可参考 HXA 图形库提供的资源[^2],它包含了多种高效算法及其源码实现细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值