OpenCV几何图像变换(3)计算透视变换矩阵函数getPerspectiveTransform()的使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

计算四对对应点之间的透视变换。

该函数计算 3×3 的透视变换矩阵,使得:

t i x i ′ t i y i ′ t i \] = map_matrix ⋅ \[ x i y i 1 \] \\begin{bmatrix} t_i x'_i \\\\ t_i y'_i \\\\ t_i \\end{bmatrix} = \\texttt{map\\_matrix} \\cdot \\begin{bmatrix} x_i \\\\ y_i \\\\ 1 \\end{bmatrix} tixi′tiyi′ti =map_matrix⋅ xiyi1 其中, d s t ( i ) = ( x i ′ , y i ′ ) , s r c ( i ) = ( x i , y i ) , i = 0 , 1 , 2 , 3 dst(i)=(x'_i,y'_i), src(i)=(x_i, y_i), i=0,1,2,3 dst(i)=(xi′,yi′),src(i)=(xi,yi),i=0,1,2,3 getPerspectiveTransform() 函数用于计算一个 3×3 的透视变换矩阵,该矩阵将源图像中的四边形映射到目标图像中的另一个四边形。这种变换可以实现图像的透视校正,例如将倾斜的图像拉直或调整视角。 ### 函数原型1 ```cpp Mat cv::getPerspectiveTransform ( InputArray src, InputArray dst, int solveMethod = DECOMP_LU ) ``` ### 函数参数1 * 参数src 源图像中四边形顶点的坐标。 * 参数dst 目标图像中对应四边形顶点的坐标。 * 参数solveMethod 传递给 cv::solve 函数的方法(DecompTypes 类型)。 ### 函数原型2 ```cpp Mat cv::getPerspectiveTransform ( const Point2f src[], const Point2f dst[], int solveMethod = DECOMP_LU ) ``` ### 函数参数2 * 参数src 源图像中四边形顶点的坐标。 * 参数dst 目标图像中对应四边形顶点的坐标。 * 参数solveMethod 传递给 cv::solve 函数的方法(DecompTypes 类型)。 ### 示例代码 ```cpp #include #include using namespace cv; using namespace std; int main() { // 加载图像 Mat src = imread("/media/dingxin/data/study/OpenCV/sources/images/hawk.jpg"); if (src.empty()) { cout << "Error: Image not found." << endl; return -1; } // 定义源图像中的四个点 Point2f srcQuad[4] = {Point2f(0, 0), Point2f(src.cols - 1, 0), Point2f(src.cols - 1, src.rows - 1), Point2f(0, src.rows - 1)}; // 定义目标图像中的四个点 Point2f dstQuad[4] = {Point2f(0, 0), Point2f(src.cols * 0.5, 0), Point2f(src.cols * 0.5, src.rows), Point2f(0, src.rows)}; // 获取透视变换矩阵 Mat perspMat = getPerspectiveTransform(srcQuad, dstQuad); // 应用透视变换 Mat warpedImage; warpPerspective(src, warpedImage, perspMat, src.size()); // 显示原图像和变换后的图像 namedWindow("Original Image", WINDOW_NORMAL); imshow("Original Image", src); namedWindow("Warped Image", WINDOW_NORMAL); imshow("Warped Image", warpedImage); // 等待按键并关闭窗口 waitKey(0); destroyAllWindows(); return 0; } ``` ### 运行结果 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b84a784a2e7d4b5dbd8ad41280c67436.png)

相关推荐
蓝桉8025 分钟前
如何进行神经网络的模型训练(视频代码中的知识点记录)
人工智能·深度学习·神经网络
星期天要睡觉38 分钟前
深度学习——数据增强(Data Augmentation)
人工智能·深度学习
南山二毛2 小时前
机器人控制器开发(导航算法——导航栈关联坐标系)
人工智能·架构·机器人
大数据张老师2 小时前
【案例】AI语音识别系统的标注分区策略
人工智能·系统架构·语音识别·架构设计·后端架构
xz2024102****2 小时前
吴恩达机器学习合集
人工智能·机器学习
anneCoder2 小时前
AI大模型应用研发工程师面试知识准备目录
人工智能·深度学习·机器学习
骑驴看星星a2 小时前
没有深度学习
人工智能·深度学习
youcans_2 小时前
【医学影像 AI】YoloCurvSeg:仅需标注一个带噪骨架即可实现血管状曲线结构分割
人工智能·yolo·计算机视觉·分割·医学影像
空白到白2 小时前
机器学习-决策树
人工智能·决策树·机器学习
奇舞精选3 小时前
超越Siri的耳朵:ASR与Whisper零代码部署实战指南
前端·人工智能·aigc