带边界框图像的缩放及边界框适配技术实现问询
图像缩放与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
相关产品推荐
相关产品推荐

