KIHARA BLOG:社内ラズコンでめざせ優勝!

Raspberry Pi(ラズパイ)で機械学習とか音声認識とか姿勢推定とかしながら組み込みシステムを構築して、社内ラズコンで優勝をめざすブログです。勉強中:Raspberry Pi、Linux、Python、Coral EdgeTPU、PoseNet、Julius

ラズパイ7日目②:「左うでを2周回した」とジェスチャー判定

前フレームとの座標遷移とベクトル内積の合わせ技で、「左うでぐるぐる」のジェスチャー判定ができるんじゃないの?
ってことでやってみたらできた!

作ったもの


20200119PoseNet2

左うでを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

前フレームデータの取得方法については前々回の記事を参照。

kihara0223.hatenablog.com

わーいできたー