这次比opencv快⑥倍!!!

打败opencv ,哦,是快了3倍

上回书说道,我用汇编+neon实现去畸变算法比opencv快3倍,这都不算啥,这次新增了透视变换算法,二者加起来比opencv快6倍!拭目以待吧。

  • 啥玩意是透视变换?

    相信你们都开过高级亿点的车吧,(姑且认为你们都开过832b1c22dd47a20c09d47b6c37279b4b.png)现在车上都有360全景倒车影像。你难道没有奇怪过吗?我车顶上又没装摄像头,怎么来的鸟瞰图?效果是这样式的:

854427e3937b0eb0f4a16f94242aca66.png

这玩意是怎么来的呢?那我就得给你拜持拜持了。那么直接用ps体验一把透视变换吧,你会瞬间秒懂。

3ea9c5f3c62ff00ee7b9d43b1257b604.gif

  •  数学基础

我们假使知道像素平面上的一点,那么我们根据透视变换矩阵就可以得到透视变换后的一点。

4b1030c4df75f22e7d1d514bdeec74c5.png

其中(x,y)是像素平面内的原始点,(X,Y,Z)是透视变换后的一点。那么如何求透视变换矩阵A呢?

上式是一个从二维空间到三维空间的转换,因此我们将上式展开并将(X,Y,Z)除以Z坐标得:

c3dc8c38ee0a0d6795a3e18fda9c7d05.png

其中(X’,Y’)是透视变换后像素坐标系下的点。令a33=1(a33表示缩放,这里我们不缩放),然后展开得:

3a1e30c2098bc91f5c0c476a68c3becd.png

我们从图像上找到4对点,如图1.2-1所示,透视变换即将原图上某一坐标点的像素移动到我们想要的坐标上去。比方说A点移动到A’点,BCD点同理。那么我们就将一张一般视角的图片转换为了鸟瞰图。

3a56c3365f2185a359b1f7a799d7b43f.png图1.2-1 透视变换坐标点选取

 根据上面选择出来的4对点,代入公式1.2-3中可以得到8个方程,如式1.2-4所示。其中有8个未知量,那么刚好可以求解。

e67ac31705fc4771950fa18eda1d04a1.png

对非齐次线性方程组的求解,也即对系数矩阵求逆,然后用系数矩阵的逆乘以常数项即可得未知数a11-a32,也即求得转换矩阵A。

式1.2-1是已知原图上的一点求透视变换图上的一点。但是我们在编码过程中往往都是对目标图像,这里即透视变换图像进行坐标遍历,然后将原图上对应的像素拷贝过来。那么我们只需将转换矩阵求逆。然后用转换矩阵的逆乘以目的图像的坐标,即可得原图的坐标。矩阵展开可得方程式,方便编程。

  •  OPENCV透视变换实现

opencv透视变换比较简单,只需给定原点和目标点,使用函数getPerspectiveTransform()即可获取转换矩阵。然后再调用warpPerspective()函数即可进行透视变换的操作。关键点在于4对点的选择。

7dd18c91050ab720159c9fab1f88106e.png图2-1 opencv透视变换

  • 透视变换的C代码实现


e906bf3ef66639d76ee73daa6a2fdc1b.png

d34ae156bb51a1d9b248e48e852fea04.png

70836dcd751858ab03926be2c6dbe07a.png

6c658e8982447352c112a769cca95366.png

图3-1 C语言实现透视变换

C语言实现透视变换中,主要涉及矩阵的求逆和矩阵的乘法运算。获取映射表的过程和去畸变算法中类似,利用公式将透视变换图像中的坐标点对应的原图坐标点保存下来。最后就是查表remap的过程,查表和去畸变算法中完全相同。

  • 透视变换和去畸变相结合

在opencv中,去畸变和透视变换是相互独立的函数,需要先做去畸变再做透视变换,程序流程如下:

a3c3a33d7a09c31dd798b81b5a36804d.png

