4

I am trying to detect the face from the webcam using opencv python on ubuntu. I got this online code and tried running this program and I am getting the as NULL array pointer is passed, I guess it is not able to capture the video from webcam but with the same code(only capture camera) I got the camera on and it captured the video. Here is my code:

import cv
from opencv import highgui
HAAR_CASCADE_PATH = "/home/OpenCV-2.3.1/data/haarcascades/haarcascade_frontalface_default.xml"

CAMERA_INDEX = 0 
def detect_faces(image):
 faces = []
 detected = cv.HaarDetectObjects(image, cascade, storage, 1.2, 2, cv.CV_HAAR_DO_CANNY_PRUNING, (100,100))
if detected:
    for (x,y,w,h),n in detected:
        faces.append((x,y,w,h))
return faces

if __name__ == "__main__":
cv.NamedWindow("Video", cv.CV_WINDOW_AUTOSIZE)

capture = cv.CaptureFromCAM(0)
storage = cv.CreateMemStorage()
cascade = cv.Load(HAAR_CASCADE_PATH)
print cascade
faces = []

i = 0
c = -1
while (c == -1):
    image = cv.QueryFrame(capture)


    # Only run the Detection algorithm every 5 frames to improve performance
    #if i%5==0:
    faces = detect_faces(image)
    #print image

    for (x,y,w,h) in faces:
        cv.Rectangle(image, (x,y), (x+w,y+h), 255)


    cv.ShowImage("w1", image)
    i += 1

And Error I am getting is:

Traceback (most recent call last):
File "/home/OpenCV-2.3.1/webcam_try.py", line 38, in <module>
faces = detect_faces(frame)
File "/home/OpenCV-2.3.1/webcam_try.py", line 13, in detect_faces
detected = cv.cvHaarDetectObjects(frame, cascade, storage, 1.2, 2,    cv.CV_HAAR_DO_CANNY_PRUNING,(100,100))
 File "/usr/lib/pymodules/python2.7/opencv/cv.py", line 1626, in cvHaarDetectObjects
 return _cv.cvHaarDetectObjects(*args)
 NotImplementedError: Wrong number of arguments for overloaded function     'cvHaarDetectObjects'.
 Possible C/C++ prototypes are:
  cvHaarDetectObjects_Shadow(CvArr const *,CvHaarClassifierCascade *,CvMemStorage *,double,int,int,CvSize)
  cvHaarDetectObjects_Shadow(CvArr const *,CvHaarClassifierCascade *,CvMemStorage *,double,int,int)
  cvHaarDetectObjects_Shadow(CvArr const *,CvHaarClassifierCascade *,CvMemStorage *,double,int)
  cvHaarDetectObjects_Shadow(CvArr const *,CvHaarClassifierCascade *,CvMemStorage *,double)
  cvHaarDetectObjects_Shadow(CvArr const *,CvHaarClassifierCascade *,CvMemStorage *)

2 Answers 2

4

Your code worked fine for me (although I'm running OpenCV v2.4.3 instead of your version, 2.3.1). I started working from the same online code (posted here) last week, and I eventually gave up on using cv and switched to the new cv2 library.

So. I've updated your code so that it uses the new cv2 interface.

The cv2 Python interface for running Haar Cascade Classifiers is much easier to use. Check out the documentation for cv2.CascadeClassifier.detectMultiScale() here. The new cv2 interface simplifies your code significantly. Here are the highlights:

  1. You no longer have to worry about creating memory buffers.
  2. The results that are returned from detectMultiScale come back in a super useful form, eliminating the need for your old code's detect_faces() function!
  3. You only need to provide one parameter: the image itself. All other parameters are optional. I've included the parameters you were using in the revised code below, but feel free to remove them.

One piece of advice: if your code is running slowly, one of the best things you can do is increase the minSize. For my webcam, using (100,100) causes a super-slow frame rate of about 0.2fps. Changing it to (300,300) boosts it to the respectable 20fps.

The code should work on your existing installation since you're running 2.3.1, but if it doesn't then try upgrading to the latest version.

import cv2
import cv2.cv as cv

HAAR_CASCADE_PATH = "/home/OpenCV-2.3.1/data/haarcascades/haarcascade_frontalface_default.xml";

CAMERA_INDEX = 0;

if __name__ == "__main__":

    # Open window, load webcam and load Haar cascade classifier
    cv2.namedWindow("Video", cv.CV_WINDOW_AUTOSIZE)
    capture = cv2.VideoCapture(CAMERA_INDEX);
    cascade = cv2.CascadeClassifier(HAAR_CASCADE_PATH);

    i = 0;

    while True:
        # Grab frame from webcam
        retVal, image = capture.read(); # note: ignore retVal

        # Only run the Detection algorithm every 5 frames to improve performance
        #if i%5==0:
        faces = cascade.detectMultiScale(image, scaleFactor=1.2, 
                                        minNeighbors=2, minSize=(100,100), 
                                        flags=cv.CV_HAAR_DO_CANNY_PRUNING);

        # Draw rectangles on image, and then show it
        for (x,y,w,h) in faces:
            cv2.rectangle(image, (x,y), (x+w,y+h), 255)
        cv2.imshow("Video", image)

        i += 1;
6
  • Thanks a lot, It is not working on my system. Error as:Unrecognized or unsupported array type in function cvGetMat. Before installing opencv2.4.3 I want to know, will it work on ubuntu 11.10 system and python 2.7. Because I had faced a lot problem when inatslling opencv2.3.1, so just want to confirm. Thank you.
    – shreya
    Jan 4, 2013 at 5:09
  • Hi, I have upgrade it to Opencv-2.4.3. After running your code, it is giving me an error as: Traceback (most recent call last): File "/home/vidula/OpenCV-2.3.1/draft_1.py", line 25, in <module> flags=cv.CV_HAAR_DO_CANNY_PRUNING) error: /home/vidula/OpenCV-2.4.3/modules/core/src/array.cpp:2482: error: (-206) Unrecognized or unsupported array type in function cvGetMat What does this mean?
    – shreya
    Jan 4, 2013 at 8:57
  • It means that there is a problem with the array you're passing to imshow(). Try again after reading my answer to your other question. Jan 4, 2013 at 15:18
  • Hi,I have installed it successfully, but code you have given above is not working, simply is flashing the camera light and without any error, I am trying to find it out, and 1 more question I have, i was trying to use highgui in the code but it giving me error as no module highgui, and it is not able to import opencv also, is it because of the version 2.4.3? Thankyou,And really very sorry to disturb you.
    – shreya
    Jan 8, 2013 at 10:15
  • You only need to import cv2... it loads highgui automatically. Jan 9, 2013 at 22:53
2

I changed Brandon's code a little bit after referring to http://goo.gl/UziMVU. This is a working code for me.

import cv2
import cv2.cv as cv

HAAR_CASCADE_PATH = "/usr/local/Cellar/opencv/2.4.6.1/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml"

cv2.namedWindow("preview")
vc = cv2.VideoCapture(0);
cascade = cv2.CascadeClassifier(HAAR_CASCADE_PATH);

retVal, frame = vc.read(); # note: ignore retVal

while True:
    if frame is not None:   
        faces = cascade.detectMultiScale(frame, scaleFactor=1.2, minNeighbors=2, flags=cv.CV_HAAR_DO_CANNY_PRUNING, minSize=(100,100));

        for (x,y,w,h) in faces:
            cv2.rectangle(frame, (x,y), (x+w,y+h), 255)

        cv2.imshow("preview", frame)
    rval, frame = vc.read()

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.