OpenCV新手求教:如何测量相机与物体距离及是否需校准
OpenCV视频中相机与物体距离测量方案及校准疑问解答
关于相机校准与去畸变的必要性
- 你已经拿到了完整的相机内参(fx, fy, cx, cy)和畸变参数(径向、切向),完全不需要再做相机校准——相机校准的核心目的就是获取这些参数,现成的直接用就行。
- 去畸变是必须做的:镜头畸变会导致物体的像素位置偏移(尤其是画面边缘),直接影响距离计算的精度。用OpenCV的
undistort()函数,传入你手里的畸变参数,把视频帧校正后再进行后续计算即可。
视频中测量距离的最佳方法
单目相机方案(新手首选,适配你的场景)
这是最易实现的方法,核心依赖已知真实尺寸的参考物体,原理公式如下:距离 = (物体真实尺寸 * 像素焦距) / 物体像素尺寸
具体步骤:
- 从视频帧中定位目标物体:用OpenCV的
findContours()做轮廓检测,或者用YOLO这类轻量目标检测模型,得到物体的像素宽度/高度。 - 确定物体的真实物理尺寸:比如你要测距离的瓶子真实高度是15cm,必须准确。
- 代入公式计算:注意你的fx/fy如果是像素单位的焦距,直接代入即可。
示例代码片段:
import cv2 # 替换成你的参数 fx = 1200 # 你的fx值(像素单位) real_obj_height = 0.15 # 物体真实高度,单位米 detected_obj_pixel_height = 60 # 检测到的物体像素高度 # 计算距离 distance = (real_obj_height * fx) / detected_obj_pixel_height print(f"相机到物体的距离:{round(distance, 2)} 米")
注意事项:
- 目标物体要尽量正对着相机(垂直于光轴),否则倾斜会带来误差;如果需要处理倾斜物体,得额外做姿态估计。
- 参考物体的尺寸精度直接决定了距离计算的精度。
进阶方案(适合高精度需求)
- 双目立体视觉:需要两个同步拍摄的视频,通过视差计算深度。但需要做双目相机校准,新手门槛较高。
- 结构光/TOF相机:这类设备能直接输出深度数据,但你只有普通视频,无法使用。
内容的提问来源于stack exchange,提问作者White Dragon
相关产品推荐
相关产品推荐

