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

带边界框图像的缩放及边界框适配技术实现问询

图像缩放与Bounding Box适配的代码修正

嘿,我帮你检查了这段代码,发现了一个关键的小错误,会导致bounding box的坐标适配完全出错哦!

问题所在

OpenCV读取图像后,img.shape返回的顺序是**(高度, 宽度, 通道数)**,你这里把x_赋值为img.shape[0](也就是图像的高度),y_赋值为img.shape[1](图像的宽度),但后续计算缩放因子时,把x方向(对应图像宽度)的缩放用了高度的比例,y方向(对应图像高度)的缩放用了宽度的比例,这就搞反了,会让bounding box被拉伸变形,坐标完全不对。

正确的实现方式

我们需要把缩放因子和坐标的对应关系理清楚:

  • 原始图像的宽度对应bounding box的x轴坐标(xmin、xmax),所以宽度缩放因子要用来计算x方向的坐标
  • 原始图像的高度对应bounding box的y轴坐标(ymin、ymax),所以高度缩放因子要用来计算y方向的坐标

下面是修正后的完整代码:

import cv2
import numpy as np

# 读取图像
img = cv2.imread("img.jpg", 3)
# 正确获取原始图像的高度和宽度(注意顺序:先高度后宽度)
orig_height, orig_width = img.shape[:2]
# 缩放图像到416x416
resized_img = cv2.resize(img, (416, 416))

# 计算正确的缩放因子:宽度缩放因子对应x坐标,高度缩放因子对应y坐标
width_scale = 416 / orig_width
height_scale = 416 / orig_height

# 原始bounding box参数:(xmin, ymin, xmax, ymax)
orig_bbox = (128, 25, 447, 375)
xmin, ymin, xmax, ymax = orig_bbox

# 计算调整后的bounding box坐标
new_xmin = int(np.round(xmin * width_scale))
new_ymin = int(np.round(ymin * height_scale))
new_xmax = int(np.round(xmax * width_scale))
new_ymax = int(np.round(ymax * height_scale))

# 可以验证一下:把调整后的bbox画在缩放后的图像上看看效果
cv2.rectangle(resized_img, (new_xmin, new_ymin), (new_xmax, new_ymax), (0, 255, 0), 2)
cv2.imshow("Resized Image with BBox", resized_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

额外提示

  • 记得导入numpy库(你代码里用到了np.round,但没写导入,需要补上)
  • 如果后续要做目标检测相关的任务,还要注意bbox的坐标不能超出缩放后图像的范围(比如不能小于0,不能大于415,因为图像尺寸是416x416,坐标从0开始计数)

内容的提问来源于stack exchange,提问作者jejjejd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:37:36