41

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

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

OpenCV中是否有可以确定物距的函数?如果没有,任何参考示例代码?

4

3 回答 3

53

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

您需要预先知道两件事之一

  • 焦距(以毫米和每毫米像素为单位)
  • 图像传感器的物理尺寸(计算每毫米像素)

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

校准相机

使用源代码中提供的 OpenCVcalibrate.py工具和棋盘图案 PNG 生成校准矩阵。我从尽可能多的角度拍摄了大约 2 打棋盘照片,并将文件导出到我的 Mac。有关更多详细信息,请查看OpenCV 的相机校准文档

摄像头校准矩阵(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 标头中,您可以找到焦距值 (4.15mm)。这些项目应因相机而异。

每毫米像素数

我们需要知道图像传感器上的每毫米像素 (px/mm)。从相机切除页面我们知道 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));

小皱纹

该对象在相机上拍摄的视频中为 41px @ 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 atpyimagesearch.com演示了一种使用相似三角形的不同技术。我们事先讨论了这个话题,他采用了相似的三角形方法,我做了相机内在函数。

于 2014-12-16T10:30:14.180 回答
1

opencv 中没有这样的函数来计算物体和相机之间的距离。看到这个: 寻找从相机到已知尺寸物体的距离

您应该知道参数取决于相机,并且会随着相机的变化而改变。

于 2012-12-26T08:42:28.863 回答
0
  1. 要在没有任何相机先验信息的情况下获得现实世界和相机之间的映射,您需要校准相机......在这里您可以找到一些理论
  2. 为了计算深度,即相机和物体之间的距离,您需要至少两个由两个不同相机拍摄的同一物体的图像……这通常被称为立体视觉技术。
于 2012-12-27T05:00:53.870 回答