You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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轴映射逻辑

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 13:57:00