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