HOG + SVM 实现静态手势识别 (基于Android平台实现)

原创 2016年08月29日 23:31:06

HOG特征,最经典的用途就是行人检测。其实不只是做行人跟踪,在做静态手势识别方面,也还是不错的,网上也有不少人实现过,但是基于Android平台的不多。本文利用OpenCV + Android 平台实现了 张开的手掌的 静态识别。

硬件: Samsung Note3 N9008 (高通枭龙800处理器,2013年的主流配置)
软件:Opencv + Android 5.1

开始以为用手机做HOG特征检测,并且实现多尺度检测必然卡成翔,但是出乎意料的是,1920*1080P分辨率,大概5s种就能检测一帧,虽然不能用作实时视频检测,但是也不错了,相信如果继续优化,降低运算量,效果还是不错的。

先上几张图:

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

绿色框框内即为显示的手势。

代码其实很简单,因为利用OpenCV,已经帮我们实现了许多底层细节,包括特征值的计算、SVM分配器的训练、以及很多图像细节处理。放出几段关键代码,主要是JNI编程部分:

HOGDescriptor hog(cvSize(64,64),cvSize(16,16),cvSize(8,8),cvSize(8,8),9); //检测窗口64*64

//获取SVM描述子,这个先前已经训练好了,已txt文件形式保存了,该函数就是读取该文件,并保存在vector中
vector<float>  get_detector(const char* hogSVMDetectorPath) 
{
    vector<float> detector;
    ifstream fileIn(hogSVMDetectorPath,ios::in);
    float val = 0.0f;
    while(!fileIn.eof())
    {
        fileIn>>val;
        detector.push_back(val);
    }
    fileIn.close();

    return detector;
}


void  hog_init(void)
{
    vector<float> detector = get_detector("/sdcard/opencv/hogSVMDetector_f.txt");
    hog.setSVMDetector(detector);
}



JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial2_Tutorial2Activity_HogFeatures(JNIEnv*, jobject, jlong addrGray, jlong addrRgba)
{
    Mat& mGr  = *(Mat*)addrGray;
    Mat& mRgb = *(Mat*)addrRgba;

/*这里设置了一个缩放尺寸,由于做静态手势检测,无需1920*1080P这么高的分辨率,所以先将图像缩放到原来的四分之一,当然,也可以在相机属性上设置,直接降低采样分辨率。*/

    int scale = 4 ;  
    Mat tmp(mGr.rows /scale, mGr.cols/scale, CV_8UC1);
    resize(mGr, tmp, Size(tmp.cols, tmp.rows));

    vector<Rect>  found;
    hog_init();
    hog.detectMultiScale(tmp, found, 0, cv::Size(8,8), cv::Size(32,32), 1.05, 2);
    if (found.size() > 0)
     {
        for (int i=0; i<found.size(); i++)
        {
            /*得到的矩形框需要相应乘以4*/
            Rect tempRect(found[i].x * scale, found[i].y * scale, found[i].width * scale, found[i].height * scale);
            rectangle(mRgb, cvPoint(tempRect.x,tempRect.y),cvPoint(tempRect.x+tempRect.width,tempRect.y+tempRect.height),CV_RGB(0,255,0), 5);
        }
     }
}

主Activity部分,主要就是处理图像采集,代码量比较小:

public Mat onCameraFrame(CvCameraViewFrame inputFrame) {

            mRgba = inputFrame.rgba(); //读取当前帧
            mGray = inputFrame.gray(); //灰度化
            HogFeatures(mGray.getNativeObjAddr(), mRgba.getNativeObjAddr()); //调用Native接口函数
       }

        return mRgba;
    }

public native void HogFeatures(long matAddrGr, long matAddrRgba);

通过缩放到原来的四分之一,即480*270 的分辨率,可以大大加快检测速度,大概能到10帧每秒的速度。这个成绩已经不错了,毕竟是ARM处理器。要知道Intel I3 处理器 ,640*480分辨率,也就20帧左右。

初步就这样了,后续看看能否继续优化或者改进算法。 关于SVM分类器训练,网上一搜一大把,就不详细介绍了。附上我以前的论文一篇,详细介绍了HOG+SVM检测:
http://wenku.baidu.com/view/d00ca57310a6f524cdbf8557

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

opencv 实现的静态手势识别 进而玩剪刀石头布

用opencv实现的,通过摄像头识别手势,进而与电脑玩剪刀石头布。效果+代码。

手势识别hog和hsv

  • 2012-08-31 21:23
  • 37KB
  • 下载

Android技术——视图切换(四)“ViewSwitcher+手势识别”实现视图的滑动切换

上文《Android技术——视图切换(三)》实现的图片切换,虽然切换时有动画效果,但是却需要使用按钮才能切换。这个实例中,将尝试用手势识别代替按钮来实现图片切换。 这个实例也是基于前三篇文章里的项目添...

android手势识别的实现

1、利用手势工具绘制手势:    2、在eclipse中的File Explorer中的sdcard中导出gestures手势文件,如果没有显示,用UltraISO工具打开创建的sdcar...

Android 手势识别中的两个默认实现SimpleOnScaleGestureListener、SimpleOnGestureListener

//SimpleOnGestureListener implements OnGestureListener, OnDoubleTapListener class ZoomGesture exten...

*Android手势识别(左右滑动)实现页面切换

要实现 页面左右滑动的效果  就一定要由手势识别器, 就是这个对象 GestureDetector。 用法其实很简单,这里 写一下 方便以后用到的时候好找。 步骤就是 这样子 123.。  1. ...

【Android界面实现】使用GestureOverlayView控件实现手势识别

在Android开发中,我们不光可以使用已有的实现方式,而且,我们还可以利用Android这个智能手机平台,实现一些比较有特色的功能。本篇文章使用

Android成长之路-手势识别的实现

手势识别系统: 先把手势库放到项目中:(创建手势库见下一篇博客) 在res文件夹下新建一个名为raw的文件夹,然后把手势库放进去   然后开始项目的创建:   strings.xml: ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)