#python #opencv #video #opencv-stitching
Вопрос:
Я вижу вопросы и ответы по сшиванию изображений с помощью открытого резюме. Можно ли сшить видео с помощью открытого резюме. Специально используете Python? У меня установлен Pycharm с открытым CV, и я могу заставить его воспроизводить один записанный файл. Но было бы здорово заставить его прочитать два и сшить их вместе. Буду признателен, если кто-нибудь укажет мне на какие-либо учебные пособия, которые я еще не смог найти. Спасибо
Комментарии:
1.
video
обрабатывается как можно больше изображений/кадров, поэтому вы можете использовать CV сfor
циклом иinput_stream.read()
получать кадр за кадром, сшивать кадры в новый кадр иoutput_stream.write()
записывать этот кадр в новый файл. Но иногда может быть проще использовать специализированные модули , такие какMoviePy
,ffmpeg-python
,Manim
Ответ №1:
Вы можете использовать OpenCV
с for/while
циклом для чтения кадра за кадром из двух видео, сшивания кадров в новом кадре (используя numpy
— т. Е. hstack()
) и сохранения его в новом файле (также кадр за кадром)
Позже я создам пример.
Но может быть проще использовать специализированные модули, такие как MoviePy, ffmpeg-python или Manim.
Вероятно, все они используют программу ffmpeg, которая имеет множество функций и фильтров.
Пример с MoviePy
— он создает массив с двумя фильмами в одной строке, но может создавать массив со многими строками и столбцами.
from moviepy.editor import *
clip1 = VideoFileClip('input1.mp4')
clip2 = VideoFileClip('input2.mp4')
final_clip = clips_array([[clip1,clip2]]) # two videos in one row
final_clip.write_videofile('output.mp4')
И два видео в одной колонке
final_clip = clips_array([[clip1], [clip2]]) # two videos in one column
И массив видео 2х2
final_clip = clips_array([[clip1, clip2], [clip3,clip4]])
Редактировать:
Код с. CV
Он длиннее и сложнее, но отображает видео.
import cv2
import numpy as np
clip1 = cv2.VideoCapture('input1.mp4')
clip2 = cv2.VideoCapture('input2.mp4')
width = clip1.get(cv2.CAP_PROP_FRAME_WIDTH)
height = clip1.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps = clip1.get(cv2.CAP_PROP_FPS)
print('fps:', fps)
video_format = cv2.VideoWriter_fourcc(*'MP42') # .avi
final_clip = cv2.VideoWriter('output.avi', video_format, fps, (int(width), int(height)))
delay = int(1000/fps)
print('delay:', delay)
while True:
ret1, frame1 = clip1.read()
ret2, frame2 = clip1.read()
if not ret1 or not ret2:
break
final_frame = np.vstack([frame1, frame2]) # two videos in one row
final_clip.write(final_frame)
cv2.imshow('Video', final_frame)
key = cv2.waitKey(delay) amp; 0xFF
if key == 27:
break
cv2.destroyWindow('Video')
clip1.release()
clip2.release()