1

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

4

2 回答 2

1

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

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

该矩阵在 3 维坐标 (x,y,z) 上运行,并将其转换为 2 维齐次坐标。要转换为您的常规欧几里得 (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;

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

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

于 2012-08-03T16:40:03.777 回答
0

我觉得只用相机不容易,

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

然后您将从数据中获得深度(z)。

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

于 2012-08-05T06:34:49.923 回答