计算图⽚中的物体的实际尺⼨的⼀种⽅法
从⼀幅图像中⽆法测出物体的长度,因为缺乏参照物,但可以测出两个平⾏物体的长度⽐例。如果已知⼀个物体的实际⼤⼩(⽐如在图⽚中放上⼀枚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.

更多推荐

直线,长度,图像,物体,消隐