利用OpenCV检测手掌(palm)和拳头(fist)

本文介绍如何利用OpenCV的CascadeClassifier结合palm.xml和fist.xml文件,对图像进行手掌和拳头检测。通过detectMultiScale检测多个帧,然后使用groupRectangles进行聚类分组,最终筛选出有效检测结果,并以不同颜色标注。详细步骤包括矩形区域存储、聚类以及结果绘制。提供了相关资源链接和groupRectangles函数的说明。
摘要由CSDN通过智能技术生成

思路:利用训练好的palm.xml和fist.xml文件,用OpenCV的CascadeClassifier对每一帧图像检测palm和fist,之后对多帧中检测到的palm和fist进行聚类分组,满足分组条件的区域为最终检测结果。


代码:

 #include "opencv2/objdetect/objdetect.hpp"
 #include "opencv2/highgui/highgui.hpp"
 #include "opencv2/imgproc/imgproc.hpp"

 #include <iostream>
 #include <stdio.h>

 using namespace std;
 using namespace cv;

 /** Function Headers */
 void detectAndDisplay( Mat frame );
 void RestoreVectors(vector<vector<Rect>>& vecs_bank, vector<Rect>& 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 */
void detectAndDisplay( Mat frame )
{
  std::vector<Rect> faces;
  std::vector<Rect> palms;
  std::vector<Rect> fists;
  static vector<vector<Rect>> palms_bank;
  static vector<vector<Rect>> 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());

  vector<Rect> palmAll;
  RestoreVectors(palm
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值