#include "opencv2/objdetect/objdetect.hpp"#include"opencv2/highgui/highgui.hpp"#include"opencv2/imgproc/imgproc.hpp"#include#include
using namespacestd;using namespacecv;/** Function Headers*/
voiddetectAndDisplay( Mat frame );void RestoreVectors(vector>& vecs_bank, vector&vecAll);/** Global variables*/String palm_cascade_name= "palm.xml";
String fist_cascade_name= "fist.xml";
CascadeClassifier palm_cascade;
CascadeClassifier fist_cascade;string window_name = "Capture - Palm and fist detection";/** @function main*/
int main( int argc, const char**argv )
{
CvCapture*capture;
Mat frame;//-- 1. Load the cascades
if( !palm_cascade.load( palm_cascade_name ) ){ printf("--(!)Error loading\n"); return -1; };if( !fist_cascade.load( fist_cascade_name ) ){ printf("--(!)Error loading\n"); return -1; };//-- 2. Read the video stream
capture = cvCaptureFromCAM( -1);if( capture )
{while( true)
{
frame=cvQueryFrame( capture );//-- 3. Apply the classifier to the frame
if( !frame.empty() )
{ detectAndDisplay( frame ); }else{ printf("--(!) No captured frame -- Break!"); break; }int c = waitKey(10);if( (char)c == ‘q‘ || (char)c == ‘Q‘ || 27 == c) { break; }
}
}
cvReleaseCapture(&capture);return 0;
}/** @function detectAndDisplay*/
voiddetectAndDisplay( Mat frame )
{
std::vectorfaces;
std::vectorpalms;
std::vectorfists;static vector>palms_bank;static vector>fists_bank;const int MAX_NUM = 3;
Mat frame_gray;
cvtColor( frame, frame_gray, CV_BGR2GRAY );
equalizeHist( frame_gray, frame_gray );//-- Palm detection
palm_cascade.detectMultiScale( frame_gray, palms, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );
palms_bank.push_back(palms);if(palms_bank.size() >MAX_NUM)
palms_bank.erase(palms_bank.begin());
vectorpalmAll;
RestoreVectors(palms_bank, palmAll);
groupRectangles(palmAll,2);for( size_t j = 0; j < palmAll.size(); j++)
{
rectangle(frame, palmAll[j], Scalar(0,255,0), 2);
}//-- Fist detection
fist_cascade.detectMultiScale( frame_gray, fists, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );
fists_bank.push_back(fists);if(fists_bank.size() >MAX_NUM)
fists_bank.erase(fists_bank.begin());
vectorfistAll;
RestoreVectors(fists_bank, fistAll);
groupRectangles(fistAll,2);for( size_t j = 0; j < fistAll.size(); j++)
{
rectangle(frame, fistAll[j], Scalar(0,0,255), 2);
}//-- Show what you got
imshow( window_name, frame );
}void RestoreVectors(vector>& vecs_bank, vector&vecAll)
{for(size_t i = 0; i < vecs_bank.size(); i++){
vecAll.insert(vecAll.end(), vecs_bank[i].begin(), vecs_bank[i].end());
}
}