在python-opencv中确定相机与人/脸之间的距离

时间:2018-10-03 12:30:37

标签: python opencv computer-vision distance face-detection

关于如何计算相机和物体之间的距离的教程很多。是否可以使用OpenCV计算检测到的人与摄像机之间的大概距离?

1 个答案:

答案 0 :(得分:0)

是的,有可能。就像@hkchengrex提到的那样,将您的脸当作对象。有很多方法。我建议使用该链接后面介绍的方法SIFT Feature Matching

大致是必需的步骤:

  1. 拍摄人物照并手动测量距离。
  2. 裁剪此图片以仅包含此人。
  3. 提取图像特征(例如作为筛选描述符)
  4. 与同一个人但距离未知的另一张照片。
  5. 通过筛选匹配检测人员(请参见上面的链接)
  6. 计算这两个筛选特征向量之间的转换
  7. 将转换应用于1中测量的距离。

最好从提供的链接以及opencv中的更多SIFT教程开始。所需的方法是一种非常简单的方法,并且仅在被检查图片中的人与图片中的人非常相似的情况下才有效。对于更高级的方法,我将参考科学论文。搜索“人员检测”。

回复评论

可以测量

TL; DR 现实中身高/宽度相同但在图像中显示的较小/较大的人。

所描绘的方法在后台运行。只要他/她看起来非常相似,就可以在任何将来的图像中找到在步骤2捕获的人(=裁剪的图像)。在新图像中,它将为您提供该人所在的矩形区域。由于此矩形的尺寸现在越来越小,您可以采用这些更改来计算变换(基本上是intercept theorem),从而计算出新的距离。

这对于衡量任何人的通用方法意味着什么?

  • 如果此人的宽度/高度与步骤2中的人相同,则此过程可以完美地进行。如果它们的高度/宽度相似但不相同,则会出现计算错误。但是结果仍然可以满足您的用例。 (您可以定义一个通用人员,例如1,8m的身高和XX的宽度)。但是,SIFT在这里可能过于具体。抱歉,我只是refer you to google,看看最有效的方法。
  • 如果您的相机固定好并且录制的场景变化不大,我只需要定义一个地平面,然后用深度值手动注释投影在该平面上的每个像素。因此,您只需检测任意一个人,看看他们的脚在哪里接触地面,并查找该像素定义的深度值即可。
  • 如果用例有更高的要求,则必须以更复杂的方式测量深度。可以使用立体摄像机装置,depth sensor或通过structure from motion的图像序列来完成。

因此,OpenCV中没有“一劳永逸”的方法。它始终取决于用例,环境以及相当复杂的方法的组合。