海康工业相机的 ROI 参数(offset 和 width/height)必须满足对齐要求(通常是 4 或 8 的倍数),否则会报错 80000102。
py
def align_roi_params(offset_x, offset_y, width, height, max_width, max_height, alignment=4):
"""
对齐 ROI 参数以满足海康相机要求
海康相机的 ROI 参数通常需要满足对齐要求(4或8的倍数)
Args:
offset_x, offset_y: ROI 偏移量
width, height: ROI 尺寸
max_width, max_height: 相机最大分辨率
alignment: 对齐字节数(默认4)
Returns:
(aligned_offset_x, aligned_offset_y, aligned_width, aligned_height)
"""
# 向下对齐到 alignment 的倍数
def align_down(value, align):
return (value // align) * align
# offset 向下对齐(确保不会越界)
aligned_offset_x = align_down(offset_x, alignment)
aligned_offset_y = align_down(offset_y, alignment)
# width/height 向下对齐(确保 offset + size 不超过最大值)
# 先计算可用的最大尺寸
max_available_width = max_width - aligned_offset_x
max_available_height = max_height - aligned_offset_y
# 将 width/height 对齐,但不超过可用空间
aligned_width = min(align_down(width, alignment), align_down(max_available_width, alignment))
aligned_height = min(align_down(height, alignment), align_down(max_available_height, alignment))
# 确保最小尺寸(至少64像素)
aligned_width = max(aligned_width, 64)
aligned_height = max(aligned_height, 64)
print(f"🔧 ROI参数对齐:")
print(f" 原始: offset=({offset_x}, {offset_y}), size=({width}×{height})")
print(f" 对齐后: offset=({aligned_offset_x}, {aligned_offset_y}), size=({aligned_width}×{aligned_height})")
return aligned_offset_x, aligned_offset_y, aligned_width, aligned_height