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

该博客介绍了一个利用OpenCV库进行手掌(palm)和拳头(fist)检测的程序。通过加载预训练的手掌和拳头级联分类器,程序能够从视频流中实时检测并显示检测到的手掌和拳头区域,应用了detectMultiScale函数进行特征检测,并使用groupRectangles进行矩形归一化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值