在阅读本文之前,应该先阅读朱葛峻的《逆透视变换的一种方法》(下简称《方法》),本文的实现是基于这篇文章的推导的。
本文中提到的方法主要用于智能车竞赛。虽然在智能车有限的视野和像素内,这种方法有时并不是一种很好的选择。

目录

  • 一、基本理论
  • 二、实现原理
  • 三、代码实现

一、基本理论

在谈逆透视变换之前,我们先谈一下真实世界和智能车上安装的摄像头所获取的照片的关系。世界坐标系下的点要经历平移变换、旋转变换、缩放变换、投影变换而得到摄像头坐标系下的点。前三种变换都是一一映射的变换,即原坐标下的点唯一对应新坐标下的点。只要知道规则,逆变换就可以完成。
投影变换不是一一映射的变换。如图,B,C两点在以A点为投影点的变换中落到了屏上同一点。B,C因为缺少深度的信息,在逆变换中无法区分。
在智能车的应用场景中,所有点都在地面,即Z=0。就是说,深度信息没有丢失,所以逆透视变换是可以完成的。

如下图,一张矩形的由摄像头获得的照片,在逆透视变换后变换成了倒梯形,而蓝色阴影所表示的道路则通过变换呈现出俯视图的样子。

二、实现原理

在下面的推导中,二维平面内的坐标点会用三维的列向量表示。x,yx,yx,y为摄像头坐标系内点的坐标。X,YX,YX,Y为世界坐标系内点的坐标。
[xyw]与[x/wy/w1]\begin{bmatrix}x\\y\\w\end{bmatrix}与\begin{bmatrix}x/w\\y/w\\1\end{bmatrix}⎣⎡​xyw​⎦⎤​与⎣⎡​x/wy/w1​⎦⎤​表示同一个点。
按照小孔摄像机的数学模型,有
[x‾y‾s‾]=[fx0cx0fycy001][r11r12r13t1r21r22r23t2r31r32r33t3][XY01]\begin{bmatrix}\overline{x}\\\overline{y}\\\overline{s}\end{bmatrix}=\begin{bmatrix} f_x&0&c_x\\0&f_y&c_y\\0&0&1\end{bmatrix}\begin{bmatrix} r_{11}&r_{12}&r_{13}&t_1\\ r_{21}&r_{22}&r_{23}&t_2\\ r_{31}&r_{32}&r_{33}&t_3 \end{bmatrix}\begin{bmatrix}X\\ Y\\ 0\\ 1\end{bmatrix}⎣⎡​xy​s​⎦⎤​=⎣⎡​fx​00​0fy​0​cx​cy​1​⎦⎤​⎣⎡​r11​r21​r31​​r12​r22​r32​​r13​r23​r33​​t1​t2​t3​​⎦⎤​⎣⎢⎢⎡​XY01​⎦⎥⎥⎤​
化简得
[x‾y‾s‾]=[H11H12H12H21H22H23H31H321][XY1]\begin{bmatrix}\overline{x}\\\overline{y}\\\overline{s}\end{bmatrix}=\begin{bmatrix} H_{11}&H_{12}&H_{12}\\H_{21}&H_{22}&H_{23}\\H_{31}&H_{32}&1\end{bmatrix}\begin{bmatrix}X\\ Y\\ 1\end{bmatrix} ⎣⎡​xy​s​⎦⎤​=⎣⎡​H11​H21​H31​​H12​H22​H32​​H12​H23​1​⎦⎤​⎣⎡​XY1​⎦⎤​
令H=[H11H12H12H21H22H23H31H321]H=\begin{bmatrix} H_{11}&H_{12}&H_{12}\\H_{21}&H_{22}&H_{23}\\H_{31}&H_{32}&1\end{bmatrix}H=⎣⎡​H11​H21​H31​​H12​H22​H32​​H12​H23​1​⎦⎤​,HHH的逆为HdH_dHd​,
Hd=[Hd11Hd12Hd12Hd21Hd22Hd23Hd31Hd321]H_d=\begin{bmatrix} H_{d11}&H_{d12}&H_{d12}\\H_{d21}&H_{d22}&H_{d23}\\H_{d31}&H_{d32}&1\end{bmatrix}Hd​=⎣⎡​Hd11​Hd21​Hd31​​Hd12​Hd22​Hd32​​Hd12​Hd23​1​⎦⎤​

