Python中如何将cv2的边界框坐标与matplotlib图表坐标匹配
边界框坐标重缩放匹配方案
完全可以通过线性重缩放实现OpenCV坐标到matplotlib坐标体系的匹配,具体实现步骤如下:
1. 先对齐所有已知参数定义
- OpenCV侧:
- 图像尺寸
[高H_cv=2339px, 宽W_cv=1654px],默认坐标原点为左上角,x轴向右为正,y轴向下为正 - 输入边界框
bbox_cv = [x1_cv, y1_cv, x2_cv, y2_cv] = [62, 1714, 1598, 2129],对应边界框左上角、右下角的像素坐标
- 图像尺寸
- matplotlib侧:
- 已知x轴总跨度
span_x = 595.2,y轴总跨度span_y = 841.92,默认imshow模式下origin="upper",和OpenCV轴方向一致,无需翻转y轴 - 若你的matplotlib手动设置了
origin="lower"(原点在左下角),需要额外调整y轴映射逻辑
- 已知x轴总跨度
2. 通用转换公式
2.1 0-1归一化OpenCV坐标
x1_norm = x1_cv / W_cv x2_norm = x2_cv / W_cv y1_norm = y1_cv / H_cv y2_norm = y2_cv / H_cv
2.2 映射到matplotlib坐标范围
情况1:matplotlib坐标轴从0开始(默认场景)
x1_plt = x1_norm * span_x x2_plt = x2_norm * span_x # origin=upper时y轴映射 y1_plt = y1_norm * span_y y2_plt = y2_norm * span_y # origin=lower时y轴映射替换为下面两行 # y1_plt = (1 - y1_norm) * span_y # y2_plt = (1 - y2_norm) * span_y
情况2:matplotlib坐标轴有起始偏移
如果matplotlib的x轴范围是[x_min, x_max]、y轴范围是[y_min, y_max],不是从0开始,则调整为:
x1_plt = x1_norm * (x_max - x_min) + x_min x2_plt = x2_norm * (x_max - x_min) + x_min # origin=upper y1_plt = y1_norm * (y_max - y_min) + y_min y2_plt = y2_norm * (y_max - y_min) + y_min # origin=lower # y1_plt = (1 - y1_norm) * (y_max - y_min) + y_min # y2_plt = (1 - y2_norm) * (y_max - y_min) + y_min
3. 代入数值计算结果
以默认origin="upper"、坐标轴从0开始的场景计算:
- 归一化结果:
- x1_norm ≈ 62/1654 ≈ 0.0375,x2_norm ≈ 1598/1654 ≈ 0.9661
- y1_norm ≈ 1714/2339 ≈ 0.7328,y2_norm ≈ 2129/2339 ≈ 0.9102
- 映射后matplotlib边界框:
[22.32, 616.99, 575.02, 766.33]
4. 校验注意事项
- 转换前务必确认matplotlib的
origin参数设置,y轴方向不匹配会导致边界框上下翻转 - 若绘制后边界框位置偏移,可先输出matplotlib的
ax.get_xlim()、ax.get_ylim()获取实际轴范围,再代入公式计算,避免手动设置的轴范围和实际不一致
内容的提问来源于stack exchange,提问作者Stark
相关产品推荐
相关产品推荐

