猿问

如何重新缩放图像坐标的信息以处理类似图像的缩放版本

我使用 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 信息,以便我可以在图像上正确绘制准确的框。


绝地无双
浏览 328回答 1
1回答
随时随地看视频慕课网APP

相关分类

Python
我要回答