ラズパイ7日目②:「左うでを2周回した」とジェスチャー判定
前フレームとの座標遷移とベクトル内積の合わせ技で、「左うでぐるぐる」のジェスチャー判定ができるんじゃないの?
ってことでやってみたらできた!
- Raspberry Pi 3 Model B+
- カメラ:Raspberry Pi Camera B01 (Rev1.3)
- Edge TPU:Google Coral Edge TPU Accelerator vertion 1.0
- 機械学習モデル:Google Coral PoseNet
作ったもの
左うでを2周回すと「LEFTARM TURN AROUND GESTURE」を出力するプログラムです。前回同様、顔部分には円形オブジェクトを重ねています。
ジェスチャーの判定方法
- 前フレームの左手座標・後フレームの左手座標・前後フレームの左ひじ座標平均をもとに、回した角度を算出する
- 180°≧算出角度≧10°の場合、armTurnDeg変数に加算
- armTurnDeg≧720°になったら「LEFTARM TURN AROUND GESTURE」を出力
def inner_Calc(x0, x1, x2, y0, y1, y2): if all([x0, x1, x2, y0, y1, y2]): va=np.array([x1-x0,y1-y0]) vb=np.array([x2-x0,y2-y0]) innr=np.inner(va,vb) nrm=np.linalg.norm(va)*np.linalg.norm(vb) deg = np.rad2deg(np.arccos(np.clip(innr/nrm, -1.0, 1.0))) else: deg = -1 return deg ・・・略・・・ #左うでをぐるぐる回すジェスチャー判定 if len(prepose) != 0: x1 = prepose[dict_KEYPOINTS['left wrist']][0] y1 = prepose[dict_KEYPOINTS['left wrist']][1] x0 = round((pose.keypoints.get('left elbow').yx[1] + prepose[dict_KEYPOINTS['left elbow']][0]) / 2) y0 = round((pose.keypoints.get('left elbow').yx[0] + prepose[dict_KEYPOINTS['left elbow']][1]) / 2) x2 = pose.keypoints.get('left wrist').yx[1] y2 = pose.keypoints.get('left wrist').yx[0] deg = np.round(inner_Calc(x0, x1, x2, y0, y1, y2)) #10°未満or180°以上は誤差とみなすよう調整 if deg >= 10 and deg <= 180: armTurnDeg += deg print(str(armTurnDeg)) #720° を超えたらジェスチャー判定してリセット if armTurnDeg >= 720: print('LEFTARM TURN AROUND GESTURE') armTurnDeg = 0
前フレームデータの取得方法については前々回の記事を参照。
わーいできたー