上位机图像处理和嵌入式模块部署(qmacvisual透视变换)

news/2024/7/21 6:08:47 标签: 图像处理, 人工智能

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        说到透视变换,以前我也不明白为什么有这样一个需求。后来在tier1做车道线检测的时候,才知道如果把camera拍摄到的图像做一次透视转换之后,再用传统的方法进行车道线检测,这样正确率要高得多。也就是基于这个原因,才让我第一次知道了opencv下面原来有一个透视变换的功能。如果大家还没有一个直观的印象,可以看下面这个范例。没有透视转换之前,图象是这样的,

        做了透视转换之后,图像变成了这样,

        可以想一想,如果我们需要做ocr字符检测,是不是变换后的图像更容易做字符检测和字符识别。或者简单一点理解,可以把透视变换看成是带俯仰角的旋转变换。

1、创建工程和创建流程

        在qmacvisual当中,第一步还是创建工程和创建流程,这是少不了的。

2、输入图片

        输入图片直接采用【图像处理】里面的【获取图像】,这一步之前也练习了很多次,暂且不谈。

3、导入透视变换的控件

        透视变换的控件,它的位置位于【图像处理】下面。我们直接从树形节点,把对应的控件拖到流程窗口中即可。双击对应的窗口,不出意外,可以看到这样的内容,

        整个图像中,有两处需要配置。一处是输入图像,这部分比较简单。另外一处是输入点和输出点。所谓的输入点,就是源图像中关键区域的位置信息,而输出点呢,则是希望转换后区域所在的位置。对于输入点,一般是通过鼠标移动的方式,来进行位置信息获取的,获取之后用全局变量记录下来。而输出点,一般就是自己简单规划下即可。这样有了输入点和输出点,就可以构建一个旋转矩阵,有了这个矩阵就可以把原来的图像转换成新的图像。这就是透视变换的基本原理。

        图中的var0~var7,都是全局变量中定义的,

4、测试流程

        整个测试流程可以稍微拓展下,添加图像导入和透视变换之外,再添加一个图像显示,这样效果更好一点。

5、实现方法

        通过阅读透视变换的原理,我们发现整个实现的流程并不复杂。最关键的部分还是如何计算透视转换矩阵。这部分可以在代码上面看的比较明显一点,

int frmPerspectiveTransform::RunToolPro()
{
	try
	{
		//其他代码

		//创建用于输入透视的四个点坐标
		std::vector<cv::Point2f> src =
		{
			input_point1,
			input_point2,
			input_point3,
			input_point4
		};
		//创建用于输出透视的四个点坐标
		std::vector<cv::Point2f> dst =
		{
			output_point1,
			output_point2,
			output_point3,
			output_point4
		};
		//获取透视矩阵
		cv::Mat data = cv::getPerspectiveTransform(src, dst);
		//进行透视操作
		cv::warpPerspective(srcImage, dstImage, data, srcImage.size());
		GetToolBase()->m_Tools[tool_index].PublicImage.OutputImage = dstImage;
		GetToolBase()->m_Tools[tool_index].PublicResult.State = true;
		return 0;
	}
	catch (...)
	{
		GetToolBase()->m_Tools[tool_index].PublicResult.State = false;
		return -1;
	}
}


http://www.niftyadmin.cn/n/5463169.html

相关文章

uniapp小程序路由跳转,使用uni.navigateBack方法,实现页面返回上一页

在小程序中uni.navigateTo和uni.redirectTo是通过路由拼接的方式传参 uni.navigateTo({url: test?id1&nameuniapp });uni.redirectTo({url: test?id1 });uni.navigateBack() 是一个用于在uni-app中进行页面后退操作的API。它可以让你返回到上一个页面。在给定的示例中&a…

scala05-函数式编程02

函数式编程-函数对象作为方法的参数 package com.zishi.scala.a02.okk05/*** 将函数对象作为方法的参数来使用&#xff0c;* 函数本身就是对象&#xff0c;* 对象的使用领域&#xff1a;变量&#xff0c;方法参数&#xff0c;返回值类型** 类比Java* public void test(User us…

Centos 7 安装通过yum安装google浏览器

在CentOS 7上使用yum安装Google Chrome浏览器稍微复杂一些&#xff0c;因为Chrome并不直接包含在默认的Yum仓库中。按照以下步骤来操作&#xff1a; 1、添加Google Chrome仓库 首先&#xff0c;您需要手动添加Google Chrome的Yum仓库。打开终端&#xff0c;并使用文本编辑器&a…

在Debian 11上安装GCC

GCC&#xff08;GNU Compiler Collection&#xff09;是一个功能强大的工具集合&#xff0c;可用于将不同编程语言的源代码编译成可执行文件或库。它支持多种编程语言&#xff0c;包括C、C、Java、Objective-C、Go、Fortran、Ada等。在Debian 11上安装GCC非常简单&#xff0c;以…

24年大一训练一(东北林业大学)

前言&#xff1a; 周五晚上的训练赛&#xff0c;以后应该每两周都会有一次。 正文&#xff1a; Problem:A矩阵翻转&#xff1a; #include<bits/stdc.h> using namespace std; int a[55][55]; int main(){int n,m;while(cin>>n>>m){for(int i1;i<n;i){for…

iptables与firewalld防火墙

文章目录 Firewalld防火墙什么是防火墙Firewalld防火墙的概念Firewalld防火墙运行模式Firewalld防火墙的命令Firewalld防火墙的高级规则 iptablesiptables执行过程iptables的表格(table)与链(chain)iptables-filter表规则的查看与清除定义默认策略数据包的基础比对&#xff1a;…

[游戏开发][UE5.3]代码生成蓝图文件并在代码中保存文件。

我看网上有人的做法比我更好&#xff0c;我这个更简单 UE5-GAS:读取Excel数据在蓝图创建并更新GE类 - 知乎 数据配表 测试编辑器API 创建编辑器蓝图文件&#xff0c;继承AssetActionUtility.h 创建在编辑器中显示的函数&#xff0c;可以用中文命名方便其他人使用。 右键任意…

题目 1567: 超级玛丽

题目描述: 大家都知道" 超级玛丽" 是一个很善于跳跃的探险家&#xff0c;他的拿手好戏是跳跃&#xff0c;但它一次只能向前跳一步或两步。有一次&#xff0c;他要经过一条长为n的羊肠小道&#xff0c;小道中有m个陷阱&#xff0c;这些陷阱都位于整数位置&#xff0c…