OpenCV:如何使用图像计算相机和物体之间的距离?

时间:2012-12-26 08:38:30

标签: image-processing opencv

我是OpenCV的新手。我正在使用以下公式来计算距离:

distance to object (mm) = focal length (mm) * real height of the object (mm) * image height (pixels)
                          ----------------------------------------------------------------
                                object height (pixels) * sensor height (mm)

OpenCV中是否有可以确定物距的功能?如果没有,任何对示例代码的引用?

3 个答案:

答案 0 :(得分:44)

如何计算给定已知大小的对象的距离

你需要事先了解两件事之一

  • 焦距(mm和像素/ mm)
  • 图像传感器的物理尺寸(计算每毫米像素数)

我将使用焦距,因为我不想谷歌传感器数据表。

校准相机

使用OpenCV calibrate.py工具和源代码中提供的Chessboard pattern PNG生成校准矩阵。我从尽可能多的角度拍摄了大约二十张棋盘的照片,然后将文件导出到我的Mac上。有关详情,请查看OpenCV's camera calibration docs

相机校准矩阵(iPhone 5S后置摄像头)

RMS: 1.13707201375
camera matrix:
[[  2.80360356e+03   0.00000000e+00   1.63679133e+03]
 [  0.00000000e+00   2.80521893e+03   1.27078235e+03]
 [  0.00000000e+00   0.00000000e+00   1.00000000e+00]]
distortion coefficients:  [ 0.03716712  0.29130959  0.00289784 -0.00262589 -1.73944359]
  • f_x = 2803
  • f_y = 2805
  • c_x = 1637
  • c_y = 1271

检查拍摄的棋盘系列照片的详细信息,您会发现照片的原始分辨率(3264x2448)以及在iPhoto中可见的JPEG EXIF headers中,您可以找到焦距值(4.15)毫米)。这些项目应根据相机而有所不同。

每毫米像素数

我们需要知道图像传感器上每毫米的像素(px / mm)。从camera resectioning上的页面我们知道f_x和f_y是焦距乘以缩放因子。

f_x = f * m_x
f_y = f * m_y

由于每个公式都有两个变量,我们可以求解m_x和m_y。我只是平均2803和2805得到2804.

m = 2804px / 4.15mm = 676px/mm 

对象大小(以像素为单位)

我使用OpenCV(C ++)来获取点的Rotated Rect并确定对象的大小为41px。注意我已经检索了对象的角落,并询问边界矩形的大小。

cv::RotatedRect box = cv::minAreaRect(cv::Mat(points));

小皱纹

在相机拍摄的视频中,物体为41像素@ 640x480。

以较低分辨率转换px / mm

3264/676 = 640/x
x = 133 px/mm

因此,给定41px / 133px / mm,我们发现图像传感器上的物体尺寸为.308mm。

距离公式

distance_mm = object_real_world_mm * focal-length_mm / object_image_sensor_mm
distance_mm = 70mm * 4.15mm / .308mm
distance_mm = 943mm

这恰好相当不错。我测量了910毫米并进行了一些改进,我可以减少误差。

感谢您的反馈。

类似的三角形方法

Adrian在pyimagesearch.com演示a different technique using similar triangles。我们事先讨论了这个话题,他采用了类似的三角形方法,我做了相机内在函数。

答案 1 :(得分:1)

opencv中没有这样的功能来计算物体和相机之间的距离。看到这个: Finding distance from camera to object of known size

您应该知道参数取决于相机,如果相机更换,则会发生变化。

答案 2 :(得分:0)

  1. 要获得现实世界和相机之间的映射,而无需相机的任何先验信息,您需要校准相机...... here you can find some theory
  2. 为了计算相机和物体之间的距离,您需要至少两个由两个不同相机拍摄的同一物体的图像......这通常被称为立体视觉技术。