图4-1 opencv去畸变、透视变换流程

 在C语言实现去畸变时,我们注意到,去畸变和透视变换最后一步查表的过程完全相同,只是表中的数据不同,那么我们能否将两张表合二为一,这样在查表时还是只需一步

dcb7530e6053976c50f27c690b0ed78b.png

图4-2 去畸变和透视变换合并计算演示

如图4-2所示,我们假定非畸变图像像素(3,2)对应畸变图像像素坐标(3,3),那么在去畸变映射表中坐标(3,2)保存数据就是(3,3)。同理,透视变换映射表中坐标(1,1)保存的是非畸变图像坐标(3,2)。那么可得,透视变换映射表中(1,1)保存的是畸变图像坐标(3,3)。这样我们只需在计算完非畸变图像映射表后再利用其值计算透视变换映射表即可。代码如下:

其中mapping_table中存储的是计算好的去畸变映射表,mapping_table_warp是透视变换映射表,也即从畸变图像到鸟瞰图的映射表。最后将mapping_table_warp拷贝到输出。

4f561252e7002331c4412a6185e41f5c.png

图4-3 利用去畸变映射表生成透视变换映射表

  • opencv和自写算法速度对比

e30e6ea5d04ade61539848978da8e260.png

图5-1 opencv和自写算法速度对比

 如图5-1所示,img_process为opencv和自写C语言算法对比。两者均处理1000张640×480图片,opencv耗时42秒,自写C语言算法耗时76秒。img_process_neon为neon加速结果。可以看到加速后的算法,速度相对自身提升了1000%以上,相对opencv提升600%以上。

c79c049b90b005a77a950f37692f56a8.gif

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

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

相关文章

数据和数据类型

一、什么是数据: 数据(date)是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未加工的原始素材。 1)数据是信息的表现形式和载体,可以是符号、文字、数字、语音、图像、视频等。数据和信息是不可分离…

TCP/UDP优化设置总结以及MTU的相关介绍

TCP/IP协议涉及到四层,从底层到上层异常为:链路层,网络层,传输层,应用层。    其中以太网(Ethernet)的数据帧在链路层    IP包在网络层    TCP或UDP包在传输层    TCP或UDP中的数据&…

Redis的七种武器及其适合的应用场景

长生剑、孔雀翎、碧玉刀、多情环、离别钩、霸王枪、拳头是古龙笔下的七种武器,而本文打算将Redis的几种使用方式 Strings、Hashs、Lists、Sets、Sorted Sets、Pub/Sub、Transactions 也比作七种武器,为大家讲解Redis的七种特性,并列举其适合的…

涂鸦的这套宠物SDK设计,真香

我应该在之前的文章里面说过,我之前创业的时候做过宠物方面的产品,而且我们当时用的是乐鑫的芯片。最近知道在涂鸦工作的朋友也在研究这方面,他给我寄了几个小板子,还有涂鸦的IOT SDK,我玩了几天,觉得真的很…

三个周年纪念日

六月二十七日,二十八日,二十九日毕业一年,抵京一年,工作一年。此刻我身处远离北京的偏僻小县……不是被发配——自己的选择。 此一年,改变了许多,坚持了许多……此一年,收获了一些,付…

sql server常用函数积累

1.LEFT(character,integer) 参数1:要截取的字符串,参数2:截取字符个数 返回从字符串左边开始指定个数的字符 2.RIGHT(character,integer) 参数1:要截取的字符串,参数2:截取字符个数 返回从字符串右边开始指…

入主 51cto

12年1月11日,入主 51CTO,记录自己的学习历程与感悟。转载于:https://blog.51cto.com/sugarlin/762038

准备 KVM 实验环境 - 每天5分钟玩转 OpenStack(3)

转载:http://cloudman.blog.51cto.com/10425448/1747415 KVM 是 OpenStack 使用最广泛的 Hypervisor,本节介绍如何搭建 KVM 实验环境 安装 KVM 上一节说了,KVM 是 2 型虚拟化,是运行在操作系统之上的,所以我们先要装一…

电子美图高清系列漫画分享给大家欣赏!

