HOG + SVM 实现静态手势识别 (基于Android平台实现)
2016-08-29 23:31
579 查看
HOG特征,最经典的用途就是行人检测。其实不只是做行人跟踪,在做静态手势识别方面,也还是不错的,网上也有不少人实现过,但是基于Android平台的不多。本文利用OpenCV + Android 平台实现了 张开的手掌的 静态识别。
硬件: Samsung Note3 N9008 (高通枭龙800处理器,2013年的主流配置)
软件:Opencv + Android 5.1
开始以为用手机做HOG特征检测,并且实现多尺度检测必然卡成翔,但是出乎意料的是,1920*1080P分辨率,大概5s种就能检测一帧,虽然不能用作实时视频检测,但是也不错了,相信如果继续优化,降低运算量,效果还是不错的。
先上几张图:
绿色框框内即为显示的手势。
代码其实很简单,因为利用OpenCV,已经帮我们实现了许多底层细节,包括特征值的计算、SVM分配器的训练、以及很多图像细节处理。放出几段关键代码,主要是JNI编程部分:
主Activity部分,主要就是处理图像采集,代码量比较小:
通过缩放到原来的四分之一,即480*270 的分辨率,可以大大加快检测速度,大概能到10帧每秒的速度。这个成绩已经不错了,毕竟是ARM处理器。要知道Intel I3 处理器 ,640*480分辨率,也就20帧左右。
初步就这样了,后续看看能否继续优化或者改进算法。 关于SVM分类器训练,网上一搜一大把,就不详细介绍了。附上我以前的论文一篇,详细介绍了HOG+SVM检测:
http://wenku.baidu.com/view/d00ca57310a6f524cdbf8557
硬件: 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
相关文章推荐
- 基于HOG和SVM的复杂背景下的手势识别应用于Android手机相册管理(录像)
- 浅析基于Android、iOS平台的移动端车牌识别实现过程
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- android学习笔记---47-android_手势识别技术的实现,手势库的创建
- 基于opencv的手写数字识别(MFC,HOG,SVM)
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- android学习笔记---47-android_手势识别技术的实现,手势库的创建
- 基于Android平台多个Icon的APk——实现多程序入口总结(转)
- 自己动手实现Android平台手写体数字识别之识别算法准备
- Android成长之路-手势识别的实现
- 一、东软实践项目2-基于android平台的应用开发:实现页面之间的跳转
- 基于rtsp的手机视频点播实现和研究(扩展支持android, ios平台)
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- 基于Android平台的串口通信实现
- 在Android平台上实现条型码扫描与识别
- 实现在Android 多点手势识别
- 基于Android平台的鼠标设计与实现