Android_基于g-sensor的走路,跑步的识别
最近根据以前的计步算法基础,改进了一下,可以识别出是在走路还是跑步(骑行暂未实现)。
大体上,还是在计步算法上的改进,在步点的时候增加时间的判断。
之前的计步算法识别: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的走路,跑步的识别相关推荐
- Android_基于g-sensor的坐下动作的的识别
基于g-sensor的坐下的姿势识别.手机需要放在口袋里,手机拿在手上的暂时还不支持. 如果看不明白,可以先学习这篇文章 计步算法识别:http://blog.csdn.net/finnfu/arti ...
- 基于JavaScript的人物走路动画
基于JavaScript的人物走路动画 想要实现人物走路的动态图,可以连续更换图片,给人一种人物在走路的假象,但是接下来我们用另外一种方法来实现,将所有单张图片拼接成一个长图,可以让图片移动代替更换图 ...
- 基于深度学习的手写数字识别算法Python实现
摘 要 深度学习是传统机器学习下的一个分支,得益于近些年来计算机硬件计算能力质的飞跃,使得深度学习成为了当下热门之一.手写数字识别更是深度学习入门的经典案例,学习和理解其背后的原理对于深度学习的理解有 ...
- 基于分布式的短文本命题实体识别之----人名识别(python实现)
目前对中文分词精度影响最大的主要是两方面:未登录词的识别和歧义切分. 据统计:未登录词中中文姓人名在文本中一般只占2%左右,但这其中高达50%以上的人名会产生切分错误.在所有的分词错误中,与人名有关的 ...
- android 手写字体识别,一种基于Android系统的手写数学公式识别及生成MathML的方法...
专利名称:一种基于Android系统的手写数学公式识别及生成MathML的方法 技术领域: 本发明属于模式识别技术领域,涉及数学公式中字符间的空间结构分析,具体涉及一种基于Android系统的手写数学 ...
- [当人工智能遇上安全] 6.基于机器学习的入侵检测和攻击识别——以KDD CUP99数据集为例
您或许知道,作者后续分享网络安全的文章会越来越少.但如果您想学习人工智能和安全结合的应用,您就有福利了,作者将重新打造一个<当人工智能遇上安全>系列博客,详细介绍人工智能与安全相关的论文. ...
- 二十四.基于机器学习的入侵检测和攻击识别——以KDD CUP99数据集为例
这是作者的系列网络安全自学教程,主要是关于网安工具和实践操作的在线笔记,特分享出来与博友共勉,希望您们喜欢,一起进步.前文分享了Web渗透的第一步工作,涉及网站信息.域名信息.端口信息.敏感信息及指纹 ...
- 基于Matlab的交通限速标志的识别系统 数字图像处理大作业
本大作业为基于Matlab的交通限速标志的识别系统, 考虑到在科技发展的今天,智能汽车行业发展迅速,所以交通限速标志的快速检测及识别对车辆的安全行驶极为重要,因此本系统可以检测到图中的交通限速标志并对 ...
- 基于K210的MNIST手写数字识别
基于K210的MNIST手写数字识别 项目已开源链接: Github. 硬件平台 采用Maixduino开发板 在sipeed官方有售 软件平台 使用MaixPy环境进行单片机的编程 官方资源可在这里 ...
最新文章
- Python实现与LeetCode--堆
- apache 提示You don't have permission to access /test.php on this server.怎样解决
- 自然语言处理笔记-哈工大 关毅
- 18-chown命令
- Maven内部版本号插件–用法示例
- linux添加自己的键盘映射,Linux 键盘映射
- 【Python】Django auth 修改密码如何实现?
- Ansible Tower:安装以及HA多集群安装
- 科学家用Google Earth发现千年古迹
- Algorithm:三数之和为0
- C# 将系统时间转换成农历时间
- 从学校,到字节跳动,追忆似水流年
- 信号源输出的负载阻抗与输出幅值的关系
- 汉字一、二级字库的汉字与unicode编码(十六进制)对照表,按照unicode的顺序排列 1
- tomcat HTTP与HTTPS同时开启并且同时可以访问
- PTA挖掘机技术哪家强
- python产品质量分析_产品评论 使用Python分析Amazon Smart产品评论
- 计算机机房电力切换演练方案,中心机房开展2020年上半年电力切换应急演练
- iPhone14 刚发布就降价,全网疯抢!!!
- 产品方法论-如何做好竞品分析?