我所知道的是视频中对象的高度和宽度。有人可以指导我使用c或c ++计算检测到的物体在视频中与摄像机的距离吗?有没有算法或公式来做到这一点? 提前谢谢
答案 0 :(得分: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;
正如你所看到的那样,重要的数量使得物体越来越近而且越小越远是比率 f / z。它不是线性的,但通过使用同质坐标,我们仍然可以使用线性变换。
简而言之。使用经过校准的相机和世界坐标中的已知物体尺寸,您可以计算其与相机的距离。如果你错过其中任何一个是不可能的。在不知道世界坐标中的对象大小的情况下,您可以做的最好的事情是通过确定xworld / zworld(知道fx)的比例将其屏幕位置映射到世界坐标中的光线。
答案 1 :(得分:0)
如果不得不仅使用相机,我不认为这很容易,
考虑使用第三个设备/传感器,如kinect /立体相机,
然后你将从数据中获得深度(z)。