OpenCV:如何使用图像计算相机和物体之间的距离?
image-processing
opencv
7
0

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

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

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

参考资料:
Stack Overflow
收藏
评论
共 1 个回答
高赞 时间 活跃

给定已知大小的物体如何计算距离

您需要先了解两件事之一

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

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

校准相机

使用源代码中提供的OpenCV calibrate.py工具和Chessboard pattern PNG生成校准矩阵。我从尽可能多的角度拍摄了两打棋盘的照片,并将文件导出到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 ++)捕获了点的Rott Rect ,并将对象的大小确定为41px。注意,我已经检索了对象的角,并询问边界矩形的大小。

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

小皱纹

在640x480的相机上拍摄的视频中,对象为41px。

以较低的分辨率转换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

这恰好是不错的。我测量了910mm,经过一些改进,我可能会减少误差。

反馈表示赞赏。

相似的三角形方法

pyimagesearch.com Adrian 使用相似的三角形展示了另一种技术 。我们事先讨论了这个主题,他采用了类似的三角形方法,而我进行了相机内部处理。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题