透视形变及其校准的方法
透视形变(perspective distortion)描述的是,同样大小的物体,离镜头越近的物体看起来更大,反之看起来越小,如下两图所示。这种效果不自觉地被拍照者所使用,以拍出不一样的感觉。在近距离拍摄时,广角镜头的这种透视效果尤为明显,
而超过了一定的拍摄距离,透视形变则主要由距离主导——在同一距离,拍摄同一场景,无论用什么镜头,拍到的透视变形都是完全相同的。
人脑看到这样的场景时,自然而然的知道这些是透视形变,也在潜意识里强调,一条马路一般宽度相等,一辆列车,车门大小都是相同的,并且以此确定物体之间的相对距离。
原本平行的两条马路边线,在成像中不再平行,两者会有一个汇聚的点,称为“灭点”。
与透视形变相对的校正方法是图像处理中的几何空间校正,具体来说是映射变换(projective transformation)也叫平面单应(planar homography)。接下来的内容参考这篇博文,也是在学习加上看文献的理解。
简写为:
单应性矩阵有8个自由度,需要4组点,8个方程进行求解。解方程还是比较复杂的,很多博文都提到了如下矩阵:
并且在几年前有研究者尝试通过求逆矩阵解方程的方法求解单应性矩阵,并且实现图像的投射,并且达到了不错的效果,但是,执行效率非常低。使用matlab或opencv封装好的函数会好很多。以OPENCV为例,对于200万像素彩色图片,求逆矩阵的时间大约是0.4us,投射变换的时间是14ms,基本可以做到实时,而如果是灰度图像,变换时间可以压缩到4ms以内,再运行其他复杂算法完全不在话下。
先贴代码了,具体介绍就放在注释里。
import cv2 import numpy as np import matplotlib.pyplot as plt import timeimg = cv2.imread('shusongdai.jpg') img = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY) m,n = img.shape plt.figure() #plt.subplots(121) # 这里不使用subplot是因为显示会崩,具体原因不清楚 plt.imshow(img,cmap='gray') # 不加,cmap='gray'的话,显示是黄绿色的。。 #plt.imshow(img) # 得到点击位置 pos = plt.ginput(4)inputpos = np.float32(np.array(pos)) print('input pos:',inputpos) # 鼠标在图片中选择四个点 width = np.sqrt(np.square(inputpos[3,0]-inputpos[2,0])+np.square(inputpos[3,1]-inputpos[2,1]) ) hight = np.sqrt(np.square(inputpos[2,1]-inputpos[0,1])+np.square(inputpos[0,0]-inputpos[2,0]) ) print(width,hight) # 以左侧两点和底边的实际像素数为高和宽,作为投影后的画布 canvaspoints = np.float32([[0,0],[width,0],[0,hight],[width,hight]]) start = time.perf_counter() perspectiveMatrix = cv2.getPerspectiveTransform(inputpos,np.array(canvaspoints) ) end = time.perf_counter() print("获取转换矩阵耗时:%s Seconds"%(end-start)) # print(perspectiveMatrix) start = time.perf_counter() perspectiveImg = cv2.warpPerspective(img,perspectiveMatrix,(width,hight)) end = time.perf_counter() print("投射变换耗时:%s Seconds"%(end-start)) # plt.subplots(122) plt.figure() plt.imshow(perspectiveImg,cmap='gray') plt.show()
透视形变及其校准的方法相关推荐
- 鸿合怎么删掉linux6_鸿合电子白板怎么校准?鸿合电子白板校准的方法
鸿合电子白板是一款配合鸿合交互平板使用的教学辅助工具,支持手写的功能,那你知道鸿合电子白板怎么校准的吗?接下来我们一起往下看看鸿合电子白板校准的方法吧. 方法步骤 1.电脑右下角找到白板图标,右键点击 ...
- 罗斯蒙特Rosemount智能变送器现场校准的方法
罗斯蒙特Rosemount的差压变送器在各行业应用广泛,精确度高,但在使用过程中会因为各类因素影响,对其准确性都会有一定的干扰作用,所以定期进行校准和检查是维护事项重点之一.之前介绍过Rosemoun ...
- excel数据透视_取消透视Excel数据的快速方法
excel数据透视 Before you can build a flexible pivot table, you might need to rearrange the data. For exa ...
- Halcon学习笔记02——透视形变的车牌识别
1程序流程 整体流程如下图所示: 首先通过RGB→HSV在颜色空间进行Blob分析提取车牌区域,提取区域如下图所示: 可以发现图片出现了透视变换,由于拍摄视角未正视车牌,因此矩形的车牌变成了斜四边形. ...
- 移动机器人里程计校准的方法
里程计系统误差的三个主要来源为"左右轮实际直径与标称直径的偏差","左右轮实际间距与标称间距的偏差"和"两轮子直径的实际平均值与标称平均值不相等&qu ...
- Opencv实现透视形变
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 计算机视觉现在很流行,世界各地的人们都在从事某种形式的基于深度学习 ...
- 颜色错位HP CM1312nfi MFP打印机 CM1015 1017 CM1312 CP1518等彩色激光打印机颜色校准步骤方法
当彩色打印的时候,出现打印有重影,颜色错位,不能重合在一起的时候.可以进行颜色校准改善颜色错位的问题 但一般可能是因为硒鼓已经用太久,选择更换吧.再生硒鼓加粉3次以上,基本都很多问题了. HP CM1 ...
- Oracle 中实现数据透视表的几种方法
文章目录 使用 CASE 表达式实现数据透视表 使用 PIVOT 子句实现数据透视表 使用 MODEL 子句实现数据透视表 大家好,我是只谈技术不剪发的 Tony 老师.数据透视表(Pivot Tab ...
- linux 校准时间方法
Debian.Ubuntu 系统安装NTP校时包: apt-get install ntpdate CentOS系统安装NTP校时包: yum install ntp 校时命令: ntpdate ...
最新文章
- java重新执行_(转载)java线程 - 线程唤醒后并被执行时,是在上次阻塞的代码行重新往下执行,而不是从头开始执行...
- Redis的存储(实现)原理
- ASP.NET Core快速入门(第4章:ASP.NET Core HTTP介绍)--学习笔记
- 剑指offer——5.替换空格
- Makefile系列之五 :函数
- mysql 重建注册_mysql 重建帐号
- 【关系抽取】从文本中进行关系抽取的几种不同的方法
- PyTorch学习—13.优化器optimizer的概念及常用优化器
- 最痛苦的一周——第三周作业Collinear
- php常用数组,php常用数组函数
- 联想 m73 黑苹果 软路由 esxi AIO
- vue 统计中英文字符串长度_计算字符串长度以及截取字符串长度(英文占1个字符,中文汉字占2个字符)...
- Jumping NLP Curves: A review of NLP research (翻译)
- ORA-1628: max # extents 32765 reached for rollback segment 错误处理
- WINCC的SQL应用,无需修改任何源码
- Python 类的定制
- Vue双向绑定:原理篇(详细)
- 【锁机制】MySQL锁机制
- Android指南针应用
- qmake:变量手册
热门文章
- 详细解读ORBSLAM中的描述子提取过程
- 计算机ip配置不正确怎么办,电脑ip地址不对该怎么办
- 排序系统 c语言程序设计,c语言程序设计(排序算法).doc
- html4 form日期,bootstrap4日期时间选择器插件
- three相机在模型上_一步步带你实现web全景看房——three.js
- wildfly10 配置mysql_WildFly配置MySql驅動
- python高性能_Python高性能分布式执行框架-Ray
- MySQL-数据类型 整理总结
- confluence启动不起来_“一键启动”只能点火?还有这5个“隐藏”功能,你都知道吗?...
- 定义域可以写成不等式吗_高一数学第一次月考考点之抽象函数定义域详解