この記事はkinect v1を用いた人の座標の取得方法ではなくその座標を用いた静止判定の方法を紹介しています!人の座標の取り方はアトリエフレームワークス、openFrameworks・Kinect v1を用いた人の検知をお読みください。
今回は人がある一定時間静止したかどうかを判定をするコードを実装したので紹介したいと思います。とても初歩的で簡単な方法です。よかったら参考にしてください。
静止判定を行うクラスの実装
今回実装したクラスKN_stop
の機能としては、
-人の座標を渡したらその人がある一定時間静止したかどうかを判断する
- 静止した人の両足の幅を計算する
の2つです。
hppファイルとcppファイルを以下に示します。
# ifndef KN_BASIC
# define KN_BASIC
# include <stdio.h>
# include "ofMain.h"
# include "ofxOpenNI.h"
# include "KN_basic.hpp"
# endif
class KN_stop{
public:
void setup();
void update();
void draw();
bool stopJudge(ofVec2f _manPos1,ofVec2f _manPos2);
float calcDist(ofVec2f _manPos1,ofVec2f _manPos2);
float mLegDist;//静止したときの両足の幅
bool mIsStanding;//一定時間静止したかどうか
int mTime;//静止時間を保存
ofVec2f mPreManPos[2]; //前フレームでの判定人物の両足座標
int StopTime=2;//定数:静止と判定する秒数(今回は2秒)
int JudgeInterval=150;//定数:足が動いていないと判定する値
int FrameRate = 60;//定数:フレームレート数
int count;////kinectによる雑音を除去するための変数
};
/*
引数
・判定する人の両足の座標
返り値
・止まったことの判定 bool
・その時の立ち幅 float
*/
# include "KN_stop.hpp"
void KN_stop::setup(){
//各変数の初期化
mIsStanding = false;
mTime = 0;
mLegDist =0;
mPreManPos[0]= ofVec2f(0,0);
mPreManPos[1]= ofVec2f(0,0);
}
void KN_stop::update(){
}
void KN_stop::draw(){
}
bool KN_stop::stopJudge(ofVec2f _manPos1,ofVec2f _manPos2/*現在の人の両足座標*/){
//前フレームと両足の座標の変化を計算
float dist1 = ofDist(_manPos1.x,_manPos1.y,mPreManPos[0].x,mPreManPos[0].y);
float dist2 = ofDist(_manPos2.x,_manPos2.y,mPreManPos[1].x,mPreManPos[1].y);
//人が動いたかどうかで条件分岐
if(dist1<JudgeInterval && dist2<JudgeInterval){//前フレームとの変化量が小さい→静止とみなす
mTime++;//静止している時間をインクリメント
count=0;
}
else{//前フレームとの変化量が大きい→動いたとみなす
if(count>30){//kinectによる雑音を除去する
mIsStanding =false;
mTime=0;//静止時間リセット
count=0;
}
count++;
}
//足の座標を保存→次フレームで使用
mPreManPos[0]=_manPos1;
mPreManPos[1]=_manPos2;
//静止時間がStopTime(このコードでは2秒)を越えたらtrueを返す
if(mTime>FrameRate*StopTime){
mIsStanding = true;
}else{
mIsStanding = false;
}
return mIsStanding;
}
//両足の幅を計算
float KN_stop::calcDist(ofVec2f _manPos1,ofVec2f _manPos2){
mLegDist= ofDist(_manPos1.x,_manPos1.y,_manPos2.x,_manPos2.y);
return mLegDist;//両足の幅を返す
}
前フレームの人の両足の座標と現在のフレームの座標を比較し、その変化量が小さければ動いていない!静止している!と判断します。この方法はセンサーの状態を随時見て変化を検出するときに使われます。例えばボタンのON、OFFの変化をみたいときなどでも利用できる方法です。
座標間の計算はofDist
にお任せです。
Kinectの値がぴゅんっと飛んじゃう雑音の影響を少~しだけ軽減
count
がどのような機能を果たしているか説明します。デバッグをしている中でkinectの雑音(壁に反応したり…)で、人の座標位置が一瞬だけどこかへぴゅんっ!と飛んでしまうということがありました…そのせいで本当は静止しているのに、静止判定がうまくいかないということに…!これをなんとかしたいとひねり出して考えたのがこのcount
の処理。少しmTime
をリセットする条件を狭くしたものです。内容は、
-
dist1
とdist2
に対して静止の判定に入らなかった時に、count
をインクリメント -
dist1
とdist2
に対する判定が30回以上falseになったときに、静止判定とする!
というもの!これを用いてなんとか動く静止判定を実装しました…!!