当前位置: 首页 > 工具软件 > Fist > 使用案例 >

opencv手掌跟踪_利用OpenCV检测手掌(palm)和拳头(fist)

南宫博简
2023-12-01

#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());

}

}

 类似资料: