Распознавание лиц с использованием opencv и python
Я работаю над распознаванием лиц в OpenCV(2.4.6) и python(2.7). У меня очень простой код, но он не дает мне желаемого результата.
Это мой код:
import numpy as np
import cv2
cam = cv2.VideoCapture(0)
name = 'detect'
face_cascade = cv2.CascadeClassifier('C:\opencv\data\haarcascades\haarcascade_frontalface_default.xml')
cv2.namedWindow(name, cv2.WINDOW_AUTOSIZE)
while True:
s, img = cam.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(img, 1.3, 5)
for (x,y,w,h) in faces:
img = cv2.rectangle(gray,(x,y),(x+w,y+h),(255,0,0),2)
cv2.imshow(name, img)
k = cv2.waitKey(0)
if k == 27:
cv2.destroyWindow(name)
break
Когда я запускаю этот код, моя веб-камера запустится, и у меня появится пустое окно, подобное этому
Затем веб-камера выключится, и в редакторе я получу сообщение об ошибке:
%run "D:/6th sem/1.OpenCV + Python/det.py"
---------------------------------------------------------------------------
error Traceback (most recent call last)
C:\Users\HP\AppData\Local\Enthought\Canopy32\App\appdata\canopy-1.3.0.1715.win-x86\lib\site-packages\IPython\utils\py3compat.pyc in execfile(fname, glob, loc)
195 else:
196 filename = fname
--> 197 exec compile(scripttext, filename, 'exec') in glob, loc
198 else:
199 def execfile(fname, *where):
D:\6th sem\1.OpenCV + Python\det.py in <module>()
7 while True:
8 s, img = cam.read()
----> 9 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
10 faces = face_cascade.detectMultiScale(img, 1.3, 5)
11 #print s
error: ..\..\..\src\opencv\modules\imgproc\src\color.cpp:3402: error: (-215) scn == 3 || scn == 4
Любые предложения приветствуются. Заранее спасибо.
1 ответ
Решение
Некоторые веб-камеры нуждаются в разогреве и доставляют пустые кадры при запуске. Вы хотите проверить это.
Кроме того, кто сказал, что cv2.rectangle возвращает что-нибудь? откуда у тебя эта идея? от ТАК?
while cap.isOpened():
s, img = cam.read()
if s == None:
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5) #hmm, 5 required neighbours is actually a lot.
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) # if you want colors, don't paint into a grayscale...
cv2.imshow(name, img)
k = cv2.waitKey(0)
if k == 27:
cv2.destroyWindow(name)
break