这个项目目的是用单目相机来做测距,从原理上讲,单目相机是没有办法进行测距的,因为构建的相机模型是一个射线方程,缺少自由度,没有办法唯一确定 $Z_c$ 的信息。

  于是,我们这里的做法是,通过目标检测算法框出被检测物体,然后找到检测框下边线段中点作为被检测物体在图像中地面上的点。然后通过公式变换,由像素坐标系到世界坐标系转换得到世界坐标系下在地面上的那个点的二维平面坐标(此时第三维 $z=0$),所以可以不用考虑。

  也就是说,我们的核心是假设 $z=0$ 那么上面等式就可以变成:

  其中 $s=\frac{1}{Z_c}$,$A=\left[\begin{array}{ccc}{f_{x}} & {0} & {u_{0}} \ {0} & {f_{y}} & {v_{0}} \ {0} & {0} & {1}\end{array}\right]$。于是,我们需要做的就是先标定好相机,得到相机内参 $A$,然后建立好世界坐标系(原点在相机投影在地面的位置),将上式计算出来的靶标坐标系结果转换到世界坐标系,得到 $(x_w, y_w)$,然后通过求三角形斜边长度可以计算出距离。

Note 2019-09-24 001

  然后就可以通过 OpenCV 的 findHomography 函数求得 $H$,并根据世界坐标系相对于靶标坐标系的变换对应的计算出变换矩阵,然后就可以求得图片中的像素坐标和世界坐标系中的地面坐标的对应关系了(2D->2D)。

References

  1. OpenCV: How-to calculate distance between camera and object using image?
  2. Camera Calibration
  3. 單目攝像機測距(python+opencv)
  4. Basic concepts of the homography explained with code
  5. 棋盘靶标图片