Я пытаюсь обработать видео. Чтобы сделать это быстрее, я хотел бы прочитать его с помощью ffmpeg, а затем отправить кадр на cv2 для обработки.
Это то, что я сделал:
import cv2
import subprocess as sp
import numpy as np
input_file = 'testvideo.mp4'
cap = cv2.VideoCapture(input_file)
ret, frame = cap.read()
height, width, ch = frame.shape
ffmpeg = "C:\\Users\\totyped\\Downloads\\ffmpeg\\bin\\ffmpeg.exe"
dimension = '{}x{}'.format(width, height)
f_format = 'bgr24' # remember OpenCV uses bgr format
fps = str(cap.get(cv2.CAP_PROP_FPS))
command = [ffmpeg,
'-i', input_file,
'-r', fps, # FPS
'-pix_fmt', 'bgr24', # opencv requires bgr24 pixel format.
'-vcodec', 'mp4',
'-an','-sn', # disable audio processing
'-f', 'image2pipe', '-']
pipe = sp.Popen(command, stdout = sp.PIPE, bufsize=10)
while True:
frame = pipe.stdout.read()
image = np.frombuffer(frame, dtype='uint8') # convert read bytes to np
cv2.imshow('Video', image)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
proc.stdin.close()
proc.stderr.close()
proc.wait()
Я продолжаю получать ту же ошибку:
ошибка: OpenCV (4.0.0) C: \ projects \ opencv-python \ opencv \ modules \ highgui \ src \ window.cpp: 350: ошибка: (-215: утверждение не выполнено)size.width> 0 && size.height> 0 в функции 'cv :: imshow'
Это потому, что что-то не так с тем, как я получаю видео.
Кодбыл частично вдохновлен: https://www.reddit.com/r/linuxquestions/comments/b4jxdb/how_could_i_interface_ffmpeg_with_opencv_in/
РЕДАКТИРОВАТЬ:
import cv2
import subprocess as sp
import numpy as np
input_file = 'testvideo.mp4'
cap = cv2.VideoCapture(input_file)
ret, frame = cap.read()
height, width, ch = frame.shape
ffmpeg = "C:\\Users\\totyped\\Downloads\\ffmpeg\\bin\\ffmpeg.exe"
dimension = '{}x{}'.format(width, height)
f_format = 'bgr24' # remember OpenCV uses bgr format
fps = str(cap.get(cv2.CAP_PROP_FPS))
command = [ffmpeg,
'-i', input_file,
'-r', fps, # FPS
'-pix_fmt', 'bgr24', # opencv requires bgr24 pixel format.
'-vcodec', 'mp4',
'-an','-sn', # disable audio processing
'-f', 'image2pipe', '-']
pipe = sp.Popen(command, stdout = sp.PIPE, bufsize=64000000)
while True:
frame = pipe.stdout.read(height*width*3)
print(frame)
image = np.frombuffer(frame, dtype='uint8') # convert read bytes to np
cv2.imshow('Video', image)
if cv2.waitKey(1) & 0xFF == ord('q'):
break