2017-10-11 21 views
0

Ich habe ein Video aufgezeichnet, um den Kaskadenklassifizierer zu testen. Ich schrieb ein Skript wie folgt, um aufzuzeichnen, wie oft der Kaskadenklassierer mein Gesicht im kurzen Video erkennt.Opencv Fehler: Assertion fehlgeschlagen (scn == 3 || scn == 4) in ipp_cvtColor

import cv2 
import numpy as np 

face_cascade = cv2.CascadeClassifier('./data/cascade.xml') 
cap = cv2.VideoCapture('/home/jianyepa/opencv-learning/output.avi') 
count = 0 

print cap.isOpened() 
while 1: 
     ret, frame = cap.read() 
     gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 
     faces = face_cascade.detectMultiScale(gray, 1.3,5) 

     for (x,y,w,h) in faces: 
       cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2) 
       roi_gray = gray[y:y+h,x:x+w] 
       roi_color = frame[y:y+h,x:x+w] 
       count += 1 
       print 'face detected' 

     cv2.imshow('frame',frame) 
     if cv2.waitKey(10) & 0xFF == ord('q'): 
       break 

print count 
cap.release() 
cv2.destroyAllWindows() 

Irgendwie, wenn ich das Video zu Ende spielen, wird es die folgende Ausgabe

True

face detected

face detected

face detected

OpenCV Error: Assertion failed (scn == 3 || scn == 4) in ipp_cvtColor, file /home/jianyepa/opencv-3.1.0/modules/imgproc/src/color.cpp, line 7456 Traceback (most recent call last): File "cascade.py", line 11, in gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) cv2.error: /home/jianyepa/opencv-3.1.0/modules/imgproc/src/color.cpp:7456: error: (-215) scn == 3 || scn == 4 in function ipp_cvtColor

jedoch zeigen, wenn ich das Video, bevor es Ende beenden, wird die Ausgabe wie

erwartet

True

face detected

face detected

2

Kann jemand eine Idee geben, was passiert? Danke.

+0

Nach 'ret, frame = cap.read()', ob 'Rahmen nicht None' ist – ZdaR

+0

@ZdaR Sorry, ich kann Sie bekommen, ist es hinzuzufügen' wenn frame nicht ist None: 'then' continue'? –

+0

Es hängt von Ihnen ab, was Sie tun möchten, wenn frame keins ist, Sie können 'continue',' print "Frame empty" 'oder einen Zähler leerer Frames usw. beibehalten. Es ist jedoch sehr unwahrscheinlich, dass Sie einen leeren Frame erhalten Mitte des Stroms. – ZdaR

Antwort

0

Das passiert, weil Sie versuchen, Operationen an einem Rahmen durchzuführen, der nicht einmal verfügbar ist.

Nur stellen diese Change-

while cap.isOpened(): 
     ret, frame = cap.read() 
     if ret: 
       gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 
       faces = face_cascade.detectMultiScale(gray, 1.3,5) 

       for (x,y,w,h) in faces: 
         cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2) 
         roi_gray = gray[y:y+h,x:x+w] 
         roi_color = frame[y:y+h,x:x+w] 
         count += 1 
         print 'face detected' 

       cv2.imshow('frame',frame) 
       if cv2.waitKey(10) & 0xFF == ord('q'): 
         break 
     else: break 

print count 
+0

Danke, das hat mein Problem gelöst, aber ich verstehe nicht, was ist der Zweck des Hinzufügens von 'if ret' und was ist es getan, damit das Skript richtigen Rahmen lesen? –

+1

In Ihrem Code wird die while-Schleife auch dann fortgesetzt, wenn das Video beendet ist. ret ist nur ein Flag, um zu wissen, ob der Frame richtig gelesen wurde oder nicht. Dann können Sie Ihre Operationen ausführen –

Verwandte Themen