Как обрезать видео (например, при масштабировании) на несколько файлов? - PullRequest
0 голосов
/ 06 мая 2020

У меня есть видео конференц-связи с плитками разных людей, расположенными в сетке.

Пример: масштаб просмотра галереи

Могу ли я обрезать каждую ячейку видео в отдельный файл используя python или nodejs?

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Вот код (проверено). Он работает, инициализируя несколько видеовыходов, затем для каждого кадра входного видео: обрезая интересующую область (roi) и назначая каждому соответствующему выходному видео. Возможно, вам придется внести изменения в зависимости от размеров входного видео, количества раз, смещений и т. Д. c.

import numpy as np
import cv2
import time

cap = cv2.VideoCapture('in.mp4')
ret, frame = cap.read()
(h, w, d) = np.shape(frame)

horiz_divisions = 5 # Number of tiles stacked horizontally
vert_divisions = 5 # Number of tiles stacked vertically
divisions = horiz_divisions*vert_divisions # Total number of tiles

seg_h = int(h/vert_divisions) # Tile height
seg_w = int(w/horiz_divisions) # Tile width

# Initialise the output videos
outvideos = [0] * divisions

for i in range(divisions):
    outvideos[i] = cv2.VideoWriter('out{}.avi'.format(str(i)),cv2.VideoWriter_fourcc('M','J','P','G'), 10, (seg_w,seg_h))

# main code
while(cap.isOpened()):
    ret, frame = cap.read()
    if ret == True:
        vid = 0 # video counter
        for i in range(vert_divisions):
            for j in range(horiz_divisions):

                # Get the coordinates (top left corner) of the current tile
                row = i * seg_h
                col = j * seg_w
                roi = frame[row:row+seg_h,col:col+seg_w,0:3] # Copy the region of interest
                outvideos[vid].write(roi)
                vid += 1
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break

# Release all the objects
cap.release()
for i in range(divisions):
    outvideos[i].release()
# Release everything if job is finished
cv2.destroyAllWindows()

Надеюсь, это поможет!

0 голосов
/ 06 мая 2020

Да, вы можете добиться этого с помощью библиотеки OpenCV.

  1. Прочтите видео в OpenCV с помощью VideoCapture API. Обратите внимание на частоту кадров при чтении.

  2. Анализируйте каждый кадр и обрезайте его:

  3. Запишите кадр в видео с помощью OpenCV VideoWriter

Вот пример кода с использованием (640,480) в качестве новых размеров:

cap = cv2.VideoCapture(<video_file_name>)
fps = cap.get(cv2.CAP_PROP_FPS)
out = cv2.VideoWriter('<output video file name>, -1, fps, (640,480))
while(cap.isOpened()):
    ret, frame = cap.read()
    crop_frame = frame[y:y+h, x:x+w]

    # write the crooped frame
    out.write(crop_frame)

# Release reader wand writer after parsing all frames
cap.release()
out.release()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...