J'essaie de créer un système de suivi du visage associant la classification Haar Cascade à la détection de bonnes fonctionnalités de Lucas Kanade. Cependant, je continue à avoir une erreur que je ne peux pas comprendre ce que cela signifie ni comment le résoudre.
Quelqu'un peut-il m'aider?
Erreur:
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()
Ce message d'erreur
erreur: (-215) size.width> 0 && size.height> 0 in function imshow
cela signifie simplement que imshow () n'obtient pas d'image vidéo de périphérique d'entrée . Vous pouvez essayer d'utiliser
cap = cv2.VideoCapture(1)
au lieu de
cap = cv2.VideoCapture(0)
& voyez si le problème persiste encore.
J'ai le même problème, réparer le ret en capture vidéo
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()
Vous devez retarder
Exemple de code:
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()
J'ai également fait face à ce problème et je le résous en modifiant le chemin de l'image, car si le chemin contient (par exemple:\n ou\t ou\a), la corruption sera altérée, il vous suffira donc de changer chaque barre oblique inversée "\" avec avant. -slash "/" et cela ne fera aucune erreur mais ne résoudra que le problème du chemin de lecture
Dans ces deux lignes:
mask = cv2.line(mask, (a,b),(c,d), color[i].tolist(), 2)
frame = cv2.circle(frame,(a, b),5,color[i].tolist(),-1)
essayez plutôt:
cv2.line(mask, (a,b),(c,d), color[i].tolist(), 2)
cv2.circle(frame,(a, b),5,color[i].tolist(),-1)
J'ai eu le même problème et les variables étaient retournées vides
cv2.circle
et cv2.lines
ne fonctionnent pas. Le masque et le cadre renvoient tous les deux None
. ces fonctions (ligne et cercle) sont dans l'openv 3 mais pas dans les versions antérieures.
J'utilise ssh pour me connecter au serveur distant et que le code python exécute cv2.VideoCapture (0) pour capturer la webcam distante, puis je rencontre le message d'erreur suivant:
erreur: (-215) size.width> 0 && size.height> 0 in function imshow
Enfin, je dois accorder l'accès à/dev/video0 (qui est mon périphérique de webcam) avec mon compte d'utilisateur et le message d'erreur a disparu. Utilisez usermod pour ajouter un utilisateur à la vidéo du groupe
usermod -a -G video user
C’est un problème de consommation d’espace ou de choix de la mauvaise caméra ..__Ma suggestion de redémarrer le noyau, d’effacer la sortie et de la réexécuter . Cela fonctionne alors.
J'ai également rencontré le message d'erreur dans Raspberry Pi 3, mais ma solution est de recharger le noyau de la caméra après une recherche sur Google, en espérant qu'il puisse vous aider.
Sudo modprobe bcm2835-v4l2
BTW, pour cette erreur s'il vous plaît vérifier votre caméra et le chemin du fichier est réalisable ou non
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)
J'ai aussi rencontré ce problème. Dans mon cas, le chemin de l'image est incorrect, donc img read est NoneType
. Après avoir corrigé le chemin de l'image, je peux l'afficher sans problème.