电子漫画搞电子的大家或多或少都会收集了电子漫画和表情到,小编找了一份比较全高清无码的电子美图漫画,供大家欣赏,提供下面三种下载方式!1、GitHub:https://github.com/chiphome/Electronic-Comics2、Gitee&#xff1…

如何提高网页中图片显示的用户体验(附源码下载)

文章中加入适量的图片不仅可以更好的说明和补充文章的内容,而且还可以极大的减缓阅读者在阅读较长篇幅文章时的疲劳和不安。所以图文混排较好的文章能给阅读者更好的用户体验和享受。但是令人遗憾的是很多的网页图片的显示并不十分理想,非但没有给阅读者…

plone进行 用户和权限管理

用户和权限管理 .. Contents:: .. sectnum:: :prefix: 6. 对于任何一个系统,我们都会关心它的安全性问题。我们需要控制不同的用户,在网站的不同地方,在不同的阶段,能够拥有不同的权限。Plone具有一个强大的、柔性、精细粒度的…

全开源最小电压表:24位ADC,测量0~2V,五位半

1、项目背景2015年5月份评估完十几种24位ADC后就从第一份工作岗位上离职了,做的24位AD都没有达到实际的效果,一直耽搁困扰了好久。是硬件设计的问题?还是软件开发的问题?还是24位ADC真的不咋地?还是要离职了干活就不负…

小小Table

图1 图2(加了蓝色,让问题更清楚)说明:1.工作需要要做这样一个图形(图1),而且要求不用表(table)套表(table)即一个table画出。2.素材有图表两张:(12*14),(12*13) 颜色为Red感兴趣的朋友…

文件断点续传原理与实现

文件断点续传原理与实现 在网络状况不好的情况下,对于文件的传输,我们希望能够支持可以每次传部分数据。首先从文件传输协议FTP和TFTP开始分析, FTP是基于TCP的,一般情况下建立两个连接,一个负责指令,一个负…

jvm经典文章整理

Java中JVM虚拟机详解 Java GC的那些事(上)(博主还有很多文章都很经典) CMS垃圾收集器介绍转载于:https://www.cnblogs.com/zqr99/p/10042586.html

Windows Forms、MFC、WTL、WxWidgets、Qt、GTK综合比较

图形界面库Windows Forms、 MFC、WTL、 WxWidgets、Qt、GTK 综合比较见下表: 总结: GTK主要用在X Window上,整个设计的架构和许多概念和MFC以及一般 Windows 上的程序开发大异其趣,入门门槛较高,而且最主要的特色是&am…

G3,是塔克和阿德巴约的热火队

这一场,是塔克和阿德巴约的热火队G2的比赛,波斯顿人的数据如下G3的比赛,波斯顿人的数据如下如果说田忌赛马可以用在篮球场上,那这场堪称经典热火和波斯顿人的第三场比赛,火队是客场作战,客场作战的热火在第…

微信小程序--数据存储

对本地缓存数据操作分为同步和异步两种。同步方法有成功回调函数,表示数 据处理成功后的操作。下面是小程序提供本地缓存操作接口: 以Sync结尾都是同步方法。同步方法和异步方法的区别是: 同步方法会堵塞当前任务,直到同步方法处理…

RTMPdump 源代码分析 1: main()函数

http://blog.csdn.net/leixiaohua1020/article/details/12952977 rtmpdump 是一个用来处理 RTMP 流媒体的工具包,支持 rtmp://, rtmpt://, rtmpe://, rtmpte://, and rtmps:// 等。之前在学习RTMP协议的时候,发现没有讲它源代码的,只好自己分…

H3C s5500-SI-EI系列交换机 WEB界面登录配置

配置以太网交换机VLAN 1接口的IP地址为10.153.17.82,子网掩码为255.255.255.0。 [H3C]system-view [H3C] interface vlan-interface 1 [H3C-VLAN-interface1] ip address 10.153.17.82 255.255.255.0 用户通过Console口,在以太网交换机上配置欲登录的W…