2015-02-12 4 views
0

Я написал и просмотрел этот код несколько раз, и мне кажется, что это очень удобно и прямолинейно (выложил фрагмент из учебника opencv) однако он все еще дает мне ошибку. Я проверил ошибку, и я понимаю, что у нее отсутствуют каналы, однако я не знаю, как это исправить. Любая помощь будет оценена по достоинству. Я использую Windows x64 и Spyder (из дистрибутива Anaconda) в качестве моей IDE. Это может быть проблема с оборудованием? (Веб-камера)OpenCV 3.0 Beta - Python - Обнаружение лица с помощью веб-камеры - код дает мне ошибку

##################################################### 
    #    Face Detection (Video)    # 
    ##################################################### 

    import numpy as np 
    import cv2 

    face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') 
    eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml') 

    video = cv2.VideoCapture(0) 
    ret, frame = video.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] 
     eyes = eye_cascade.detectMultiScale(roi_gray) 
     for (ex,ey,ew,eh) in eyes: 
      cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2) 


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

    video.release() 
    cv2.destroyAllWindows() 

Вот ошибка я получаю:

error: ..\..\..\..\opencv\modules\imgproc\src\color.cpp:5731: 
error: (-215) scn == 3 || scn == 4 in function cv::cvtColor 
+0

изображение пустой, он не мог читать с вашего захвата. проверьте 'ret' и' video.isOpened() '. то снова я уже вижу следующую проблему, поэтому, пожалуйста, также проверяйте 'face_cascade.isOpened()' .... – berak

+0

@berak Вы правы. Он не читает видео. Любая идея о том, как это исправить? print video.read() (False, None – Shideh

+0

Некоторые старые веб-камеры нуждаются в разминке и доставляют пустые кадры при запуске, поэтому, если захват открыт, вы можете попробовать прочитать несколько фиктивных кадров и снова проверить – berak

ответ

4

я предполагаю, что вы хотели «непрерывное обнаружение, а не 'один выстрел', правильно?

вы только некоторые небольшие изменения в сторону:

import numpy as np 
import cv2 

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') 
if face_cascade.empty(): raise Exception("your face_cascade is empty. are you sure, the path is correct ?") 

eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml') 
if eye_cascade.empty(): raise Exception("your eye_cascade is empty. are you sure, the path is correct ?") 

video = cv2.VideoCapture(0) 
while(video.isOpened()): 
    ret, frame = video.read() 
    if frame not None: 
     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] 
      eyes = eye_cascade.detectMultiScale(roi_gray) 
      for (ex,ey,ew,eh) in eyes: 
       cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2) 
     cv2.imshow('Video', frame) 
    if cv2.waitKey(1) & 0xFF == ord('q'): 
     break 

video.release() 
cv2.destroyAllWindows() 
+0

Другая ошибка: значение истинности массива с более чем одним элементом неоднозначно. Используйте a.any() или a.all() @berak – Shideh

+1

sorr y, не проверял. 'if frame not None:', возможно – berak

+1

Спасибо! Это решило. – Shideh