基于g-sensor的坐下的姿势识别。手机需要放在口袋里,手机拿在手上的暂时还不支持。

如果看不明白,可以先学习这篇文章

计步算法识别:http://blog.csdn.net/finnfu/article/details/45273183

算法流程:

1.五阶移动均值滤波

2.波谷峰值检测

3.根据波形特征判断是起立还是坐下

核心代码:

package com.research.sensor.finnfu.gesturedetector.detector;import android.os.Environment;
import android.util.Log;import com.research.sensor.finnfu.gesturedetector.MyApp;import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;/*** Created by finnfu on 2017/6/3.* 坐下*/public class SitDownDetector {/** 五阶的均值滤波* 第一阶是NUM1个数的均值* 第二阶以第一阶的均值为输入,再进行NUM2个数的均值* 第三阶以第二阶的均值为输入,再进行NUM2个数的均值* 第四阶以第三阶的均值为输入,再进行NUM2个数的均值* 第五阶以第四阶的均值为输入,再进行NUM2个数的均值* */public static final int NUM1 = 8;//取平均值的个数public static final int NUM2 = 3;//取平均值的个数float[] values1 = new float[NUM1];//一阶滤波,NUM1个值float[] values2 = new float[NUM2];//二阶滤波,NUM2个值float[] values3 = new float[NUM2];//三阶滤波,NUM2个值float[] values4 = new float[NUM2];//四阶滤波,NUM2个值float[] values5 = new float[NUM2];//五阶滤波,NUM2个值int count1 = 0;int count2 = 0;int count3 = 0;int count4 = 0;int count5 = 0;ArrayList keyValuelist = new ArrayList();//存放连续的波峰波谷值public static final String KEY_NAME_VALUE = "value";public static final String KEY_NAME_TIMEMILLIS = "timemillis";public static final String KEY_NAME_TYPE = "type";//1代表波峰,-1代表波谷//检测波谷相关boolean isDirectionDecline = false;int continueDeclineCount = 0;int formerContinueDeclineCount = 0;boolean formerDeclineStatus = false;//检测波峰相关boolean isDirectionUp = false;int continueUpCount = 0;int formerContinueUpCount = 0;boolean formerUpStatus = false;float ValleyPeakThread;float ValleyThread;int TimeIntervalOfValleyAndPeak = 350;float mOldValue = 0;public SitDownDetector(){ValleyPeakThread  = MyApp.getSitValleyPeakThread();ValleyThread = MyApp.getSitValleyThread();Log.i("Thread",""+"ValleyPeakThread: "+ValleyPeakThread +" "+"ValleyThread: "+ValleyThread);}//测试函数public void testvalue(){try {String rootPath = Environment.getExternalStorageDirectory().getAbsolutePath();FileReader fileReader = new FileReader(rootPath+"/test.txt");BufferedReader bufferedReader = new BufferedReader(fileReader);String content = bufferedReader.readLine();while (content!=null){float v = Float.parseFloat(content);inputValue(v);content = bufferedReader.readLine();}fileReader.close();bufferedReader.close();}catch (IOException e){e.printStackTrace();}}public void inputValue(float v){//第一次 NUM1个点的均值滤波if(count1<NUM1){values1[count1] = v;if(count1 == NUM1-1){averageValue1();}count1++;}else{translate1(v);averageValue1();}}//一阶滤波的均值public void averageValue1(){float v = 0;for(int i = 0;i < NUM1;i++){v += values1[i];}v = v/NUM1;if(count2<NUM2){values2[count2] = v;if(count2 == NUM2-1){averageValue2();}count2++;}else{translate2(v);averageValue2();}}//二阶滤波的均值public void averageValue2(){float v = 0;for(int i = 0;i < NUM2;i++){v += values2[i];}v = v/NUM2;if(count3<NUM2){values3[count3] = v;if(count3 == NUM2-1){averageValue3();}count3++;}else{translate3(v);averageValue3();}}//三阶滤波的均值public void averageValue3(){float v = 0;for(int i = 0;i < NUM2;i++){v += values3[i];}v = v/NUM2;if(count4<NUM2){values4[count4] = v;if(count4 == NUM2-1){averageValue4();}count4++;}else{translate4(v);averageValue4();}}//四阶滤波的均值public void averageValue4(){float v = 0;for(int i = 0;i < NUM2;i++){v += values4[i];}v = v/NUM2;if(count5<NUM2){values5[count5] = v;if(count5 == NUM2-1){averageValue5();}count5++;}else{translate5(v);averageValue5();}}//五阶滤波的均值public void averageValue5(){float v = 0;for(int i = 0;i < NUM2;i++){v += values5[i];}v = v/NUM2;strategy(v);}public void strategy(float v){Log.i("fushiqing",""+v);if(keyValuelist.size() == 0){//监测第一个波谷点if(mOldValue == 0){mOldValue = v;}else{if(detectFirstValley(v,mOldValue)){resetValleyRelativeParam();}mOldValue = v;}}else if(keyValuelist.size() == 1){//监测第二个波峰点HashMap hashMap = (HashMap) keyValuelist.get(0);if((int)hashMap.get(KEY_NAME_TYPE)  == -1){if(detectNormalPeak(v,mOldValue)){resetPeakRelativeParam();}mOldValue = v;}}else if(keyValuelist.size() == 2){judgeMaybeSitDown();keyValuelist.clear();resetPeakRelativeParam();resetValleyRelativeParam();mOldValue = v;}}public boolean judgeMaybeSitDown(){boolean result;HashMap hashMap1 = (HashMap) keyValuelist.get(0);HashMap hashMap2 = (HashMap) keyValuelist.get(1);int type1 = (int)(int)hashMap1.get(KEY_NAME_TYPE);int type2 = (int)hashMap2.get(KEY_NAME_TYPE);if(type1 == -1 && type2 == 1){long millis1 = (long)hashMap1.get(KEY_NAME_TIMEMILLIS);float v1 = (float)hashMap1.get(KEY_NAME_VALUE);float v2 = (float)hashMap2.get(KEY_NAME_VALUE);float diffValue = v2 - v1;long millis2 = (long)hashMap2.get(KEY_NAME_TIMEMILLIS);if(millis2 - millis1 >= 320 && diffValue >= ValleyPeakThread && diffValue <= ValleyPeakThread+1){Log.i("result","judgeMaybeSitDown");result = true;}else{Log.i("result","judge sit down failed "+(millis2 - millis1)+" "+diffValue);result = false;}}else{Log.i("result","type wrong");result = false;}return result;}/** 用于检测第一个波谷值,如果检测到符合要求的波谷值,则进行后续的检测* 1.持续下降或持平大于等于4个点* 2.波谷值小于8.2和7之间* */public boolean detectFirstValley(float newValue,float oldValue){boolean result = false;formerDeclineStatus = isDirectionDecline;if(newValue < oldValue){isDirectionDecline = true;continueDeclineCount++;}else{formerContinueDeclineCount = continueDeclineCount;continueDeclineCount = 0;isDirectionDecline = false;}Log.i("process","formerContinueDeclineCount:"+formerContinueDeclineCount +" " +"oldValue:"+oldValue);if(!isDirectionDecline && formerDeclineStatus&& formerContinueDeclineCount >= 6 && oldValue<= ValleyThread+1.2 && oldValue>=ValleyThread){long timeMillis = System.currentTimeMillis();float valleyValue = oldValue;HashMap hashMap = new HashMap();hashMap.put(KEY_NAME_TIMEMILLIS,timeMillis);hashMap.put(KEY_NAME_VALUE,valleyValue);hashMap.put(KEY_NAME_TYPE,-1);keyValuelist.add(hashMap);Log.i("result","valleyValue"+valleyValue);result = true;}return result;}/** 用于检测普通的符合要求的波峰* */public Boolean detectNormalPeak(float newValue,float oldValue){Boolean result = false;formerUpStatus = isDirectionUp;if(newValue > oldValue){isDirectionUp = true;continueUpCount++;}else{isDirectionUp =false;formerContinueUpCount = continueUpCount;continueUpCount = 0;}if(!isDirectionUp  && formerUpStatus){long timeMillis = System.currentTimeMillis();float peakValue = oldValue;HashMap hashMap = new HashMap();hashMap.put(KEY_NAME_TIMEMILLIS,timeMillis);hashMap.put(KEY_NAME_VALUE,peakValue);hashMap.put(KEY_NAME_TYPE,1);keyValuelist.add(hashMap);result = true;}return result;}public boolean detectNormalValley(float newValue,float oldValue){boolean result = false;formerDeclineStatus = isDirectionDecline;if(newValue < oldValue){isDirectionDecline = true;continueDeclineCount++;}else{formerContinueDeclineCount = continueDeclineCount;continueDeclineCount = 0;isDirectionDecline = false;}if(!isDirectionDecline && formerDeclineStatus){long timeMillis = System.currentTimeMillis();float valleyValue = oldValue;HashMap hashMap = new HashMap();hashMap.put(KEY_NAME_TIMEMILLIS,timeMillis);hashMap.put(KEY_NAME_VALUE,valleyValue);hashMap.put(KEY_NAME_TYPE,-1);keyValuelist.add(hashMap);result = true;}return result;}//一阶滤波的平移public void translate1(float v){for(int i=1;i<NUM1;i++){values1[i-1] = values1[i];}values1[NUM1-1] = v;}//二阶滤波的平移public void translate2(float v){for(int i=1;i<NUM2;i++){values2[i-1] = values2[i];}values2[NUM2-1] = v;}//三阶滤波的平移public void translate3(float v){for(int i=1;i<NUM2;i++){values3[i-1] = values3[i];}values3[NUM2-1] = v;}//四阶滤波的平移public void translate4(float v){for(int i=1;i<NUM2;i++){values4[i-1] = values4[i];}values4[NUM2-1] = v;}//五阶滤波的平移public void translate5(float v){for(int i=1;i<NUM2;i++){values5[i-1] = values5[i];}values5[NUM2-1] = v;}//初始化波谷监测的相关值public void resetValleyRelativeParam(){isDirectionDecline = false;continueDeclineCount = 0;formerContinueDeclineCount = 0;formerDeclineStatus = false;}//初始化波峰监测的相关值public void resetPeakRelativeParam(){isDirectionUp = false;continueUpCount = 0;formerContinueUpCount = 0;formerUpStatus = false;}}

Android_基于g-sensor的坐下动作的的识别相关推荐

  1. 基于3D关节点的人体动作识别综述(转)

    原文:2016,Pattern Recognition: 3D skeleton-based human action classification: A survey 摘要 近年来,基于深度序列的人 ...

  2. java人体识别_基于安卓Android的人体动作行为识别系统APP设计(Android studio)

    基于安卓Android的人体动作行为识别系统APP设计(Android studio)(论文12000字,程序代码) 摘要:Android手机已经成为我们大部分人日常生活中不可或缺的一部分,而且其功能 ...

  3. 基于IndRNN的手机传感器动作识别

    近日,来自山东大学和电子科技大学的研究者提出了基于 IndRNN 模型利用手机传感器实现动作识别的网络,该模型解决了现有 RNN 模型的梯度消失和梯度爆炸问题,一定程度上实现了动作识别的用户独立性,同 ...

  4. 基于cocos2dx的横版动作游戏制作(二)

    基于cocos2dx的横版动作游戏制作(二) 如果你看过第一部分介绍,你应该大体知道一个横版游戏该怎么样去做,需要什么东西了....本部分介绍一些细节设计... 第一个:单例对象我们应该怎么设计才比较 ...

  5. 基于cocos2dx的横版动作游戏制作(一)

    基于cocos2dx的横版动作游戏制作(一) 本人最近几个月在工作之余,都有断断续续地去学习cocos2dx的一些东西,在一些论坛上参考有关资料,源码,比如www.9miao.com,泰然网等等,毕竟 ...

  6. ECCV 2020 论文大盘点-动作检测与识别篇

    本文盘点 ECCV 2020 所有动作检测与识别(Action Detection and Recognition)相关论文,总计 26 篇. 包含动作识别(Action Recognition).动 ...

  7. (TIP-2019)基于判别特征学习的跨视角步态识别

    基于判别特征学习的跨视角步态识别 paper题目:Cross-View Gait Recognition by Discriminative Feature Learning paper是中国科学院大 ...

  8. 基于磁场数据侧信道分析的应用识别技术

    (硕士期间的一个研究点,希望对大家的科研有帮助) 摘 要 移动智能终端应用于生活中的各个方面,感知终端上运行的应用在广告投放.限制区域内的应用监控等方面都具有重要意义.然而,现有技术需要系统权限来获取 ...

  9. MATLAB实现数字识别系统,基于人工神经网络的MATLAB手写数字识别系统

    <基于人工神经网络的MATLAB手写数字识别系统>由会员分享,可在线阅读,更多相关<基于人工神经网络的MATLAB手写数字识别系统(8页珍藏版)>请在人人文库网上搜索. 1.基 ...

最新文章

  1. word 生成HTML
  2. 玩转Nodejs的集群
  3. Java反射机制及API使用
  4. 【项目管理】不确定性绩效域管理
  5. Python2.7安装ncmbot时提示:Microsoft Visual C++9.0 is required
  6. 一个备份MySQL数据库的简单Shell脚本(转)
  7. Windows消息机制详解-2
  8. 这些Python骚操作,你值得拥有
  9. mysql cluster 查看数据库表名称_MySQL Cluster如何创建磁盘表方法解读
  10. python字典是什么数据_python---基本数据类型 dict(字典)
  11. 面向接口的开发到面向对象的编程
  12. 第九届河南省程序设计大赛-----表达式求值-------递归+模拟
  13. c语言数字游戏程序,C语言实现数字游戏
  14. [Mac]如何卸载McAfee
  15. 用计算机抽样,利用计算机代替随机数骰子进行随机抽样
  16. sel4 手册总结之介绍与内核服务和对象
  17. Ground Rover with Mavros
  18. Flutter必备——Dart入门(下)
  19. 安全测试值得学习的工具有哪些?
  20. 比较两个文件夹找出不同的文件,并按路径复制到另外一个文件夹(shell练习记录1)

热门文章

  1. 20140722-百度质量部测试开发工程师-实习面试
  2. DEKRA德凯新设立首席数字官、首席运营官,任命两位新成员加入董事会
  3. 电脑上最好的3个小说阅读器
  4. 10-219 通过订单表和顾客表,查询订单编号,顾客编号,公司 名称和订单日期
  5. pandas库--DataFrame常用操作
  6. Pandas库——DataFrame入门
  7. 搞不明白的PS调色技巧视频教程
  8. React自定义组件使用onClick传参注意:onClick只是一个名字而已!
  9. mathematica-基于过程编程
  10. Lawliet|C语言学习笔记3——顺序结构