#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:
Лучшей реализацией было бы:
-
- Проверьте, открыто ли видео с помощью
vid.isOpened()
-
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
-
- Убедитесь, что всегда закрываете все окна и освобождаете
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
.
Всегда внимательно читайте документы!