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 *)
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
cvand switched to the newcv2library.So. I’ve updated your code so that it uses the new
cv2interface.The
cv2Python interface for running Haar Cascade Classifiers is much easier to use. Check out the documentation forcv2.CascadeClassifier.detectMultiScale()here. The newcv2interface simplifies your code significantly. Here are the highlights:detectMultiScalecome back in a super useful form, eliminating the need for your old code’sdetect_faces()function!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.