知道采集频率后,现在必须找到标记连续位置之间的距离。在
为了找到这个距离,我建议您估计每个图像的标记的姿势。不严格地说,“姿势”是表示对象相对于摄影机的坐标的变换矩阵。一旦你有了这些连续的坐标,你就可以计算出距离,然后是速度。在
位姿估计是计算已知的3D物体相对于2D相机的位置和方向的过程。得到的姿势是描述对象在摄影机参照中的参照的变换矩阵。在
OpenCV实现了一个姿态估计算法:Given some 3D points (in object
coordinate system) of the object, at
least four non-coplanar points, their
corresponding 2D projections in the
image, and the focal length of the
camera, the algorithm is able to
estimate the object's pose.
这意味着:你必须知道你相机的焦距
你必须知道你的标记的几何结构
您必须能够匹配2D图像中标记的四个已知点
您可能需要使用OpenCV提供的calibration routines计算相机的焦距。我想你还有另外两个必要的数据。在
编辑:// Algorithm example
MarkerCoords = {Four coordinates of know 3D points}
I1 = take 1st image
F1 = focal(I1)
MarkerPixels1 = {Matching pixels in I1}
Pose1 = posit(MarkerCoords, MarkerPixels1, F1)
I2 = take 2nd image
F2 = focal(I2)
MarkerPixels2 = {Matching pixels in I2 by optical flow}
Pose2 = posit(MarkerCoords, MarkerPixels2, F2)
o1 = origin_of_camera * Pose1 // Origin of camera is
o2 = origin_of_camera * Pose2 // typically [0,0,0]
dist = euclidean_distance(o1, o2)
speed = dist/frequency
编辑2:(对评论的回答)"What is the acquisition frequency?"
计算车辆速度相当于计算标记的速度。(在第一种情况下,参照物是附着在地球上的标记物,在第二种情况下,参照物是附着在车辆上的摄像机。)这由以下等式表示:
^{pr2}$
有:D距离[o1 o2]
o1标记在时间t1的位置
o2标记在时间t2的位置
您可以通过从照片的元数据中提取t1和t2,或者从成像设备的采集频率来检索所用时间:t2-t1 = T = 1/F。在"Won't it be better to mark simple things like posters? And if doing so can't we consider it as a 2d object?"
对于Posit算法(或据我所知的任何其他姿势估计算法)来说这是不可能的:它需要四个非共面的点。这意味着不能选择嵌入三维空间的二维对象,必须选择具有一定深度的对象。在
另一方面,你可以使用一个简单的形状,只要它是一个体积。(例如立方体。)