[X‾Y‾S‾]=[Hd11Hd12Hd12Hd21Hd22Hd23Hd31Hd321][xy1]\begin{bmatrix}\overline{X}\\\overline{Y}\\\overline{S}\end{bmatrix}=\begin{bmatrix} H_{d11}&H_{d12}&H_{d12}\\H_{d21}&H_{d22}&H_{d23}\\H_{d31}&H_{d32}&1\end{bmatrix}\begin{bmatrix}x\\ y\\ 1\end{bmatrix} ⎣⎡​XYS​⎦⎤​=⎣⎡​Hd11​Hd21​Hd31​​Hd12​Hd22​Hd32​​Hd12​Hd23​1​⎦⎤​⎣⎡​xy1​⎦⎤​
于是有了变换公式
X=X‾S‾=Hd11x+Hd12y+Hd13Hd31x+Hd32y+Hd33X=\frac{\overline{X}}{\overline{S}}=\frac{H_{d11}x+H_{d12}y+H_{d13}}{H_{d31}x+H_{d32}y+H_{d33}} X=SX​=Hd31​x+Hd32​y+Hd33​Hd11​x+Hd12​y+Hd13​​
Y=Y‾S‾=Hd21x+Hd22y+Hd23Hd31x+Hd32y+Hd33Y=\frac{\overline{Y}}{\overline{S}}=\frac{H_{d21}x+H_{d22}y+H_{d23}}{H_{d31}x+H_{d32}y+H_{d33}} Y=SY​=Hd31​x+Hd32​y+Hd33​Hd21​x+Hd22​y+Hd23​​

HHH和HdH_dHd​的推导,贴出《方法》中的原公式。


要想方程组有唯一解,需要带入四个点在世界坐标系和摄像头坐标系的坐标。可以参考第一部分中的示意图。
注意在实际操作中,x,y,X,Yx,y,X,Yx,y,X,Y可以直接使用从零开始、从左至右、从上到下增加的像素坐标。还要注意x,Xx,Xx,X是纵坐标,y,Yy,Yy,Y是横坐标。

三、代码实现

下面的matlab代码,用来计算HHH和HdH_dHd​。

x=[30,30,119,119]  % 依次为A、B、D、C在摄像头获取的照片中的的纵坐标
y=[0,187,0,187] % 依次为A、B、D、C在摄像头获取的照片中的的横坐标
X=[4000,4000,5465,5465]  % 依次为A、B、D、C在逆透视变换后的照片中的的纵坐标
Y=[3000,5720,4132,4580] % 依次为A、B、D、C在逆透视变换后的照片中的的纵坐标A = [X(1),Y(1),1,0,0,0,-x(1)*X(1),-x(1)*Y(1);0,0,0,X(1),Y(1),1,-y(1)*X(1),-y(1)*Y(1);X(2),Y(2),1,0,0,0,-x(2)*X(2),-x(2)*Y(2);0,0,0,X(2),Y(2),1,-y(2)*X(2),-y(2)*Y(2);X(3),Y(3),1,0,0,0,-x(3)*X(3),-x(3)*Y(3);0,0,0,X(3),Y(3),1,-y(3)*X(3),-y(3)*Y(3);X(4),Y(4),1,0,0,0,-x(4)*X(4),-x(4)*Y(4);0,0,0,X(4),Y(4),1,-y(4)*X(4),-y(4)*Y(4)];
B = [x(1);y(1);x(2);y(2);x(3);y(3);x(4);y(4)];H=A\B;  % 求解H11到H18
H=H'  % 把列向量改成行向量
H=[H,1]  % 获得完整的H的行向量H11 =H(1);H12 =H(2); H13 =H(3); H21 =H(4); H22 =H(5); H23 =H(6); H31 =H(7); H32 =H(8); H33=H(9);
H=[H11,H12,H13;H21,H22,H23;H31,H32,H33]  % 获得完整的H的矩阵
Hd=inv(H)  % 获得Hd矩阵fprintf("[[%f, %f, %f], [%f, %f, %f], [%f, %f, %f]]",Hd(1,1),Hd(1,2),Hd(1,3),Hd(2,1),Hd(2,2),Hd(2,3),Hd(3,1),Hd(3,2),Hd(3,3));  % 把Hd矩阵以符合python列表的形式输出
def process(self,img):img = np.array(img)height = 10000  # 高度限制width = 8000  # 宽度限制output = np.full((height, width), 0, dtype=np.int)Hd=[[1075.629450, 0.000000, -19146.217384], [814.163487, 47.718786, -14582.905023], [0.186940, 0.000000, -2.327535]]#  这里把刚从matlab那里得到的for x in range(img.shape[0]):for y in range(img.shape[1]):X = round((x * Hd[0][0] + y * Hd[0][1] + Hd[0][2]) / (x * Hd[2][0] + y * Hd[2][1] + Hd[2][2]))Y = round((x * Hd[1][0] + y * Hd[1][1] + Hd[1][2]) / (x * Hd[2][0] + y * Hd[2][1] + Hd[2][2]))# 注意由于python的索引从0开始计数,这里的索引和公式里略有差别if X>=height:X = height-1if X<0:X=0if Y >= width:Y = width-1if Y<0:Y=0output[X,Y]=img[x,y]return output

效果展示如下。
原图:
逆透视变换后(因为没有填充,需要放大看):

