【发布时间】:2018-12-01 13:50:14
【问题描述】:
我使用 yolov3 检测大小为416x416 的帧中的对象。我使用该边界框信息在 416x416 图像上绘制框。
但由于图片太小,我看不清楚,所以我使用了相同的框架,有暗淡的1920x1080。我想缩放边界框信息和 x,y 坐标,使其缩放到高亮度图片,但我无法正确缩放它。
很明显,信息很不靠谱。
注意!在传递帧之前,我使用此方法将帧的大小从 1920,1080 调整为 416,416
def letterbox_resize(img, size=(resized_image_size,resized_image_size), padColor=0):
h, w = img.shape[:2]
sh, sw = size
# interpolation method
if h > sh or w > sw: # shrinking image
interp = cv2.INTER_AREA
else: # stretching image
interp = cv2.INTER_CUBIC
# aspect ratio of image
aspect = w/h # if on Python 2, you might need to cast as a float: float(w)/h
# compute scaling and pad sizing
if aspect > 1: # horizontal image
new_w = sw
new_h = np.round(new_w/aspect).astype(int)
pad_vert = (sh-new_h)/2
pad_top, pad_bot = np.floor(pad_vert).astype(int), np.ceil(pad_vert).astype(int)
pad_left, pad_right = 0, 0
elif aspect < 1: # vertical image
new_h = sh
new_w = np.round(new_h*aspect).astype(int)
pad_horz = (sw-new_w)/2
pad_left, pad_right = np.floor(pad_horz).astype(int), np.ceil(pad_horz).astype(int)
pad_top, pad_bot = 0, 0
else: # square image
new_h, new_w = sh, sw
pad_left, pad_right, pad_top, pad_bot = 0, 0, 0, 0
# set pad color
if len(img.shape) is 3 and not isinstance(padColor, (list, tuple, np.ndarray)): # color image but only one color provided
padColor = [padColor]*3
# scale and pad
scaled_img = cv2.resize(img, (new_w, new_h), interpolation=interp)
scaled_img = cv2.copyMakeBorder(scaled_img, pad_top, pad_bot, pad_left, pad_right, borderType=cv2.BORDER_CONSTANT, value=padColor)
return scaled_img
如果有人帮助我编写一个脚本,该脚本将重新调整 yolo 预测的 x、y、w、h 信息,以便我可以在图像上正确绘制准确的框。
【问题讨论】: