当摄像头变焦10倍时,图像的视角会变窄,物体在图像中的尺寸会变大。为了保证舵机不会因变焦而出现大范围的转动,需要对代码中与图像尺寸、坐标计算以及舵机角度调整相关的参数进行调整。以下是需要重点关注和调整的参数:
1. 摄像头分辨率
变焦后,摄像头的视角变窄,但分辨率不变。因此,需要调整摄像头的分辨率,以适应变焦后的视角。例如,可以将分辨率从320x240调整为更高的分辨率,如640x480或更高。这样可以保持物体在图像中的相对位置不变。
# 设置摄像头分辨率为 640x480
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
2. 死区范围(dead_zone
)
死区范围用于限制舵机的微小调整。变焦后,物体在图像中的位置变化会更明显,因此需要适当增加死区范围,以减少舵机的频繁调整。
# 增加死区范围
dead_zone = 40 # 原来是20,可以根据实际情况调整
3. 舵机角度调整的比例因子
变焦后,物体在图像中的位置变化会更大,因此需要减小舵机角度调整的比例因子,以避免舵机的大范围转动。
# 减小比例因子
x_error = max(-dead_zone, min(dead_zone, (center_x - 0.5) * iw)) # 限制 x_error 范围
y_error = max(-dead_zone, min(dead_zone, (center_y - 0.5) * ih)) # 限制 y_error 范围
# 调整比例因子
new_servo_x_angle = servo_x_angle - int(x_error * 0.05) # 原来是0.1,减小为0.05
new_servo_y_angle = servo_y_angle + int(y_error * 0.05) # 原来是0.1,减小为0.05
4. 平滑系数(alpha
)
平滑系数用于平滑舵机角度的变化。变焦后,物体位置的变化更剧烈,因此需要适当增加平滑系数,以平滑舵机的运动。
# 增加平滑系数
alpha = 0.2 # 原来是0.1,增加为0.2
5. 人体宽度的像素计算
变焦后,人体在图像中的宽度会变大,因此需要调整人体宽度的像素计算公式,以保持距离计算的准确性。
# 计算人体宽度在图像中的像素尺寸
body_width_pixels = abs(left_shoulder.x - right_shoulder.x) * iw
由于变焦后人体宽度的像素值会变大,可以适当调整焦距(FOCAL_LENGTH
)或已知人体宽度(KNOWN_BODY_WIDTH
),以保持距离计算的准确性。例如:
# 调整焦距
FOCAL_LENGTH = 3000 # 原来是300,根据实际情况调整
6. 舵机角度范围的限制
确保舵机角度的限制范围仍然有效。变焦后,物体在图像中的位置变化更大,因此需要确保舵机角度不会超出其支持的范围。
# 再次确保舵机角度在有效范围内
new_servo_x_angle = max(0, min(270, new_servo_x_angle))
new_servo_y_angle = max(0, min(180, new_servo_y_angle))
总结
以下是调整后的关键参数:
-
摄像头分辨率:提高分辨率(如640x480)。
-
死区范围:增加死区范围(如40)。
-
舵机角度调整的比例因子:减小比例因子(如0.05)。
-
平滑系数:增加平滑系数(如0.2)。
-
焦距或已知人体宽度:根据实际情况调整焦距或人体宽度的像素计算。
-
舵机角度范围限制:保持舵机角度在有效范围内。