对整个图像进行透视变换
对整个图像进行透视变换
- 透视变换
- 解决方案
常见的教程都是对所选的四个点内部的区域进行透视变换,但是其他区域都被裁剪掉了。如何利用所选的局部区域对整个图像进行透视变换?
透视变换
透视变换的算法:OpenCV文档
dst(x,y)=src(M11x+M12y+M13M31x+M32y+M33,M21x+M22y+M23M31x+M32y+M33)\texttt{dst} (x,y) = \texttt{src} \left ( \frac{M_{11} x + M_{12} y + M_{13}}{M_{31} x + M_{32} y + M_{33}} , \frac{M_{21} x + M_{22} y + M_{23}}{M_{31} x + M_{32} y + M_{33}} \right ) dst(x,y)=src(M31x+M32y+M33M11x+M12y+M13,M31x+M32y+M33M21x+M22y+M23)
推导过程:
通过getPerspectiveTransform()
函数得到一个线性变换的矩阵MMM,随后的透视变换过程如下
[x′y′z′]=[M11M12M13M21M22M23M31M321][xy1]\begin{bmatrix} x' \\ y' \\ z' \end{bmatrix} = \begin{bmatrix} M_{11} & M_{12} & M_{13} \\ M_{21} & M_{22} & M_{23} \\ M_{31} & M_{32} & 1 \\ \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} ⎣⎡x′y′z′⎦⎤=⎣⎡M11M21M31M12M22M32M13M231⎦⎤⎣⎡xy1⎦⎤
由于原始图像中没有zzz轴上的维度,所以设置为1,但经过变换后的图像上的z′z'z′不为1,所以将其归一化,得到
[x′′y′′1]=1z′[x′y′z′]\begin{bmatrix} x'' \\ y'' \\ 1 \end{bmatrix} = \frac{1}{z'} \begin{bmatrix} x' \\ y' \\ z' \end{bmatrix} ⎣⎡x′′y′′1⎦⎤=z′1⎣⎡x′y′z′⎦⎤
也就得到了OpenCV的公式
解决方案
解决方案参考:Stack Overflow的方案
被裁剪的原因是因为经过变换的坐标变换到了画布范围之外,因此需要确定新画布的大小,并将变换后的图像平移到画布内。
透视变换的矩阵记作M,格式如下:
[M11M12M13M21M22M23M31M321]\begin{bmatrix} M_{11} & M_{12} & M_{13} \\ M_{21} & M_{22} & M_{23} \\ M_{31} & M_{32} & 1 \\ \end{bmatrix} ⎣⎡M11M21M31M12M22M32M13M231⎦⎤
设原始图片的四角分别为
(0,0) ________ (0, w)| ||________|
(h,0) (h,w)
只要对四角进行变换,就可以确定新画布的边界。
首先坐标点写作矩阵的形式,三行分别代表x,y,zx,y,zx,y,z轴坐标
P=[0ww000hh1111]P = \begin{bmatrix} 0 & w & w & 0 \\ 0 & 0 & h & h \\ 1 & 1 & 1 & 1 \end{bmatrix} P=⎣⎡001w01wh10h1⎦⎤
类似地,P′=MPP'=MPP′=MP,并将P′P'P′的各列除以各列的最后一行的那个元素进行归一化,得到P′′P''P′′
P′′=[p11p12p13p14p21p22p23p241111]P'' = \begin{bmatrix} p_{11} & p_{12} & p_{13} & p_{14} \\ p_{21} & p_{22} & p_{23} & p_{24} \\ 1 & 1 & 1 & 1 \end{bmatrix} P′′=⎣⎡p11p211p12p221p13p231p14p241⎦⎤
获取xxx上的(第一行)最大最小值xmin,xmaxx_{min}, x_{max}xmin,xmax
获取yyy上的(第一行)最大最小值ymin,ymaxy_{min}, y_{max}ymin,ymax
Δx=xmax−xmin,Δy=ymax−ymin\Delta x= x_{max}-x_{min},\Delta y= y_{max}-y_{min}Δx=xmax−xmin,Δy=ymax−ymin即为新画布的宽和高。
(以上都是基于Stack Overflow上的回答所写,但正如其中的评论所述,第四步存在错误,但评论也表述不太清楚,在此详细分析一下)
为了进一步将变换后的图像平移到画布内,已知了透视变换是通过MMM乘以坐标进行的,可以对MMM进行更改来加入平移操作。
创建单位矩阵,并在第三列放入矩阵P′′P''P′′对应行的最小值的负值,称为矩阵TTT:
T=[10−xmin01−ymin001]T= \begin{bmatrix} 1 & 0 & -x_{min}\\ 0 & 1 & -y_{min} \\ 0 & 0 & 1 \end{bmatrix} T=⎣⎡100010−xmin−ymin1⎦⎤
则新的变换矩阵M′=TMM'=TMM′=TM。可以简单验证一下,将M′M'M′与坐标相乘并展开,可以发现刚好得到
[x′′′y′′′1]=[x′′−xminy′′−ymin1]\begin{bmatrix} x''' \\ y''' \\ 1 \end{bmatrix}= \begin{bmatrix} x''-x_{min} \\ y''-y_{min} \\ 1 \end{bmatrix} ⎣⎡x′′′y′′′1⎦⎤=⎣⎡x′′−xminy′′−ymin1⎦⎤
因此最后的透视变换的参数为:
warpPerspective(src=src, M=M', dsize=(delta_x, delta_y))
对整个图像进行透视变换相关推荐
- OpenCV 分割斜体文字(包括旋转,垂直投影,水平投影,透视变换等)
一,原图 二,分割成行 三,通过旋转,切割后的效果(无透视变换) 四,通过旋转,透视变换,切割后的效果 五,源代码, //初始化透视变换全局变量 Mat warpMatrix;//计算透视变换矩阵 v ...
- 基于c语言矩阵数组透视变换,一种图像透视变换方法与流程
本发明属于图像处理的技术领域,尤其涉及一种图像透视变换方法. 背景技术: 透视变换是一种常见图像处理方法.透视变换常用于图象的校正,例如在移动机器人视觉导航研究中,由于摄像机与地面之间有一倾斜角,而不 ...
- OCR文本扫描 轮廓检测 透视变换
OCR文本扫描项目实战(图像预处理,调用pytesseract.image_to_string()完成文本识别) 本项目和源代码来自唐宇迪opencv项目实战 本文是一篇OCR文本扫描项目实战的学习笔 ...
- 文档扫描仪的构建——使用Python,OpenCV应用透视变换来获得图像的自顶向下的“鸟瞰图”
使用Python,OpenCV应用透视变换来获得图像的自顶向下的"鸟瞰图" 1. 效果图 2. 应用透视变换的步骤 3. 优化:矩形角点的获取 4. 源码 参考 这篇博客演示了如何 ...
- 基于自适应逆透视变换的车道线SLAM
公众号致力于分享点云处理,SLAM,三维视觉,高精地图相关的文章与技术,欢迎各位加入我们,一起每交流一起进步,有兴趣的可联系微信:920177957.本文来自点云PCL博主的分享,未经作者允许请勿转载 ...
- OpenCV中的透视变换介绍
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 透视变换原理 透视变换是将图像从一个视 ...
- 【OpenCV 4开发详解】图像透视变换
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...
- 【图像处理】透视变换 Perspective Transformation
透视变换(Perspective Transformation)是将图片投影到一个新的视平面(Viewing Plane),也称作投影映射(Projective Mapping).通用的变换公式为: ...
- Duanxx的图像处理学习: 透视变换(一)
当人用眼睛看事物的时候,会感觉到近处的东西是比远处的东西要大一些的,通俗的说,这就是透视. 总的来说.透视变换是将3D的世界转换到2D图像上的一种手段,人的视觉系统和摄像头视觉系统也是基于这一工作原理 ...
最新文章
- python输入字母判断大小写_Python-检查输入的数字、大写字母、小写字母和特殊字符...
- windows下安装redis以及一些常规操作
- vc60如何输入c语言,vc60中如何编译运行及调试c语言程序.pdf
- POJ-3281 Dining 网络流最大流
- QT练习9 Dialog学习
- 你要知道的开源地理空间软件10件事
- 产品经理经验谈:与产品经理有关的100件小事儿~
- day35-mysql之表的详细操作
- 基于Docker快速搭建ELK
- vue2.x-cnode(vue全家桶)
- Python List sort方法无效
- 蓝牙小钢炮 - Bose 博士 Revolve 蓝牙音箱使用感受
- 计算机专业实习心得,计算机毕业实习心得体会范本5篇
- Django setting ALLOWED_HOSTS
- Zookeeper分布式锁解决羊群效应的方案
- bgp状态idle什么原因_BGP - 2,BGP报文和BGP状态(转)
- Redis 帝国的神秘使者,竟然想改造 C 语言!
- C# textbox快捷键添加横杠
- H3C交换机常用命令(初学)
- Sa函数 与 sinc函数
热门文章
- Redis学习之mget命令
- 软件测试人员会被替代吗?IT行业哪个方向的前景最好?字节12年测开是这样说的
- python爬取豆瓣排名前250部电影封面
- PyTorch实战1——预测未来某地区租赁单车的使用情况
- Ocrking图片识别之Java实现本地验证码的识别
- 方法(Methods)
- HDOJ/HDU 1133 Buy the Ticket(数论~卡特兰数~大数~)
- org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jsp/jstl/core cannot be re
- 2022.1.20国产蓝牙AOA高精度定位厂家开放华东上海和华北北京的FAE岗位招聘欢迎行业内部推荐
- 微信公众号---报名系统