给定已知大小的物体如何计算距离
您需要先了解两件事之一
- 焦距(以毫米和每毫米像素为单位)
- 图像传感器的物理尺寸(计算每毫米的像素)
我将使用焦距,因为我不想用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 使用相似的三角形展示了另一种技术 。我们事先讨论了这个主题,他采用了类似的三角形方法,而我进行了相机内部处理。
0
我是OpenCV的新手。我正在使用以下公式来计算距离:
OpenCV中是否有可以确定物体距离的功能?如果没有,是否引用示例代码?