2014-12-02 2 views
3

Я хочу просто загрузить видеофайл, преобразовать его в оттенки серого и отобразить его. Вот мой код:openCV Ошибка в функции cvtColor: утверждение не выполнено (scn == 3 || scn == 4)

import numpy as np 
import cv2 

cap = cv2.VideoCapture('cars.mp4') 

while(cap.isOpened()): 
    # Capture frame-by-frame 
    ret, frame = cap.read() 
    #print frame.shape 


    # Our operations on the frame come here 
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 

    # Display the resulting frame 
    cv2.imshow('frame',gray) 
    if cv2.waitKey(1) & 0xFF == ord('q'): 
     break 


# When everything done, release the capture 
cap.release() 
cv2.destroyAllWindows() 

Видео воспроизводится в оттенках серого до конца. Затем она замерзает и окно становится не отвечает, и я получаю следующее сообщение об ошибке в терминале:

OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cvtColor, file /home/clive/Downloads/OpenCV/opencv-2.4.9/modules/imgproc/src/color.cpp, line 3737 
Traceback (most recent call last): 
    File "cap.py", line 13, in <module> 
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 
cv2.error: /home/clive/Downloads/OpenCV/opencv-2.4.9/modules/imgproc/src/color.cpp:3737: error: (-215) scn == 3 || scn == 4 in function cvtColor 

Я раскомментировал оператор печати frame.shape. Он сохраняет печать 720,1028,3. Но после того, как воспроизведение видео до конца, замерзнет и через некоторое время он закрывается и возвращает

print frame.shape 
AttributeError: 'NoneType' object has no attribute 'shape' 

Я понимаю, что это утверждение массаж неудачи обычно означает, что я пытаюсь преобразовать пустой файл. Я добавил чек для пустого изображения, прежде чем начинать его обрабатывать с помощью инструкции if (ret):. (Любой другой способ сделать это ??)

import numpy as np 
import cv2 

cap = cv2.VideoCapture('cars.mp4') 

while(cap.isOpened()): 
    # Capture frame-by-frame 
    ret, frame = cap.read() 
    #print frame.shape 

    if(ret): #if cam read is successfull 
     # Our operations on the frame come here 
     gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 

     # Display the resulting frame 
     cv2.imshow('frame',gray) 
     if cv2.waitKey(1) & 0xFF == ord('q'): 
      break 
    else: 
     break 

# When everything done, release the capture 
cap.release() 
cv2.destroyAllWindows() 

На этот раз видео воспроизводится до конца, а окно еще зависает и закрывается через несколько секунд. На этот раз я не ошибаюсь. Но почему замораживание окна? Как я могу это исправить?

+0

Может быть 'cap.release()' занимает некоторое время, чтобы закончить. Является ли окно еще замороженным, если вы поменяете две строки в конце? –

+0

@Arnaud P Да это – Clive

+0

Хорошо. Как окончательное дикое предположение: если вы многопоточность, отображение изображения opencv не очень хорошо, если оно не выполняется в основном потоке. –

ответ

1

WaitKey() часть не должна зависеть от действия кадра, переместить его из условия:

import numpy as np 
import cv2 

cap = cv2.VideoCapture('cars.mp4') 

while(cap.isOpened()): 
    # Capture frame-by-frame 
    ret, frame = cap.read() 
    #print frame.shape 

    if(ret): #if cam read is successfull 
     # Our operations on the frame come here 
     gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 

     # Display the resulting frame 
     cv2.imshow('frame',gray) 
    else: 
     break 

    # this should be called always, frame or not. 
    if cv2.waitKey(1) & 0xFF == ord('q'): 
     break 
+0

Я пробовал то, что вы предлагали, но все же получил тот же результат. Окно застыло после окончания видео. – Clive

+0

Я замечаю, что если инструкция «else» помещается после последнего оператора «if», то видео не воспроизводится вообще. Я просто вижу, как окно всплывает и показывает рамку и быстро закрывается. Это происходит быстро. Думаю, сыграл только один кадр. Почему это? – Clive

+0

Потому что ваш код тогда говорит 'if 'q': break else: break', что означает, что он не может полностью зацикливаться. –

Смежные вопросы