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

思路:利用训练好的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
  • 0
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
OpenCV是一个广泛使用的计算机视觉库,提供了丰富的图像处理和计算机视觉算法,可以用于实现手掌检测。以下是一个基于OpenCV手掌检测实现: 1. 数据采集:使用摄像头或其他设备采集手掌图像数据,并进行标注和分类。 2. 图像预处理:对采集的手掌图像进行预处理,例如去噪、增强对比度、裁剪等。 3. 手掌检测:使用OpenCV提供的函数和算法来检测图像中的手掌区域。以下是一个简单的手掌检测示例代码: ```python import cv2 # 加载图像 img = cv2.imread('hand.jpg') # 预处理图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) blurred = cv2.GaussianBlur(gray, (11, 11), 0) thresh = cv2.threshold(blurred, 60, 255, cv2.THRESH_BINARY)[1] # 查找手掌轮廓 contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 找出最大的轮廓 cnt = max(contours, key=cv2.contourArea) # 找出手掌的凸包 hull = cv2.convexHull(cnt) # 画出手掌轮廓和凸包 cv2.drawContours(img, [cnt], 0, (0, 255, 0), 2) cv2.drawContours(img, [hull], 0, (0, 0, 255), 3) # 显示结果 cv2.imshow('Hand Detection', img) cv2.waitKey(0) ``` 该代码加载一张手掌图像,使用高斯滤波和二值化等预处理方法,然后使用OpenCV提供的`findContours`函数找到手掌的轮廓,进而找到手掌的凸包,最后在原图像上绘制手掌轮廓和凸包。运行该代码可以得到手掌检测结果。 需要注意的是,实现手掌检测需要根据具体的应用场景和需求选择合适的算法和方法,同时也需要进行参数优化和调试,以提高检测准确率和鲁棒性。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值