图片大小按比例缩小,多余部分填充黑色

import glob, os

# 封装resize函数
def resize_img_keep_ratio(img, target_size=(360, 640)):
    old_size = img.shape[0:2] # 原始图像大小
    ratio = min(float(target_size[i])/(old_size[i]) for i in range(len(old_size))) # 计算原始图像宽高与目标图像大小的比例,并取其中的较小值
    new_size = tuple([int(i*ratio) for i in old_size]) # 根据上边求得的比例计算在保持比例前提下得到的图像大小
    img = cv2.resize(img,(new_size[1], new_size[0])) # 根据上边的大小进行放缩
    pad_w = target_size[1] - new_size[1] # 计算需要填充的像素数目(图像的宽这一维度上)
    pad_h = target_size[0] - new_size[0] # 计算需要填充的像素数目(图像的高这一维度上)
    top,bottom = pad_h//2, pad_h-(pad_h//2)
    left,right = pad_w//2, pad_w -(pad_w//2)
    img_new = cv2.copyMakeBorder(img,top,bottom,left,right,cv2.BORDER_CONSTANT,None,(0,0,0))
    return img_new

# 将AVI视频转为JPG图片
def aviToJpg(inputpath, fsname, outputpath='H:/kuaice/'):
    outputpath = outputpath + str(inputpath).split('\\')[-1].replace('.mp4','')
    print('outputpath:',outputpath)
    if not os.path.exists(outputpath):
        os.makedirs(outputpath)
    vc = cv2.VideoCapture(inputpath)  # 读入视频文件
    c = 0
    rval = vc.isOpened()
    # timeF = 1  #视频帧计数间隔频率
    while rval:  # 循环读取视频帧
        c = c + 1
        rval, frame = vc.read()
        if rval:
            # img为当前目录下新建的文件夹
            frame = resize_img_keep_ratio(frame)
            cv2.imwrite(os.path.join(outputpath, (fsname + '_' + '{:0>5d}'.format(c) + '.jpg')), frame)  # 存储为图像
            # cv2.imwrite(os.path.join(outputpath, ('{:0>5d}'.format(c) + '.jpg')), frame[0:1100, 0:1920])  # 存储为图像
            cv2.waitKey(1)
        else:
            print(datetime.datetime.now().strftime('%Y%m%d%H%M%S') + ' ' + outputpath + " 完成")
            break
    print('完成!!')


if __name__ == '__main__':
    vediolist = glob.glob('H:/kuaice/*.mp4')
    for item in vediolist:
        aviToJpg(item, str(item).split('\\')[-1].replace('.mp4',''))
    print('全部完成!!')

Comments

No comments yet. Why don’t you start the discussion?

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注