当前位置: 首页 > news >正文

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

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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;}
}

相关文章:

  • 优雅的使用ChromeDriver
  • 论文《Exploring to Prompt for Vision-Language Models》阅读
  • Linux小程序: 手写自己的shell
  • LabVIEW比例流量阀自动测试系统
  • Eclipse+Java+Swing实现斗地主游戏
  • 散热风扇220v交流12v直流12038轴流风机配电箱机柜散热风扇15050
  • Rust教程:How to Rust-基本类型
  • 探索数据库mysql--------------mysql主从复制和读写分离
  • 电脑关机速度很慢怎么解决?
  • L3-016 二叉搜索树的结构
  • LeetCode //C - 436. Find Right Interval
  • MySQL进阶-----索引的语法与SQL性能分析
  • 【Python百日进阶-Web开发-Peewee】Day290 - Peewee 的扩展(十)架构迁移(下)/ 映射
  • Unity 学习日记 12.小球撞击冰块游戏
  • RabbitMQ介绍
  • 「面试题」如何实现一个圣杯布局?
  • css的样式优先级
  • Docker: 容器互访的三种方式
  • Hexo+码云+git快速搭建免费的静态Blog
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • scala基础语法(二)
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • vue的全局变量和全局拦截请求器
  • Vue学习第二天
  • 服务器之间,相同帐号,实现免密钥登录
  • 构建工具 - 收藏集 - 掘金
  • 机器学习中为什么要做归一化normalization
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • ​业务双活的数据切换思路设计(下)
  • ![CDATA[ ]] 是什么东东
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #QT项目实战(天气预报)
  • #控制台大学课堂点名问题_课堂随机点名
  • (33)STM32——485实验笔记
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (C语言)fgets与fputs函数详解
  • (二)windows配置JDK环境
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (十) 初识 Docker file
  • (算法)Travel Information Center
  • (万字长文)Spring的核心知识尽揽其中
  • (转)程序员技术练级攻略
  • .Net CF下精确的计时器
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET Core 中插件式开发实现
  • .NET Micro Framework初体验(二)
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .NET学习教程二——.net基础定义+VS常用设置
  • .NET中两种OCR方式对比
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • @cacheable 是否缓存成功_Spring Cache缓存注解