基于单 camera的手势识别

这篇博客主要介绍了基于视觉的手势识别算法,通过opencv的haar特征库进行训练,达到在2米内手掌识别率90%以上的效果,运行速度为15fps,占用cpu30%。尽管存在精度问题和haar的版权问题,但通过检测手轮廓的内凹陷、相对位置和肤色特征,能有效识别手掌。由于仅使用单camera,无法识别3d空间位置,是目前的主要缺点。
android平台测试程序见附件。

http://pan.baidu.com/s/1gd5nthL    

密码: h46g


基于视觉的动作识别,一直以来的最大问题是精度问题。 - -!


刚刚做了一套手势识别的算法,在此做下简单总结

先说下我做的效果:

     2m内手掌识别率在90%以上(强光干扰下效果烂成渣渣了。。so。。 扣掉10%)

     处理速度,15fps 

     cpu  30%  (arm 4核)

以上效果为平板测试结果


1> 目的: opencv的haar特征库用来训练各种手势其实是很强势,很好用的东西,唯一的缺点是: Haar版权问题。。,

     Haar训练需要的样本数也是一个蛮头疼的问题,识别准确性完全取决于样本数量和质量,没有几十k的样本,效果只能呵呵了

    还好,条条大路通罗马,

2>外围设备:  摄像头,这是基本的

                          深度传感器     ,这是一直想要的,可惜到现在也没搞到

                         红外传感器        ,同上。。。。。

3> 检测方式:  利用手势的特征点:

                         手掌的特征点还是挺多的,我使用的是手轮廓的5个内凹陷,再加上相对位置,再加上人体肤色的特征

                         基本一个完整的手就检测出来了

4> 缺点:   精度缺失 ,没办法识别3d空间位置,单camera。。。。



--------------------------------code 分割线--------------------------------------------------------

肤色过滤部分

#include "utils.h"

cv::Mat edgeFilter();
void areaFilter(cv::Mat srcMask);
void skinFilter();


cv::Scalar YUV_SKIN_BEGIN = cv::Scalar(0,133,77);   // 论文肤色(0,133,77)->(256,173,127)
cv::Scalar YUV_SKIN_END   = cv::Scalar(256,173,127);

cv::Scalar COLOR_RED = cv::Scalar(0,0,255);
cv::Scalar COLOR_GREEN = cv::Scalar(0,255,0);
cv::Scalar COLOR_BLUE = cv::Scalar(255,0,0);

