Сообщение об ошибке при сохранении видео с помощью OpenCV - PullRequest
0 голосов
/ 18 мая 2019

У меня ошибка при запуске кода, я не понимаю, что происходит, но я думаю, что когда программа заканчивается, потому что у меня есть результат, который я хочу, то есть преобразовать существующее видео в оттенки серого и сохранить его.

cv2.error: OpenCV (4.1.0) C: \ projects \ opencv-python \ opencv \ modules \ imgproc \ src \ color.cpp: 182: ошибка: (-215: утверждение не выполнено)! _Src.empty ( ) в функции 'cv :: cvtColor'

cap = cv2.VideoCapture('videos/output.avi')
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('results/output.avi', fourcc, 20.0, (640, 480))

while (cap.isOpened()):
    _, frame = cap.read()
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    out.write(frame)

    # Key events
    key = cv2.waitKey(1)
    if key == 27:  # esc
        break

cap.release()
cv2.destroyAllWindows()

Спасибо!

Ответы [ 2 ]

1 голос
/ 18 мая 2019

Возможен случай, когда хотя бы один из кадров в вашем видео не был прочитан должным образом. Вот почему метод cv2.cvtColor выдает ошибку, поскольку данные фрейма, которые вы предоставляете, пусты.

Вам следует рассмотреть возможность использования первого вывода cv2.VideoCapture.read(), чтобы убедиться, что видеокадр был правильно захвачен, а затем записать его в файл. Первый вывод - это флаг, который определяет, был ли текущий кадр прочитан успешно. Кроме того, вам нужно обработать конец, где мы достигаем конца видео. В этом случае флаг будет False, поэтому мы должны выйти из цикла. Наконец, если вы намерены писать кадры в градациях серого, в cv2.VideoWriter есть необязательный пятый параметр, называемый isColor, где мы можем установить значение False, чтобы позволить нам напрямую писать кадры в градациях серого. Это означает, что звонок на cv2.cvtColor больше не требуется.

Еще одна вещь, которую я бы порекомендовал, - это выводить ширину и высоту кадра из видеофайла, а не устанавливать их самостоятельно. Таким образом, разрешение на входе и выходе одинаково. Наконец, не забудьте освободить объект cv2.VideoWriter, когда вы закончите, и я добавил дополнительную проверку видеофайла, чтобы проверить, правильно ли он открылся:

import numpy as np
import cv2
import sys

cap = cv2.VideoCapture('videos/output.avi')

# Check to see if the video has properly opened
if not cap.isOpened():
    print("File could not be opened")
    sys.exit(1)

fourcc = cv2.VideoWriter_fourcc(*'XVID')
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))  # Get the frame width and height
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) 

# Change
out = cv2.VideoWriter('results/output.avi', fourcc, 20.0, (frame_width, frame_height), isColor=False)

while True:
    ret, frame = cap.read() # New

    if not ret: # New
        break # Get out if we don't read a frame successfully

    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    out.write(frame)

    # Key events
    key = cv2.waitKey(1)
    if key == 27:  # esc
        break

cap.release()
out.release() # New
cv2.destroyAllWindows()

Как небольшая заметка, у вас нет отображаемых окон, поэтому cv2.destroyAllWindows() здесь излишне. Попробуйте удалить его из своего кода.

0 голосов
/ 18 мая 2019

Таким образом, у этого ответа есть другой подход (Здесь вы также можете извлечь другой цвет, изменив соответствующие веса перед значениями B, G, R)

enter image description here

import cv2
cap = cv2.VideoCapture('videos/output.avi')
frame_width = int(cap.get(3))  # finds the frame width automatically
frame_height = int(cap.get(4))  # finds the frame height automatically

fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('results/outpy.avi', cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 10, (frame_width, frame_height))

while (cap.isOpened()): # value is true if the file is successfully opened.
    ret, frame = cap.read()
    if ret == True:  # checks if the return value is True or False. False means file ended.
        # grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # the grey matrix has a different shape than the frame matrix
        # that's why the output files were blank
        # to circumvent this RGB2GRAY, I manually added the "NORMALIZED" R,G,B values.

        frame[:,:,0] = 0.114*frame[:,:,0]+0.587*frame[:,:,1]+0.299*frame[:,:,2] #multiplying normalized co-efficients to B,G,R
# for extracting red, make 0.299 as 1.0 and others as 0.0; same goes for other colours.
        frame[:, :, 1]=frame[:,:,0] # making the G and R values same as the B.
        frame[:, :, 2]=frame[:,:,0]
        # now frame is a 3d grayscale matrix. Identical to the cv2.cvtColor method....except it is 3d
        # now frame is grey scaled...R,G,B values for each pixel,holds the same number....
        out.write(frame)
    else:
        break
cap.release()
out.release()
cv2.destroyAllWindows()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...