如何将相机与目标的像素距离转为米/厘米并计算目标速度
像素距离转米/厘米及运动目标速度计算方案
一、当前测距计算的错误修正
你调用distance_finder时参数传递错误:函数的第二个参数要求传入目标真实宽度(单位米),但你传入的是第一帧计算出的obj_width_px(像素单位的投影宽度),这才导致结果出现异常数值。
正确调用方式
# 参数含义说明: # focal_length_px:已转换为像素的焦距(你的计算值约1667px) # real_obj_width:目标真实宽度(0.0373米) # obj_width_in_frame:当前帧检测到的目标宽度(像素,示例值17) def distance_finder(focal_length, real_obj_width, obj_width_in_frame): distance = (real_obj_width * focal_length) / obj_width_in_frame return distance obj_width_in_frame = 17 obj_dst = distance_finder(focal_length_px, real_obj_width, obj_width_in_frame)
单位转换说明
按照小孔成像原理推导的公式,计算出的obj_dst直接以米为单位:
真实宽度(米) × 焦距(像素) / 帧内宽度(像素) → 像素单位抵消,结果单位与真实宽度一致(米)
转厘米只需乘以100:
obj_dst_cm = obj_dst * 100
二、运动目标速度计算
速度核心逻辑为真实位移 ÷ 时间差,分两种运动场景处理:
1. 目标沿相机光轴前后运动
通过相邻帧的距离差计算速度:
- 计算相邻两帧的时间差
delta_t(比如帧率30fps时,单帧间隔为1/30秒) - 分别算出两帧的目标距离
d1、d2(单位米) - 速度 = 距离差的绝对值 ÷ 时间差
示例代码:
delta_t = 1 / 30 # 30fps下的帧间隔时间 # 第t帧和t+1帧的目标宽度(像素) obj_width_t = 15.5 obj_width_t1 = 17 d1 = distance_finder(focal_length_px, real_obj_width, obj_width_t) d2 = distance_finder(focal_length_px, real_obj_width, obj_width_t1) # 速度单位:米/秒 speed = abs(d2 - d1) / delta_t
2. 目标垂直光轴横向运动
需要结合相机视场角计算真实位移:
- 计算水平视场角:
先根据传感器尺寸和焦距推导,假设图像宽度为1920像素,传感器像素尺寸4.8µm:import math img_width_px = 1920 sensor_width_mm = img_width_px * 4.8e-3 # 传感器物理宽度(mm) FOV_w = 2 * math.atan( (sensor_width_mm / 2) / 8 ) # 水平视场角(弧度制) - 计算像素位移对应的真实位移:
用相邻帧目标的水平像素差,结合当前帧距离计算真实移动距离 - 计算速度:
示例代码:
delta_t = 1 / 30 # 相邻帧目标中心的水平像素坐标 x_t = 500 x_t1 = 600 delta_px = abs(x_t1 - x_t) # 当前帧的目标距离 current_dst = distance_finder(focal_length_px, real_obj_width, obj_width_in_frame) # 计算真实位移和速度 delta_angle = (delta_px / img_width_px) * FOV_w real_displacement = current_dst * math.sin(delta_angle) # 小角度下可近似为 current_dst * delta_angle speed = real_displacement / delta_t
内容的提问来源于stack exchange,提问作者S.EB
相关产品推荐
相关产品推荐

