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

news2024/9/21 0:44:52
  • 操作系统: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} tixitiyiti =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


Mat cv::getPerspectiveTransform
(
	InputArray 	src,
	InputArray 	dst,
	int 	solveMethod = DECOMP_LU 
)		

函数参数1

  • 参数src 源图像中四边形顶点的坐标。
  • 参数dst 目标图像中对应四边形顶点的坐标。
  • 参数solveMethod 传递给 cv::solve 函数的方法(DecompTypes 类型)。

函数原型2


Mat cv::getPerspectiveTransform
(
	const Point2f 	src[],
	const Point2f 	dst[],
	int 	solveMethod = DECOMP_LU 
)	

函数参数2

  • 参数src 源图像中四边形顶点的坐标。
  • 参数dst 目标图像中对应四边形顶点的坐标。
  • 参数solveMethod 传递给 cv::solve 函数的方法(DecompTypes 类型)。

示例代码

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

运行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2055966.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

零基础入门AI:1 token ~= 3/4 words?3分钟理解大语言模型分词

ChatGPT API 按 token 数量收费&#xff0c;那么1个token究竟是多少&#xff1f; 按Openai 的估算&#xff0c;1 token ~ 3/4 words&#xff0c;100个token大约是75个单词。 输入的文本是如何被分解为 token 的呢&#xff1f;在大语言模型处理文本时&#xff0c;分词&#xf…

记一次hivemetastore启动报错

1&#xff0c;启动hivemetastore后报错日志 2&#xff0c;排查lib下的mysql的驱动也在&#xff0c; 这里和mysql的驱动大小一样 3&#xff0c;把hive-site.xml中无关的配置都删掉&#xff0c;重启metastore还是报错 4&#xff0c;最后排查&#xff0c;这个节点rpm部署了hive…

Adobe After Effects的插件--------CC Cylinder

