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 <opencv2/opencv.hpp>
#include <iostream>

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;
}

运行结果

相关推荐
芙蓉姐姐陪你写论文17 分钟前
别再为创新点发愁了!ChatGPT助你快速搞定!
大数据·论文阅读·人工智能·chatgpt·ai写作·论文笔记·aipapergpt
967722 分钟前
神经网络的线性部分和非线性部分
人工智能·深度学习·神经网络
富士达幸运星1 小时前
模板匹配应用(opencv的妙用)
人工智能·opencv·计算机视觉
安科瑞蒋静1 小时前
介绍 TensorFlow 的基本概念和使用场景
人工智能
Aha_aho1 小时前
【pytorch】keepdim参数解析
人工智能·pytorch·python
AI大模型训练家1 小时前
大模型 LLM(Large Language Models)如今十分火爆,对于初入此领域的新人小白来说,应该如何入门 LLM 呢?是否有值得推荐的入门教程呢?
人工智能·语言模型·自然语言处理·chatgpt·aigc·agi
天润融通1 小时前
AI客服机器人开启企业客户服务新纪元
人工智能·其他·机器人
超维机器人1 小时前
智能巡检机器人局部放电检测的应用
运维·人工智能·算法·机器人
AI科研视界1 小时前
机器人可能会在月球上提供帮助
人工智能·机器人
天下谁人不识军1 小时前
【深度学习】注意力机制介绍,了解什么是注意力计算规则以及常见的计算规则,知道注意力机制的工作流程
人工智能·python·深度学习