经过在下调研了利用手机摄像头智能测距,半个月断断续续得出几个方法,附上两个demo,然而东西都比较垃圾,比起人们想要的,差距十万八千里。
为了科技的进步,我就自不量力地抛砖引玉了,希望能有大牛阅读到这篇博客的时候,能给我一些指导,不胜感激。
方法一: 由针孔摄像头推导结果。多次测量取像素因子法。
这是一位叫张拭心朋友的做法,然后他的理论依据,算法都没有介绍,也不知道来自哪里。经过询问他本人也没有给出回答。代码是已知了高度求距离,或者已知了距离求高度。
以下公式是我从他的代码里读出来的:
D = Th/(|sh-y*2|)*(Dx)^2
H = TD*|sh-y*2|/(Dx)^2
D:distance 距离
H: Height 高度
Th: targetHeight 目标高度
Sh:screenHeight 手机屏幕高度
y:手指在屏幕上的y值
Dx:像素因子,误差因子 (默认34)
上面的公式理论基础是针孔摄像头成像算法(我猜的,因为看针孔成像算法,好像有点类似)。然后缺少推导过程的公式,无法判断准确性。摄像头的参数用 (Dx)^2代表。仅可参看,不可当真。希望有读者大大能给我教教真正的做法,谢谢。
附上demo demo不是我写的,但我是穷逼,要1个积分。
方法二:三角函数法
如图所示,利用三角函数,得出公式,物体的高度H = h((tan(a)+tan(b)))/tan(b)
h代表的是 地面到摄像头中心的距离。可以根据摄像头摆放的位置测量而出。
摄像头到物体的距离 D = h/tanB
上半部分的高度 H1 = D*tanA
物体的总高度 H = H1+h
所以 H = h/tanB*tanA+h
= h*tanA/tanB + h*tanB/tanB
= h*(tanA+tanB)/tanB
可是我听说,计算tanA和tanB需要根据手机成像后的像素弧度来得出,目前,我不具备这样的水平,需要对摄像头和像素有一定的了解。有谁能告诉我 角A和角B如何求出来?
拍照时的要求是:需要被测物体和相机在同一水平面,否则计算需要更复杂的方式。
方法三:参照物法
参照物法测量更准确,但是测量步骤较复杂。
1. 拍照的时候,必须有一个已知高度的参照物
2. 将参照物和被测物体放置在同一水平面上。
3. 相机垂直 参照物和被测物之间的连
4. 拍照之后,需要在屏幕上手动设置参照物的高度连线,被测物的高度连线。
参照物法更准确,因为不涉及手机摄像头的参数,以及像素因子,但测量步骤较繁琐。
附上大牛的demo,当然demo也不是我写的,但本人真的是穷逼,要1个积分
三种方法对比及结论:
第一种方法,如果能多次测量,得出最准确的像素因子,则是最方便的测量方式。然后公式推导过程需要有理论的支持。(目前尚未找到相关文献)。
第二种方法,难度在于像素弧度计算tanA和tanB。 目前个人技术达不到,如果有能精确计算像素弧度,成像角度,则可行。
第三种方法:操作繁琐,编程相对容易,从技术角度而言,完全可行。