【问题标题】:how can i measure distance of an detected object from camera in video using opencv?如何使用opencv测量视频中检测到的物体与摄像头的距离?
【发布时间】:2012-08-01 04:31:39
【问题描述】:

我只知道视频中对象的高度和宽度。有人可以指导我使用 c 或 c++ 计算检测到的物体与视频中相机的距离吗?有什么算法或公式可以做到这一点吗? 提前致谢

【问题讨论】:

  • 你必须校准你的相机 - 将物体放在距离相机 50 厘米的地方,然后检查你的物体测量了多少像素的图片 - 而不是它的线性变化
  • 嘿@martin-ch,这绝对是不是线性变化。所涉及的物理与一些三角函数一起工作,所以它比乘以一个因子更复杂
  • 马丁谢谢,让我解释一下我的理解,例如,一个方形框放置在距离相机 50 厘米的位置,图像框的宽度和高度为 (10 x 10),即总像素为 100。这意味着 1pixel= 0.5 厘米,与相机的距离为 50 厘米。这是计算距离的唯一方法吗?

标签: opencv


【解决方案1】:

Martin Ch 说您需要校准相机是正确的,但正如 vasile 指出的那样,这不是线性变化。校准你的相机意味着找到这个矩阵

camera_matrix = [fx,0 ,cx,
                 0,fy,cy,
                 0,0, 1];

此矩阵在 3 维坐标 (x,y,z) 上运行,并将其转换为 2 维 homogeneous 坐标。要转换为您的常规欧几里得 (x,y) 坐标,只需将第一个和第二个分量除以第三个。那么现在这些变量在做什么呢?

cx/cy: 它们的存在是为了让您可以根据需要更改坐标系。例如,您可能希望相机空间中的原点位于图像的左上角,而世界空间中的原点位于中心。在那种情况下

cx = -width/2;
cy = -height/2;

如果您不更改坐标系,请将其保留为 0。

fx/fy: 这些以 x 像素和 y 像素为单位指定焦距,它们通常接近相同的值,因此您可以只给它们相同的值 f .这些参数本质上定义了透视效果的强度。假设没有 cx 和 cy 是从世界坐标到屏幕坐标的映射(你可以从上面的矩阵中自己计算出来)

xsc = fx*xworld/zworld;
ysc = fy*yworld/zworld;

如您所见,使事物在近处变大而在远处变小的重要量是 ratio f/z。它不是线性的,但通过使用齐次坐标,我们仍然可以使用线性变换。

简而言之。使用经过校准的相机和世界坐标中已知的对象大小,您可以计算其与相机的距离。如果您缺少其中任何一个,那是不可能的。在不知道世界坐标中的对象大小的情况下,您可以做的最好的事情是通过确定比率 xworld/zworld(知道 fx)将其屏幕位置映射到世界坐标中的射线。

【讨论】:

  • 锤子感谢您的详细回复。但是在我的项目中,正如我在问题中提到的那样,我必须检测不同的对象,我不知道它们的实际大小。我所知道的是以像素为单位的对象的宽度和高度,即对象被包围在一个矩形中。那么在这种情况下我该怎么办?有什么解决办法吗?
  • @yas 你能做的最好的就是将对象映射到世界空间中的射线。如果你不知道它的原始大小,但你知道 f,你可以确定 xworld/zworld,这实际上给了你一个斜率。
  • @yas 如果您真的需要知道实际的 z 位置及其在世界空间中的光线还不够,请开始尝试考虑您拥有的其他可以组合在一起的知识。场景是否都处于相同的深度值?场景是否以已知速度移动?你能从两个不同的位置拍摄同一个场景的两张照片吗(两条投影光线相交的地方会给你一个实际的 z 坐标)。通常有一些方法可以获取您需要的信息
  • 我认为逆透视映射对我有用。使用 IPM,我们可以将前向图像转换为自上而下的“鸟瞰”视图,其中图像中的距离与现实世界中的距离之间存在线性关系。对我有用吗?
  • @yas 不,那行不通。逆透视映射不会为您提供任何新信息,它所做的只是呈现您已经拥有的信息,而没有透视效果。您仍然只能确定 xworld/zworld 的比率。 this的解释是否更清楚?
【解决方案2】:

我觉得只用相机不容易,

考虑使用第三个设备/传感器,如 kinect/立体相机,

然后你会从数据中得到深度(z)。

https://en.wikipedia.org/wiki/OpenNI

【讨论】:

    猜你喜欢
    • 2020-03-13
    • 2013-01-07
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    • 2014-11-10
    • 2017-10-12
    相关资源
    最近更新 更多