Добавление черного почтового ящика в не широкоформатный видеокадр с помощью Python OpenCV2 - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь поместить изображение не широкоэкранного видеокадра в черный кадр 16: 9, например: если мой проект настроен на 720p (1280 * 720) и размер моего видеокадра составляет 640 * 480Сначала я вычисляю коэффициент масштабирования, изменяю его высоту до 720 (и ширину соответственно), затем помещаю его на черное изображение 1280 * 720.

Пробовал этот метод , но это не таку меня почему-то не получается.

import cv2
import numpy as np

project_width, project_height = 1280, 720
video_file = "any_path/whatever.mp4"
black_image = np.zeros((project_height,project_width,3), np.uint8)
vidcap = cv2.VideoCapture(video_file)

while(vidcap.isOpened()):
    ret, frame = vidcap.read()

    if ret==True:
        frame_height, frame_width, channels = frame.shape

        if frame_height < project_height or frame_width < project_width:
            zoom_ratio = project_height/frame_height
            desired_width = int(frame_width * zoom_ratio)
            desired_height = project_height
            frame = cv2.resize(frame, (desired_width, desired_height))
            border_width = int((project_width-desired_width) / 2)
            black_image[0:, border_width:] = frame

В этот момент я получил ошибку: TypeError: индексы среза должны быть целыми числами или None или иметь index метод

РЕДАКТИРОВАТЬ: плохо, я забыл преобразовать border_width в int, но теперь я столкнулся с другой проблемой:

ValueError: не удалось передать входной массив из фигуры (720,1152,3)в форму (720,1216,3)

(в данном случае мое исходное видео - 1152 * 720)

EDIT2 - я неожиданно понял решение: в последней строке я должен указатьконечный пиксель изображения, чтобы он работал.В случае, если у кого-то тоже есть такая проблема:

black_image[0:, border_width:project_width - border_width] = frame
...