#ifdef USE_SHARP
cv::Mat sharpKernal = (cv::Mat_<float>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
#endif

cv::Mat morphKernal = cv::getStructuringElement(cv::MORPH_RECT,cv::Size(3,3),cv::Point(1,1) );

cv::Size pSize = cv::Size(320,240);
//  边缘轮廓
cv::Mat edgeFilter(){
#ifdef USE_EDGE
#ifdef DEBUG
long begT = getTime(true);
#endif
    cv::Mat g = gray.clone();

    if(withRsize)
        resize(g,g,pSize);
    equalizeHist(g,g);
    Canny(g,g,100,300,3);
    g = g > 1;

#ifdef USE_SHARP
long usec = getTime(true);
    filter2D(gray, gray, gray.depth(), sharpKernal); //卷积
LOGD("filter2D(%d*%d): %d us",gray.cols,gray.rows,(int)(getTime(true)-usec));
#endif

#ifdef USE_ERODE
    dilate(gray,gray,morphKernal);
#endif

    if(withRsize)
        resize(g,g,src.size());

#ifdef DEBUG
    int w = withRsize? 320 : gray.cols;
    int h = withRsize? 240 : gray.rows;
    cv::Mat can;
    cvtColor(g,can,CV_GRAY2BGR);
    //src.copyTo(can,g);
    //addWeighted(src,1.0,can,1.0,1.0,src);
    src = src + can;
LOGD("edgeFilter(%d*%d): %d us",w,h,(int)(getTime(true)-begT));
#endif
    return g;
#endif //USE_EDGE
}

// 小面积过滤
void areaFilter(cv::Mat srcMask){
#ifdef USE_SF_AREA
#ifdef DEBUG
long usec = getTime(true);
#endif
    cv::Mat temp = srcMask.clone(); // 二值化图像
    std::vector<std::vector<cv::Point> > points;
    std::vector<cv::Vec4i> vecs;
    findContours(temp, points, vecs,
	      CV_RETR_EXTERNAL,  CV_CHAIN_APPROX_SIMPLE );

    if(points.size()<=0 || vecs.size()<=0) {
         skin.setTo(0);
         return;
    }

    std::vector<std::vector<cv::Point> > points_poly(points.size());
    std::vector<cv::Rect> bound(points.size());
    std::vector<int> usefulList;
    std::vector<float> areaList;
    float max=0;
    for(int i=0;i>=0;i=vecs[i][0]){
	 bound[i] = boundingRect(points[i]);
         //噪声过滤(微小面积过滤)
         if( points[i].size()<6
        	|| bound[i].width < MIN_IMAGE_PIX || bound[i].height < MIN_IMAGE_PIX
                ) {
            srcMask(bound[i]).setTo(0);
            continue;
         }else{ // 多边形逼近
            approxPolyDP(points[i], points_poly[i],10,true);
            float area = fabs(contourArea(points_poly[i]));
            // 有用Rect
            usefulList.push_back(i);  // 索引
            areaList.push_back(area); // 面积
            if(max<area) max = area;  // 最大面积
        }
    }
    max *= 0.01;
    int j=usefulList.size()-1;

    for(int i=0;j>=0;j--){
        
### 基于MATLAB的手势识别系统的硬件需求与集成方案 手势识别系统是现代科技领域的重要应用方向,其结合MATLAB和计算机视觉技术,能够实现高效、准确的手势识别功能。在构建基于MATLAB的手势识别系统时,硬件需求和集成方案的选择至关重要。以下是关于硬件需求和集成方案的详细分析。 #### 1. 硬件需求 手势识别系统通常需要以下几类硬件支持,以确保数据采集、处理和输出的高效性: - **摄像头**:高质量的摄像头是手势识别系统的核心输入设备。推荐使用支持高分辨率(如1080p或更高)和高帧率(30fps或更高)的摄像头[^1]。对于深度信息的需求,可以考虑使用RGB-D摄像头(如Microsoft Kinect或Intel RealSense),这些设备能够提供三维空间信息,从而提升手势识别的准确性。 - **计算平台**:由于手势识别涉及大量的图像处理和算法运算,因此需要性能强大的计算平台。推荐配置如下: - CPU:多核处理器(如Intel i7或AMD Ryzen 7及以上)[^2]。 - GPU:如果采用深度学习模型进行手势识别,则需要配备专用GPU(如NVIDIA GTX系列或RTX系列)[^4]。 - 内存:至少16GB RAM,以支持大规模数据集的加载和实时处理。 - 存储:充足的存储空间(如500GB SSD),用于保存训练数据、模型文件和其他相关资源。 - **传感器**:除了摄像头外,还可以集成其他传感器(如加速度计、陀螺仪等)来增强手势识别的鲁棒性[^3]。这些传感器可以通过串口或USB接口与MATLAB连接。 #### 2. 集成方案 基于MATLAB的手势识别系统的集成方案主要包括以下几个方面: - **数据采集与预处理**: - 使用MATLAB的Image Acquisition Toolbox可以直接从摄像头获取视频流,并进行实时预处理(如去噪、归一化等)[^1]。 - 对于RGB-D摄像头,MATLAB还提供了Point Cloud Toolbox,可用于处理深度信息。 - **算法开发与优化**: - MATLAB提供了丰富的工具箱(如Computer Vision Toolbox、Deep Learning Toolbox等),用于实现手势识别的核心算法[^2]。 - 强化学习算法可以进一步优化手势识别系统的性能,特别是在动态环境下的适应能力[^4]。 - **实时应用与部署**: - MATLAB的Simulink工具可以用于手势识别系统的仿真和测试[^5]。 - 利用MATLAB Compiler或MATLAB Production Server,可以将手势识别算法部署到嵌入式设备或云平台上,实现实际应用。 #### 示例代码 以下是一个简的MATLAB代码示例,展示如何从摄像头获取视频流并进行基本的图像处理: ```matlab % 初始化摄像头 camera = webcam; % 获取视频帧 frame = snapshot(camera); % 显示视频帧 imshow(frame); % 转换为灰度图像 grayFrame = rgb2gray(frame); imshow(grayFrame); ``` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值