最近根据以前的计步算法基础,改进了一下,可以识别出是在走路还是跑步(骑行暂未实现)。

大体上,还是在计步算法上的改进,在步点的时候增加时间的判断。

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

直接提贴出核心代码:

package com.research.sensor.finnfu.gesturedetector.detector;import android.util.Log;/*** Created by finnfu on 2017/6/3.* 步行或者跑步*/public class PaceAndRunDetector {//存放三轴数据float[] oriValues = new float[3];final int ValueNum = 4;//用于存放计算阈值的波峰波谷差值float[] tempValue = new float[ValueNum];int tempCount = 0;//是否上升的标志位boolean isDirectionUp = false;//持续上升次数int continueUpCount = 0;//上一点的持续上升的次数,为了记录波峰的上升次数int continueUpFormerCount = 0;//上一点的状态,上升还是下降boolean lastStatus = false;//波峰值float peakOfWave = 0;//波谷值float valleyOfWave = 0;//此次波峰的时间long timeOfThisPeak = 0;//上次波峰的时间long timeOfLastPeak = 0;//当前的时间long timeOfNow = 0;//当前传感器的值float gravityNew = 0;//上次传感器的值float gravityOld = 0;//动态阈值需要动态的数据,这个值用于这些动态数据的阈值final float InitialValue = (float) 1.3;//初始阈值float ThreadValue = (float) 2.0;//波峰波谷时间差int TimeInterval = 250;private int stepCount = 0;private long timeOfLastStep = 0;private long timeOfThisStep = 0;private long averageTimeOfEveryStep = 0;//数据的输入口public void inputValue(float v){detectorNewStep(v);}/** 检测步子,并开始计步* 1.传入sersor中的数据* 2.如果检测到了波峰,并且符合时间差以及阈值的条件,则判定为1步* 3.符合时间差条件,波峰波谷差值大于initialValue,则将该差值纳入阈值的计算中* */public void detectorNewStep(float values) {if (gravityOld == 0) {gravityOld = values;} else {if (detectorPeak(values, gravityOld)) {timeOfLastPeak = timeOfThisPeak;timeOfNow = System.currentTimeMillis();if (timeOfNow - timeOfLastPeak >= TimeInterval&& (peakOfWave - valleyOfWave >= ThreadValue)) {timeOfThisPeak = timeOfNow;/*走路或者跑步的识别* */countStep();}if (timeOfNow - timeOfLastPeak >= TimeInterval&& (peakOfWave - valleyOfWave >= InitialValue)) {timeOfThisPeak = timeOfNow;ThreadValue = peakValleyThread(peakOfWave - valleyOfWave);}}}gravityOld = values;}private void countStep() {timeOfLastStep = timeOfThisStep;timeOfThisStep = System.currentTimeMillis();long diffValue = timeOfThisStep - timeOfLastStep;if (diffValue <= 3000L){averageTimeOfEveryStep += diffValue;stepCount++;if(stepCount == 9){averageTimeOfEveryStep = averageTimeOfEveryStep/10;Log.i("result","averageTimeOfEveryStep: "+averageTimeOfEveryStep);if(averageTimeOfEveryStep <= 380){Log.i("result","跑步");}else if(averageTimeOfEveryStep >= 450){Log.i("result","走路");}else{Log.i("result","快走");}}else if(stepCount > 9){resSomeValue();}}else{//超时resSomeValue();}}private void resSomeValue(){stepCount = 0;averageTimeOfEveryStep = 0;}/** 检测波峰* 以下四个条件判断为波峰:* 1.目前点为下降的趋势:isDirectionUp为false* 2.之前的点为上升的趋势:lastStatus为true* 3.到波峰为止,持续上升大于等于2次* 4.波峰值大于20* 记录波谷值* 1.观察波形图,可以发现在出现步子的地方,波谷的下一个就是波峰,有比较明显的特征以及差值* 2.所以要记录每次的波谷值,为了和下次的波峰做对比* */public boolean detectorPeak(float newValue, float oldValue) {lastStatus = isDirectionUp;if (newValue >= oldValue) {isDirectionUp = true;continueUpCount++;} else {continueUpFormerCount = continueUpCount;continueUpCount = 0;isDirectionUp = false;}if (!isDirectionUp && lastStatus&& (continueUpFormerCount >= 2 || oldValue >= 20)) {peakOfWave = oldValue;return true;} else if (!lastStatus && isDirectionUp) {valleyOfWave = oldValue;return false;} else {return false;}}/** 阈值的计算* 1.通过波峰波谷的差值计算阈值* 2.记录4个值,存入tempValue[]数组中* 3.在将数组传入函数averageValue中计算阈值* */public float peakValleyThread(float value) {float tempThread = ThreadValue;if (tempCount < ValueNum) {tempValue[tempCount] = value;tempCount++;} else {tempThread = averageValue(tempValue, ValueNum);for (int i = 1; i < ValueNum; i++) {tempValue[i - 1] = tempValue[i];}tempValue[ValueNum - 1] = value;}return tempThread;}/** 梯度化阈值* 1.计算数组的均值* 2.通过均值将阈值梯度化在一个范围里* */public float averageValue(float value[], int n) {float ave = 0;for (int i = 0; i < n; i++) {ave += value[i];}ave = ave / ValueNum;if (ave >= 8)ave = (float) 4.3;else if (ave >= 7 && ave < 8)ave = (float) 3.3;else if (ave >= 4 && ave < 7)ave = (float) 2.3;else if (ave >= 3 && ave < 4)ave = (float) 2.0;else {ave = (float) 1.3;}return ave;}}

Android_基于g-sensor的走路,跑步的识别相关推荐

  1. Android_基于g-sensor的坐下动作的的识别

    基于g-sensor的坐下的姿势识别.手机需要放在口袋里,手机拿在手上的暂时还不支持. 如果看不明白,可以先学习这篇文章 计步算法识别:http://blog.csdn.net/finnfu/arti ...

  2. 基于JavaScript的人物走路动画

    基于JavaScript的人物走路动画 想要实现人物走路的动态图,可以连续更换图片,给人一种人物在走路的假象,但是接下来我们用另外一种方法来实现,将所有单张图片拼接成一个长图,可以让图片移动代替更换图 ...

  3. 基于深度学习的手写数字识别算法Python实现

    摘 要 深度学习是传统机器学习下的一个分支,得益于近些年来计算机硬件计算能力质的飞跃,使得深度学习成为了当下热门之一.手写数字识别更是深度学习入门的经典案例,学习和理解其背后的原理对于深度学习的理解有 ...

  4. 基于分布式的短文本命题实体识别之----人名识别(python实现)

    目前对中文分词精度影响最大的主要是两方面:未登录词的识别和歧义切分. 据统计:未登录词中中文姓人名在文本中一般只占2%左右,但这其中高达50%以上的人名会产生切分错误.在所有的分词错误中,与人名有关的 ...

  5. android 手写字体识别,一种基于Android系统的手写数学公式识别及生成MathML的方法...

    专利名称:一种基于Android系统的手写数学公式识别及生成MathML的方法 技术领域: 本发明属于模式识别技术领域,涉及数学公式中字符间的空间结构分析,具体涉及一种基于Android系统的手写数学 ...

  6. [当人工智能遇上安全] 6.基于机器学习的入侵检测和攻击识别——以KDD CUP99数据集为例

    您或许知道,作者后续分享网络安全的文章会越来越少.但如果您想学习人工智能和安全结合的应用,您就有福利了,作者将重新打造一个<当人工智能遇上安全>系列博客,详细介绍人工智能与安全相关的论文. ...

  7. 二十四.基于机器学习的入侵检测和攻击识别——以KDD CUP99数据集为例

    这是作者的系列网络安全自学教程,主要是关于网安工具和实践操作的在线笔记,特分享出来与博友共勉,希望您们喜欢,一起进步.前文分享了Web渗透的第一步工作,涉及网站信息.域名信息.端口信息.敏感信息及指纹 ...

  8. 基于Matlab的交通限速标志的识别系统 数字图像处理大作业

    本大作业为基于Matlab的交通限速标志的识别系统, 考虑到在科技发展的今天,智能汽车行业发展迅速,所以交通限速标志的快速检测及识别对车辆的安全行驶极为重要,因此本系统可以检测到图中的交通限速标志并对 ...

  9. 基于K210的MNIST手写数字识别

    基于K210的MNIST手写数字识别 项目已开源链接: Github. 硬件平台 采用Maixduino开发板 在sipeed官方有售 软件平台 使用MaixPy环境进行单片机的编程 官方资源可在这里 ...

最新文章

  1. Python实现与LeetCode--堆
  2. apache 提示You don't have permission to access /test.php on this server.怎样解决
  3. 自然语言处理笔记-哈工大 关毅
  4. 18-chown命令
  5. Maven内部版本号插件–用法示例
  6. linux添加自己的键盘映射,Linux 键盘映射
  7. 【Python】Django auth 修改密码如何实现?
  8. Ansible Tower:安装以及HA多集群安装
  9. 科学家用Google Earth发现千年古迹
  10. Algorithm:三数之和为0
  11. C# 将系统时间转换成农历时间
  12. 从学校,到字节跳动,追忆似水流年
  13. 信号源输出的负载阻抗与输出幅值的关系
  14. 汉字一、二级字库的汉字与unicode编码(十六进制)对照表,按照unicode的顺序排列 1
  15. tomcat HTTP与HTTPS同时开启并且同时可以访问
  16. PTA挖掘机技术哪家强
  17. python产品质量分析_产品评论 使用Python分析Amazon Smart产品评论
  18. 计算机机房电力切换演练方案,中心机房开展2020年上半年电力切换应急演练
  19. iPhone14 刚发布就降价,全网疯抢!!!
  20. 产品方法论-如何做好竞品分析?

热门文章

  1. POJ 3744 Scout YYF I 期望dp
  2. mysql远程访问权限开启
  3. 搭建美图(贴纸,涂鸦,文字,滤镜)
  4. 苹果iPhone手机iOS17系统怎么下载安装更新iPhone苹果ios17系统?
  5. 前馈控制之如何计算前馈量(质量弹簧阻尼系统)
  6. 再谈:分库分表的那些事
  7. 基于jQuery仿迅雷影音官网幻灯片特效
  8. 懵逼ZJOI2016Round2滚粗记
  9. 太极计算机面试电气工程师,电气工程师面试问题
  10. 今日份安利:什么软件可以录音翻译英语?