I have a very basic face detection routine running with the Raspberry Pi camera board.
To do this I used Robidouille’s library functions (see previous post). I then modified the raspicam_cv.c example to use the face detection routine from Learning OpenCV. There were some tweaks so I will post the code below. You also need to modify the makefile to include the OpenCV object detection libraries.
/* Modified from code supplied by Emil Valkov (Raspicam libraries) and Noah Kuntz (Face detection) License: http://www.opensource.org/licenses/bsd-license.php */ #include <cv.h> #include <highgui.h> #include "RaspiCamCV.h" int main(int argc, const char** argv){ //Initialise Camera object RaspiCamCvCapture * capture = raspiCamCvCreateCameraCapture(0); // Index doesn't really matter //initialise memory storage for Haar objects CvMemStorage* storage = cvCreateMemStorage(0); //Set up Haar Cascade - need quoted file in directory of program CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad( "haarcascade_frontalface_alt2.xml", 0, 0, 0); //Set scale down factor double scale = 1.8; //Set colours for multiple faces static CvScalar colors[] = { {{0,0,255}}, {{0,128,255}}, {{0,255,255}}, {{0,255,0}}, {{255,128,0}}, {{255,255,0}}, {{255,0,0}}, {{255,0,255}} }; //Open Window for Viewing cvNamedWindow("RaspiCamTest", 1); //Loop for frames - while no keypress do { //Capture a frame IplImage* img = raspiCamCvQueryFrame(capture); //Clear memory object cvClearMemStorage( storage ); // IMAGE PREPARATION: //Initialise grayscale image IplImage* gray = cvCreateImage( cvSize(img->width,img->height), 8, 1 ); //Shrink image IplImage* small_img = cvCreateImage(cvSize( cvRound(img->width/scale), cvRound(img->height/scale)), 8, 1 ); //Convert to gray cvCvtColor( img, gray, CV_BGR2GRAY ); //Resize to small image size cvResize( gray, small_img, CV_INTER_LINEAR ); //Finished with gray image - release memory cvReleaseImage( &gray ); //Vertical flip image as camera is upside down cvFlip(small_img, NULL, -1); //Equalise cvEqualizeHist( small_img, small_img ); // Detect objects - last arg is max size -test parameters to optimise //Will detect biggest face with 6th arg as 4 CvSeq* objects = cvHaarDetectObjects( small_img, cascade, storage, 1.1, 4, 4, cvSize( 40, 50 ), cvSize(small_img->width, small_img->height)); int i; // LOOP THROUGH FOUND OBJECTS AND DRAW BOXES AROUND THEM for(i = 0; i < (objects ? objects->total : 0); i++ ) { CvRect* r = (CvRect*)cvGetSeqElem( objects, i ); //My compiler doesnt seem to be able to cope with default variables - need to specify all args - need to change '.' to '->' as r is pointer //This line appears to be the problem cvRectangle(small_img, cvPoint(r->x,r->y), cvPoint(r->x+r->width,r->y+r->height), colors[i%8], 2, 8, 0); } cvShowImage("RaspiCamTest", small_img); //cvReleaseImage( &gray ); cvReleaseImage( &small_img ); } while (cvWaitKey(10) < 0); //Close window cvDestroyWindow("RaspiCamTest"); //Release memory raspiCamCvReleaseCapture(&capture); return 0; }
Makefile:
OBJS = objs CFLAGS_OPENCV = -I/usr/include/opencv LDFLAGS2_OPENCV = -lopencv_highgui -lopencv_core -lopencv_legacy -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_imgproc -lopencv_objdetect USERLAND_ROOT = $(HOME)/git/raspberrypi/userland CFLAGS_PI = \ -I$(USERLAND_ROOT)/host_applications/linux/libs/bcm_host/include \ -I$(USERLAND_ROOT)/host_applications/linux/apps/raspicam \ -I$(USERLAND_ROOT) \ -I$(USERLAND_ROOT)/interface/vcos/pthreads \ -I$(USERLAND_ROOT)/interface/vmcs_host/linux \ -I$(USERLAND_ROOT)/interface/mmal \ LDFLAGS_PI = -L$(USERLAND_ROOT)/build/lib -lmmal_core -lmmal -l mmal_util -lvcos -lbcm_host BUILD_TYPE=debug #BUILD_TYPE=release CFLAGS_COMMON = -Wno-multichar -g $(CFLAGS_OPENCV) $(CFLAGS_PI) -MD ifeq ($(BUILD_TYPE), debug) CFLAGS = $(CFLAGS_COMMON) endif ifeq ($(BUILD_TYPE), release) CFLAGS = $(CFLAGS_COMMON) -O3 endif LDFLAGS = LDFLAGS2 = $(LDFLAGS2_OPENCV) $(LDFLAGS_PI) -lX11 -lXext -lrt -lstdc++ RASPICAMCV_OBJS = \ $(OBJS)/RaspiCamControl.o \ $(OBJS)/RaspiCLI.o \ $(OBJS)/RaspiCamCV.o \ RASPICAMTEST_OBJS = \ $(OBJS)/RaspiCamTest.o \ TARGETS = libraspicamcv.a raspicamtest all: $(TARGETS) $(OBJS)/%.o: %.c gcc -c $(CFLAGS) $< -o $@ $(OBJS)/%.o: $(USERLAND_ROOT)/host_applications/linux/apps/raspicam/%.c gcc -c $(CFLAGS) $< -o $@ libraspicamcv.a: $(RASPICAMCV_OBJS) ar rcs libraspicamcv.a -o $+ raspicamtest: $(RASPICAMTEST_OBJS) libraspicamcv.a gcc $(LDFLAGS) $+ $(LDFLAGS2) -L. -lraspicamcv -o $@ clean: rm -f $(OBJS)/* $(TARGETS) -include $(OBJS)/*.d