swa*_*pna 33 opencv image-processing
我是OpenCV的新手.我正在使用以下公式来计算距离:
distance to object (mm) = focal length (mm) * real height of the object (mm) * image height (pixels)
----------------------------------------------------------------
object height (pixels) * sensor height (mm)
Run Code Online (Sandbox Code Playgroud)
OpenCV中是否有可以确定物距的函数?如果没有,任何对示例代码的引用?
Cam*_*mer 45
你需要事先知道两件事之一
我将使用焦距,因为我不想谷歌传感器数据表.
使用calibrate.py源代码中提供的OpenCV 工具和Chessboard pattern PNG生成校准矩阵.我从尽可能多的角度拍摄了大约二十张棋盘的照片,然后将文件导出到我的Mac上.有关更多详细信息,请查看OpenCV的相机校准文档.
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]
Run Code Online (Sandbox Code Playgroud)
检查拍摄的棋盘系列照片的详细信息,您将找到照片的原始分辨率(3264x2448),在iPhoto中可见的JPEG EXIF标题中,您可以找到焦距值(4.15mm).这些项目应根据相机而有所不同.
我们需要知道图像传感器上每毫米的像素(px/mm).从相机切除的页面我们知道f_x和f_y是焦距乘以缩放因子.
f_x = f * m_x
f_y = f * m_y
Run Code Online (Sandbox Code Playgroud)
由于每个公式都有两个变量,我们可以求解m_x和m_y.我只是平均2803和2805得到2804.
m = 2804px / 4.15mm = 676px/mm
Run Code Online (Sandbox Code Playgroud)
我使用OpenCV(C++)来获取点的旋转矩形,并确定对象的大小为41px.请注意,我已经检索了对象的角落,并询问边界矩形的大小.
cv::RotatedRect box = cv::minAreaRect(cv::Mat(points));
Run Code Online (Sandbox Code Playgroud)
在相机@ 640x480上拍摄的视频中物体为41像素.
3264/676 = 640/x
x = 133 px/mm
Run Code Online (Sandbox Code Playgroud)
因此,给定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
Run Code Online (Sandbox Code Playgroud)
这恰好相当不错.我测量了910毫米并进行了一些改进,我可以减少误差.
反馈表示赞赏.
阿德里安pyimagesearch.com展示了使用相似三角形的不同技术.我们事先讨论了这个话题,他采用了类似的三角形方法,我做了相机内在函数.
| 归档时间: |
|
| 查看次数: |
69393 次 |
| 最近记录: |