使用Haar进行人脸检测 - OpenCV python

时间:2015-03-28 11:29:41

标签: python opencv

我正在尝试这个python代码段:

import numpy as np
import cv2

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

img = cv2.imread('img.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(gray, 1.3, 3)
for (x,y,w,h) in faces:
    img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    roi_gray = gray[y:y+h, x:x+w]
    roi_color = img[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('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

但是我收到了这个错误:

Traceback (most recent call last):
  File "test.py", line 14, in <module>
    roi_color = img[y:y+h, x:x+w]
TypeError: 'NoneType' object has no attribute '__getitem__'

我找到了这个程序here

2 个答案:

答案 0 :(得分:3)

如果您确定图像路径正确并且问题仍然存在,请尝试执行以下操作:

从这一行

img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) 

删除img =,让它只是

cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)

这对我有用。

答案 1 :(得分:1)

我遇到了同样的问题,似乎代码中有一个带有img变量的错误。看起来第一个'for'循环中的img变量的第二个设置存在混淆。只需确保您也可以正确设置图像的路径。

我将代码更改为以下内容,它对我有用。

import numpy as np
import cv2

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

img = cv2.imread('/path/to/your/image/img.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(gray, 1.3, 3)
for (x,y,w,h) in faces:
    img2 = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    roi_gray = gray[y:y+h, x:x+w]
    roi_color = img[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('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()