Ich versuche, einen Gesichtsverfolger zu entwickeln, der die Haar-Cascade-Klassifizierung mit der guten Funktionserkennung von Lucas Kanade kombiniert. Ich bekomme jedoch immer einen Fehler, dass ich nicht herausfinden kann, was es bedeutet oder wie ich es lösen kann.
Kann mir hier jemand weiterhelfen?
Error:
line 110, in <module>
cv2.imshow('frame',img)
error: /build/buildd/opencv-2.4.8+dfsg1/modules/highgui/src/window.cpp:269:
error: (-215)size.width>0 && size.height>0 in function imshow
Code:
from matplotlib import pyplot as plt
import numpy as np
import cv2
face_classifier = cv2.CascadeClassifier('haarcascades/haarcascade_frontalface_default.xml')
cap = cv2.VideoCapture(0)
# params for ShiTomasi corner detection
feature_params = dict( maxCorners = 200,
qualityLevel = 0.01,
minDistance = 10,
blockSize = 7 )
# Parameters for lucas kanade optical flow
lk_params = dict( winSize = (15,15),
maxLevel = 2,
criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))
# Create some random colors
color = np.random.randint(0,255,(100,3))
# Take first frame and find corners in it
ret, old_frame = cap.read()
cv2.imshow('Old_Frame', old_frame)
cv2.waitKey(0)
old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY)
restart = True
#while restart == True:
face = face_classifier.detectMultiScale(old_gray, 1.2, 4)
if len(face) == 0:
print "This is empty"
for (x,y,w,h) in face:
focused_face = old_frame[y: y+h, x: x+w]
cv2.imshow('Old_Frame', old_frame)
face_gray = cv2.cvtColor(old_frame,cv2.COLOR_BGR2GRAY)
gray = cv2.cvtColor(focused_face,cv2.COLOR_BGR2GRAY)
corners_t = cv2.goodFeaturesToTrack(gray, mask = None, **feature_params)
corners = np.int0(corners_t)
print corners
for i in corners:
ix,iy = i.ravel()
cv2.circle(focused_face,(ix,iy),3,255,-1)
cv2.circle(old_frame,(x+ix,y+iy),3,255,-1)
plt.imshow(old_frame),plt.show()
# Create a mask image for drawing purposes
mask = np.zeros_like(old_frame)
while(1):
ret,frame = cap.read()
frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# calculate optical flow
p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, corners_t, None, **lk_params)
# Select good points
good_new = p1[st==1]
good_old = corners_t[st==1]
# draw the tracks
print "COLORING TIME!"
for i,(new,old) in enumerate(Zip(good_new,good_old)):
print i
print color[i]
a,b = new.ravel()
c,d = old.ravel()
mask = cv2.line(mask, (a,b),(c,d), color[i].tolist(), 2)
frame = cv2.circle(frame,(a, b),5,color[i].tolist(),-1)
if i == 99:
break
img = cv2.add(frame,mask)
cv2.imshow('frame',img)
k = cv2.waitKey(30) & 0xff
if k == 27:
break
# Now update the previous frame and previous points
old_gray = frame_gray.copy()
p0 = good_new.reshape(-1,1,2)
cv2.destroyAllWindows()
cap.release()
Diese Fehlermeldung
fehler: (-215) size.width> 0 && size.height> 0 in Funktion imshow
bedeutet einfach, dass imshow () kein Video-Frame vom Eingabegerät erhält . Sie können es mit versuchen
cap = cv2.VideoCapture(1)
anstatt
cap = cv2.VideoCapture(0)
und sehen, ob das Problem weiterhin besteht.
Ich habe das gleiche Problem, das Ret-Capture-Video zu beheben
import numpy as np
import cv2
# Capture video from file
cap = cv2.VideoCapture('video1.avi')
while True:
ret, frame = cap.read()
if ret == True:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame',gray)
if cv2.waitKey(30) & 0xFF == ord('q'):
break
else:
break
cap.release()
cv2.destroyAllWindows()
Du musst warten
Beispielcode:
import cv2
import numpy as np
import time
cam = cv2.VideoCapture(0)
time.sleep(2)
while True:
ret,frame = cam.read()
cv2.imshow('webcam', frame)
if cv2.waitKey(1)&0xFF == ord('q'):
break
cam.release()
cv2.destroyAllWindows()
Ich bin auch mit diesem Problem konfrontiert und löse es, indem ich den Pfad des Bildes ändere, denn wenn der Pfad enthält (zum Beispiel:\n oder\t oder\a), führt dies zu Korruption. Ändern Sie also einfach jeden Schrägstrich "\" mit der Vorderseite -slash "/" und es wird kein Fehler gemacht, nur das Problem des Lesepfads wird behoben
In diesen zwei Zeilen:
mask = cv2.line(mask, (a,b),(c,d), color[i].tolist(), 2)
frame = cv2.circle(frame,(a, b),5,color[i].tolist(),-1)
stattdessen versuchen:
cv2.line(mask, (a,b),(c,d), color[i].tolist(), 2)
cv2.circle(frame,(a, b),5,color[i].tolist(),-1)
Ich hatte das gleiche Problem und die Variablen wurden leer zurückgegeben
cv2.circle
und cv2.lines
funktionieren nicht. Sowohl Maske als auch Frame geben None
zurück. Diese Funktionen (Linie und Kreis) sind in opencv 3 enthalten, nicht jedoch in älteren Versionen.
Ich verwende ssh, um mich mit dem Remote-Server zu verbinden, und Python-Code muss cv2.VideoCapture (0) ausführen, um die Remote-Webcam zu erfassen.
fehler: (-215) size.width> 0 && size.height> 0 in Funktion imshow
Schließlich muss ich mit meinem Benutzerkonto Zugriff auf/dev/video0 (das ist mein Webcam-Gerät) gewähren, und die Fehlermeldung war verschwunden. Verwenden Sie usermod, um Benutzer in ein Gruppenvideo einzufügen
usermod -a -G video user
Dies ist ein Problem mit dem Speicherplatzverbrauch oder der Wahl der falschen Kamera. Mein Vorschlag, den Kernel neu zu starten und die Ausgabe zu löschen und erneut auszuführen.
Ich habe auch die Fehlermeldung in Raspberry Pi 3 getroffen, aber meine Lösung besteht darin, den Kernel der Kamera nach der Suche bei Google neu zu laden. Ich hoffe, es kann Ihnen helfen.
Sudo modprobe bcm2835-v4l2
Übrigens, für diesen Fehler überprüfen Sie bitte, ob Ihre Kamera und der Dateipfad funktionsfähig sind oder nicht
while(cap.isOpened()):
ret, img = cap.read()
print img
if img==None: #termino los frames?
break #si, entonces terminar programa
#gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('img2',img)
Obwohl dies ein alter Thread ist, habe ich auch diesen Fehler erhalten und die Lösung, die für mich funktioniert hat, wird hier nicht erwähnt.
Einfach gesagt, in meinem Fall war die Webcam im Hintergrund noch in Gebrauch, als ich sah, dass das LED-Licht an war. Ich konnte das Problem noch nicht reproduzieren, daher bin ich mir nicht sicher, ob eine einfache cv2.VideoCapture(0).release()
es gelöst hätte. Ich werde diesen Beitrag bearbeiten, wenn ich es herausgefunden habe.
Für mich löste ein Neustart meines PCs das Problem, ohne dass etwas am Code geändert wurde.
Ich habe auch dieses Problem getroffen. In meinem Fall ist der Bildpfad falsch, daher lautet das Bild img NoneType
. Nachdem ich den Bildpfad korrigiert habe, kann ich ihn ohne Probleme anzeigen.