计算图片中的物体的实际尺寸的一种方法

2024-08-25 23:08

本文主要是介绍计算图片中的物体的实际尺寸的一种方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

计算图片中的物体的实际尺寸的一种方法

标签: 图片物体尺寸测量地平线交比射影几何
  1630人阅读  评论(0)  收藏  举报
从一幅图像中无法测出物体的长度,因为缺乏参照物,但可以测出两个平行物体的长度比例。如果已知一个物体的实际大小(比如在图片中放上一枚1元硬币或者知道某个柜子有多高),那么就可以通过长度比和参照物的已知长度测出物体长度。具体方法见文献[1],因为需要一些矩阵运算和摄像头成像方面的推导,这里只大概说说原理。楼上诸位所述也是这种原理。


图像测量利用了摄像头成像也就是小孔成像的几个性质[2]:
第一,摄像头把平行的直线映射为图像上相交直线,笔直的铁轨在远处相交就是这个道理,这个交点被称为消隐点(vanish point)。可以认为平行空间直线在无穷远处相交,消隐点则是这一交点的像。所有水平的平行直线族都各自相交于无穷远处的一点,这些点构成无穷远直线,这条直线在图像上的像叫地平线。我们所居住的三维空间中存在三组相互垂直的直线(例如水平两组,x轴和y轴方向,竖直一组,z轴方向),所有x、y、z方向上的平行直线在一张图片上会分别相交于各自的一个消隐点。并且水平直线对应的两个消隐点如果连起来,连线就是地平线。测量的关键,就是要得到这些消隐点,因此有很多竖直线(如书架)或水平线(如地板砖)的图片就容易测量。

第二,摄像头把三维空间投影到二维的图像上,保持直线交比不变,交比是四个点两两“比例的比例”。所以如果在三维空间中的一条直线上有四个点,那么它们映射到图片上的四个点后,这四个点的交比不变。




文献[1]通过这些条件,给出了从图片上计算长度比的公式。通过示意图我们可以更加直观地看出它是如何工作的:


首先,假设我们已知蓝色小人Bob的身高,要求出红色小人John的身高,只需要知道两人的身高比值就可以:

我们用大写字母表示真实的坐标,随后用小写字母表示图片上的像素坐标。两人的身高比值BE/AF可以这么求:首先连接AB,然后过E点做AB的平行线交AF于点D,因为ABED是个矩形,所以要求的比值就等于AD/AF。然而,这种判断是在三维空间中做出的,当物体成像为图片,所有点的位置都会发生变化(不要问我圆头为什么会变成方头):

其中最显著的变化是平行线相交了,由此我们可以找到三个方向的消隐点,这可以通过对竖直和两组水平平行线求延长线获得:

注意我们把水平平行线对应的两个消隐点连接起来,得到了一条在(无穷)远处的直线,每个人都熟悉它,它就是地平线。地平线上所有的点都有一个性质:从其上一个点引出的所有直线都是相互水平平行的。


因此点D在图上的坐标d是这么求出的:
1. 画出地平线
2. 延长ab,交地平线于点c
3. 延长ce,交af,也就是John于点d
因为点c在无穷远处,所以cd和ca在空间中是平行直线,abed也就是上面说述真实空间中矩形ABED的像。
(转载者说明:如果cd也是水平面上一直线,那么cd和ca互相平行是正确的,但是本文中cd是不在水平面上的)
然而,知道了某些点在图像上的像,它们的实际长度比是无法直接从图上测得的,因为大家的深度不一样,这时就要利用成像前后一条直线上四个点交比不变的性质,考察红色小人John身上的三个点A、D、F以及其延长到无穷远处的点G,就可以得到(大写字母换成小写字母):
(AD/AF)/(GD/GF)=(ad/af)/(gd/gf)
因为已经求出了点d,等式右边所有的量都可以从图像上测出。等式左边的点G在真实空间是所有垂直直线的交点,这个点在无穷远,和无穷相比点F和点D的差异可以忽略不计,所以GD/GF=1,这样就得到最终结果:
AD/AF = (ad/af)/(gd/gf)

[1] Criminisi A, Reid I, Zisserman A. Single view metrology[J]. International Journal of Computer Vision, 2000, 40(2): 123-148.
[2] Hartley R, Zisserman A. Multiple view geometry in computer vision[M]. Cambridge university press, 2003.

这篇关于计算图片中的物体的实际尺寸的一种方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1106906

相关文章

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

SQL Server安装时候没有中文选项的解决方法

《SQLServer安装时候没有中文选项的解决方法》用户安装SQLServer时界面全英文,无中文选项,通过修改安装设置中的国家或地区为中文中国,重启安装程序后界面恢复中文,解决了问题,对SQLSe... 你是不是在安装SQL Server时候发现安装界面和别人不同,并且无论如何都没有中文选项?这个问题也

Java Thread中join方法使用举例详解

《JavaThread中join方法使用举例详解》JavaThread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍... 目录前言1.join()方法的定义和作用2.join()方法的三个重载版本3.join()方法的工作原

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

Spring Boot从main方法到内嵌Tomcat的全过程(自动化流程)

《SpringBoot从main方法到内嵌Tomcat的全过程(自动化流程)》SpringBoot启动始于main方法,创建SpringApplication实例,初始化上下文,准备环境,刷新容器并... 目录1. 入口:main方法2. SpringApplication初始化2.1 构造阶段3. 运行阶

Olingo分析和实践之ODataImpl详细分析(重要方法详解)

《Olingo分析和实践之ODataImpl详细分析(重要方法详解)》ODataImpl.java是ApacheOlingoOData框架的核心工厂类,负责创建序列化器、反序列化器和处理器等组件,... 目录概述主要职责类结构与继承关系核心功能分析1. 序列化器管理2. 反序列化器管理3. 处理器管理重要方

Python错误AttributeError: 'NoneType' object has no attribute问题的彻底解决方法

《Python错误AttributeError:NoneTypeobjecthasnoattribute问题的彻底解决方法》在Python项目开发和调试过程中,经常会碰到这样一个异常信息... 目录问题背景与概述错误解读:AttributeError: 'NoneType' object has no at

postgresql使用UUID函数的方法

《postgresql使用UUID函数的方法》本文给大家介绍postgresql使用UUID函数的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录PostgreSQL有两种生成uuid的方法。可以先通过sql查看是否已安装扩展函数,和可以安装的扩展函数

Java中Arrays类和Collections类常用方法示例详解

《Java中Arrays类和Collections类常用方法示例详解》本文总结了Java中Arrays和Collections类的常用方法,涵盖数组填充、排序、搜索、复制、列表转换等操作,帮助开发者高... 目录Arrays.fill()相关用法Arrays.toString()Arrays.sort()A

Nginx安全防护的多种方法

《Nginx安全防护的多种方法》在生产环境中,需要隐藏Nginx的版本号,以避免泄漏Nginx的版本,使攻击者不能针对特定版本进行攻击,下面就来介绍一下Nginx安全防护的方法,感兴趣的可以了解一下... 目录核心安全配置1.编译安装 Nginx2.隐藏版本号3.限制危险请求方法4.请求限制(CC攻击防御)