いくつかのスマートフォン,Huawei P8のようなものは,knuckle senseという指の第二関節を認識して,ジェスチャーを行なえる.
"knuckle sense"を Nexus5X等の他のものでも使えるか調査する. さらに,可能であれば"どの指"でタッチしているかがわかるとより良い.
基本的には,AndroidでタッチイベントはonTouchEvent
というメソッドで監視する. このonTouchEvent
は引数としてMotionEvent
というオブジェクトを受け取る. 以下がMotionEvent
の(使えそうな)メソッドである.
Return Type | Method Name | Description |
---|---|---|
float | getX | X座標 |
float | getY | Y座標 |
float | getPressure | 圧力 |
float | getSize | サイズ |
float | getTouchMajor | タッチ領域の楕円の長い方の長さ |
float | getTouchMinor | タッチ領域の楕円の短い方の長さ |
「圧力」,「サイズ」,「タッチ楕円の情報」を特徴量として学習する. ここでは,指は「親指」,「人差し指」,「第二関節」を候補とする.
教師あり学習をしたいので,がんばって指定された指でタッチしまくる. アプリケーションを作成した.一応データもここにある.
plot(fing_nexus5x_1$Pressure,fing_nexus5x_1$Size, pch=20, cex=1, col=c("#ff000020","#00ff0020","#0000ff20") [unclass (fing_nexus5x_1$Finger)])
legend("topleft", legend = c("Thumb", "Index", "SecondJoint"), col = c("red", "green3", "blue"), pch = 20)
適当にRandomForestしてみた.
#!/usr/bin/env python
#coding:utf-8
import pandas
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn import cross_validation
train = pandas.read_csv("fing_nexus5x_1.csv")
test = pandas.read_csv("fing4.csv")
# なぜか動かない?
def clean(data):
# data.loc[data["Finger"] == "Thumb", "Finger"] = 0
# data.loc[data["Finger"] == "Index", "Finger"] = 1
# data.loc[data["Finger"] == "SecondJoint", "Finger"] = 2
# data.loc[data["Finger"] == "Thumb", "Finger"] = "Index"
# data = data[data["Type"] == 2]
return data
train = clean(train)
test = clean(test)
want = "Finger"
predictors = ["Pressure", "Size", "Major", "Minor"]
alg = RandomForestClassifier(random_state=1, n_estimators=150, min_samples_split=4)
alg.fit(train[predictors], train[want])
predictions = alg.predict(test[predictors])
sc = 0
for exp, ans in zip(predictions, test[want]):
sc += (exp == ans)
print(1.0 * sc / len(test[want]))
うーん,悪くはないんだけど…….ジェスチャー等で使おうと思うと厳しそうだ.
分類 | 正答率 |
---|---|
人差し指,親指,第二関節 | 0.734 |
人差し指か親指 ,第二関節 | 0.946 |
以下の方法を試すことで正答率を向上できると考えられる.
arcatdmzさんからの情報.音でやっているらしいです.
@Tomoki_Imai というわけで、彼らはたぶん音を使ってます。ご参考まで。OSネイティブのイベントだけで推定するのは聞いたことないですが。
— arc@dmz (@arcatdmz) 2016年3月6日