Воспроизведение фильма в OpenCV

#python-3.x #numpy #opencv

#python-3.x #numpy #opencv

Вопрос:

При попытке показать фильм я получаю следующую ошибку:

 cv2.imshow("Video Output", frames)
TypeError: Expected Ptr<cv::UMat> for argument 'mat'
  

Закомментированные строки — это мои попытки исправить проблему, но я все равно получаю ошибку.
Что я делаю не так?

 import cv2
import numpy as np

vid = cv2.VideoCapture("resources/Plaza.mp4")
while True:
    frames = vid.read()
    # frames = cv2.cvtColor(frames, cv2.COLOR_RGB2BGR)
    # frames_arr = np.array(frames)
    cv2.imshow("Video Output", frames)
    if cv2.waitKey(1) amp; 0xFF == ord('q'):
        break
  

Ответ №1:

Лучшей реализацией было бы:

    1. Проверьте, открыто ли видео с помощью vid.isOpened()
    •  vid = cv2.VideoCapture("resources/Plaza.mp4")
      while vid.isOpened():
        
    1. Если кадр успешно возвращен, отобразите его.
    •  ret, frames = vid.read()
      
      if ret:
          # frames = cv2.cvtColor(frames, cv2.COLOR_RGB2BGR)
          # frames_arr = np.array(frames)
          cv2.imshow("Video Output", frames)
          if cv2.waitKey(1) amp; 0xFF == ord('q'):
              break
        
    1. Убедитесь, что всегда закрываете все окна и освобождаете VideoCapture объект
    •  cv2.destoyAllWindows()
      vid.release()
        

Код:

 import cv2
import numpy as np

vid = cv2.VideoCapture("resources/Plaza.mp4")
while vid.isOpened():
    ret, frames = vid.read()

    if ret:
        # frames = cv2.cvtColor(frames, cv2.COLOR_RGB2BGR)
        # frames_arr = np.array(frames)
        cv2.imshow("Video Output", frames)
        if cv2.waitKey(1) amp; 0xFF == ord('q'):
            break
    else
        # continue with the next frame
        continue

cv2.destoyAllWindows()
vid.release()
  

Ответ №2:

В вашем коде vid.read() возвращает два значения. Первый содержит логическое значение, которое, согласно документации:

возвращает bool (True / False). Если кадр прочитан правильно, он будет истинным. Таким образом, вы можете проверить конец видео, проверив это возвращаемое значение.

Таким образом, ваша frames переменная по сути представляет собой кортеж, содержащий логическое значение и сами кадры. Вам нужно проиндексировать второй элемент ( frames[1] ) для воспроизведения видео imshow .

Всегда внимательно читайте документы!