智能车竞赛逆透视变换(含编程实现)相关推荐

  1. 百度智能车竞赛丝绸之路1——智能车设计与编程实现控制

    百度智能车竞赛丝绸之路1--智能车设计与编程实现控制 百度智能车竞赛丝绸之路2--手柄控制 一.项目简介 本项目现已基于鲸鱼机器人开发套件对其整体外形进行设计,并且对应于实习内容--以"丝绸 ...

  2. 智能车竞赛技术报告 | 智能车视觉 - 新余学院 - 开放艺术队

    简 介: 该智能车设计以 32位的 RT1064微控制器作为控制单元,通过 MT9V034数字摄像头传感器采集赛道信息,将采集到的图像进行处理:通过 OpenARTmini模块部署神经网络识别图像:另 ...

  3. 智能车竞赛技术报告 | 智能车视觉 - 上海大学 - 猫耳麻花

    简 介: 本文设计的智能车系统以NXP RT1064微控制器为核心控制单元,通过车体前方的摄像头检测赛道信息:通过齿轮编码器检测模型车的实时速度,使用PID 控制算法调节驱动左右电机的转速,PD算法控 ...

  4. 智能车竞赛技术报告 | 智能车视觉 - 山东大学(威海) - 山魂五队

    简 介: 本文详细介绍了山东大学(威海)山魂五队在第十六届"恩智浦"杯全国大学生智能汽车竞赛智能视觉组中的系统方案,包括硬件电路设计.机械结构设计.巡线算法以及识别算法的设计等.本 ...

  5. 智能车竞赛技术报告 | 全向行进组 - 沈阳工业大学 - 找不到北队

    简 介: 本文设计的智能车系统以沁恒CH32V103R微控制器为核心控制单元,通过车体上方摄像头以及车体前方的电磁传感器检测赛道信息:通过1024线迷你正交解码编码器检测模型车的实时速度,反馈给微控制 ...

  6. 智能车竞赛技术报告 | 智能视觉组 - 北京科技大学智能视觉组

    简 介: 本文设计的智能车系统以 为核心控制单元,通过CMOS摄像头检测赛道信息,使用数字摄像头采集赛道的灰度图,通过动态阈值算法生成二值化图像数组,提取黑色引导线,用于赛道识别:通过光电编码器检测模 ...

  7. 无刷电机驱动复习--智能车竞赛极速越野组复盘(1)

    本篇博文的主要目的一方面是为我之后的答辩提供参考,另一方面是为现在正在参加智能车竞赛的同学们提供一个参考.首先先对无刷电机进行介绍,然后会讲一讲具体的驱动原理,最后讲一讲其他的驱动方式.语言方面可能不 ...

  8. 整理第十六届全国大学智能车竞赛比赛数据

    简 介: 整理提交了第十六届全国大学生智能车总决赛的数据. 关键词: 智能车竞赛,总决赛 #mermaid-svg-QA3wJFTY8KGVWeUO {font-family:"trebuc ...

  9. 智能车竞赛接入工程训练竞赛相关事项-建议稿件

    简 介: 对于智能车竞赛与工训竞赛在教指委指导下完成相互结合方面进行初步的规划. 关键词: 智能车竞赛,工训竞赛 §01 背景介绍 一.全国大学生智能车竞赛   全国大学生 智能车竞赛 最初是由教育部 ...

最新文章

  1. SQL Server 2012 sa 用户登录 18456 错误
  2. 数据结构之排序算法(C语言)
  3. 代码也浪漫:用Python放一场烟花秀!
  4. 解题报告——2017年C/C++ A组第五题 字母组串(递归)
  5. Chrome开发者工具一个有用的快捷键组合:Ctrl+Shift+E
  6. 基于HBase+ ElasticSearch的海量交通数据实时存取方案设计
  7. Enterprise Library v5.0 -- Data Access Application Block 开发向导(3)
  8. 虚拟化软件Xen的简单应用
  9. 怎么把python添加到path_如何将python的路径加到path中
  10. 案例学习BlazeDS+Spring之九Company Manager
  11. matlab查看RGB图像矩阵数值
  12. 【转】CCScale9Sprite和CCControlButton
  13. 100个Java实战项目视频+代码+笔记
  14. 电信wifi服务器不响应,电信老员工告诉你,为什么你家WiFi信号满格却上不了网?...
  15. Excel ----- 身份证自动判断男女 公式
  16. 文件上传 webshell 各类型 一句话木马 图片马 制作 教程
  17. RGB565 与RGB888的区别
  18. 20句黑客经典语录,一个黑客的内心独白
  19. 利用python爬取租房信息_Python爬虫实战(1)-爬取“房天下”租房信息(超详细)
  20. Uniapp、Vue搭建浙里办微应用(单点登录、埋点)

热门文章

  1. Surface RT已死,有事烧Zune
  2. 网络安全之认识挖矿木马
  3. 仿淘宝图片空间 点击文字 出现可编辑文本框 提交ajax数据到后台修改
  4. 爬虫入门—爬虫简介简单爬虫例子练习
  5. C# 将应用程序通过注册表设置开机启动项
  6. 几分钟私人定制APP全攻略!!
  7. Qt之创建桌面和开始菜单快捷方式
  8. 计算机文字录入ppt,计算机基础—文字录入.ppt
  9. CentOS7安装OpenStack(Rocky版)-06.安装Neutron网络服务(控制节点)
  10. python的scapy_scapy-python