CC Cylinder是柱体插件。它是AE内置的3D插件。 使用条件 该插件的作用是将2D图层转换为3D的柱体。所以使用该插件时要确保源图层为2D的。 我们以一张图片素材为例: 给图片图层添加CC Cylinder效果控件,然后新建一个摄像机(利用摄像机旋转、平移、推拉工具,方便在各个角度…

解锁黑科技!百度AppBuilder助你秒变开发者,轻松实现文心一言

在数字化浪潮席卷全球的今天&#xff0c;人工智能&#xff08;AI&#xff09;和大模型技术正以前所未有的速度改变着我们的世界。从自然语言处理到图像识别&#xff0c;从智能推荐到自动化决策&#xff0c;大模型以其强大的数据处理能力和学习能力&#xff0c;正成为推动科技创…

数字化办公OA系统是如何运作的——办公物品领用功能拆解

数字化办公 OA 系统究竟是如何运作的呢&#xff1f;它的核心功能又是如何发挥作用的呢&#xff1f;这篇就以行政 OA 系统为例&#xff0c;从产品视角来深入探讨它是如何运作的。 简道云行政OA管理系统模板&#xff0c;可以直接查看和使用&#xff1a;https://www.jiandaoyun.co…

地域美食与白酒的情缘,品味文化交融之美

在广袤无垠的华夏大地上&#xff0c;地域美食与白酒各自承载着丰富的文化内涵和历史底蕴。当这两者相遇&#xff0c;便是一场跨越时空的文化交融&#xff0c;它们共同编织出一幅幅绚丽多彩的味蕾画卷。今天&#xff0c;就让我们一起探寻地域美食与豪迈白酒&#xff08;HOMANLIS…

溯源“最强大脑“:解密智能微气候调控中的算法革命

智能微气候调控是设施农业发展的新引擎,而推动这一引擎不断向前的动力,正是源源不断涌现的前沿算法。这些"最强大脑"以其卓越的感知、决策和优化能力,为设施农业插上腾飞的翅膀。本文将以"剥洋葱"的方式,层层剖析智能微气候调控背后的算法原理、技术架构和…

【大模型微调训练与实操】微调 Llama 3 并在本地使用

目标&#xff1a;根据医患对话数据集对 Llama 3 进行微调&#xff0c;创建一个专门针对医疗对话的模型。在合并、转换和量化模型后&#xff0c;它将可以通过 Jan 应用程序供本地私人使用。 在本教程中&#xff0c;我们将学习如何在医学数据集上微调 Llama 3。我们还将通过 Ja…

后端Java秋招面试中的自我介绍需要说什么?

本文主要面向校招/实习面试中求职后端开发岗位的同学&#xff0c;其他岗位/社招的同学也可以参考&#xff0c;道理都是相通的 1 背景 1.1为什么要认真准备自我介绍&#xff1f; 1. 必要性&#xff1a;在求职面试中&#xff0c;一般来说同学和面试官打过招呼之后第一项就是自…

软件测试学习笔记丨APP通用测试方法

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/31923 一&#xff0c;App项目测试 1&#xff0c;测试流程 需求分析测试计划编写测试用例设计测试用例评审用例执行回归测试非功能测试走查验收&#xff08;UI、产品&#xff09;测试总结报告…

将标注文件统一命名

前言 遇到一个问题&#xff0c;对方给的标注文件都是有包括中文以及特殊字符的命名&#xff0c;这就给数据预处理造成了极大不便&#xff0c;因为深度学习训练时使用的有些库是不支持读除了ascii码以外的字符的。所以需要将这些文件名重新对应命名一下。 代码 这是关键点的标…

AI架构系列:去其形而留其意

这个专栏主要关注围绕着AI运用于实际的业务场景所需的系统架构设计。整体基于云原生技术&#xff0c;结合开源领域的LLMOps或者MLOps技术&#xff0c;充分运用低代码构建高性能、高效率和敏捷响应的AI中台。该专栏需要具备一定的计算机基础。 最近很多的咨询都在问我相同的问题…

基于单片机车载酒精浓度的检测系统

摘 要&#xff1a; 为了有效地防止驾驶员酒后驾车的行为&#xff0c;设计了一种基于单片机车载酒精浓度的检测系统 。 该系统由酒精传感器、 A/D 转换器 、 AT89S52 单片机控制器 、 语音报警 、 LCD 液晶显示 、 LED 指示灯 、 车门锁传感器 、 压力传感器和继电器等构成。 当…

【vue讲解:es6导入导出语法、 vue-router简单使用、登录跳转案例、scoped的使用、elementui使用】

1 es6导入导出语法 # 做项目&#xff1a;肯定要写模块--》导入使用# 默认导出和导入 在某个js中 # 命名导出和导入1.1 默认导出和导入 // #########导出语法########### // export default name // 只导出变量 // export default add // 只导出函数// export default {nam…

地平线旭日X3开发板--USB网卡AX88772B驱动移植

由于使用的激光雷达是网口输出的, 为了不占用X3派已有的网口,接上去了一个绿联的usb网卡, 发现系统没有驱动,所以动手看看能不能自己编译一个 首先lsusb查看一下网卡型号 发现型号是AX88772B,去官网看了一下,发现官方提供驱动 AX88772B - Low-Power USB 2.0 to Fast …

如何使用 OCR 和 GPT-4o mini 轻松提取收据信息

利用 OCR 和强大的 GPT-4o 迷你模型对收据进行信息提取 利用 OCR 和强大的 GPT-4o 迷你模型对收据进行信息提取 欢迎来到雲闪世界。&#xff0c;我将向您展示如何从收据中提取信息&#xff0c;并提供收据的简单图像。首先&#xff0c;我们将利用 OCR 从收据中提取信息。然后&a…

研发项目成本超支?专业研发项目管理软件帮你精细化管理,节省每一分钱!

一、你是否也曾经历过这样的场景&#xff1f; 项目进度一再延期&#xff0c;眼看着预算不断超支&#xff0c;却无计可施&#xff1f;团队成员各自为战&#xff0c;沟通效率低下&#xff0c;项目进度难以掌控&#xff1f;需求变更频繁&#xff0c;导致项目计划混乱&#xff0c;…

11 程序控制语句:顺序控制、分支控制(if-else、switch、嵌套)

目录 1 程序控制语句 2 顺序控制语句 3 分支控制语句 3.1 单向分支 if 3.1.1 基本语法 3.1.2 单向分支流程图 3.1.3 案例 3.2 双向分支 if-else 3.2.1 基本语法 3.2.2 双向分支流程图 3.2.3 案例 3.3 多向分支 else if 3.3.1 基本语法 3.3.2 多向分支流程图 3.3…

光储充能源站微电网及其控制综述入门研究笔记

1. 关于微电网 微电网&#xff08;Micro-Grid&#xff09;&#xff0c;也译为微网&#xff0c;是一个由分布式电源、储能装置、能量转换装置、负荷、监控和保护装置等组成的小型发配电系统。微电网的提出旨在实现分布式电源的灵活、高效应用&#xff0c;解决数量庞大、形式多样…

巴西服务器租用市场:中国企业出海布局的新热点

近年来&#xff0c;巴西市场以其独特的地理位置、庞大的市场潜力、丰富的资源以及友好的营商环境&#xff0c;吸引了众多中国企业的目光。在众多合作领域中&#xff0c;巴西服务器租用成为了中国企业出海布局的重要一环。本文将深入探讨巴西市场为何受广大中国企业青睐&#xf…