LoginSignup
5
1

ポケモンスリープの睡眠データを簡単に読み取りたかった

Last updated at Posted at 2023-08-16

皆さん寝てますか?私は毎晩すやすやしています。
ポケモンスリープ(Pokémon Sleep)の睡眠データ、眺めるだけでもちょっと面白いですよね。
Screenshot

アプリ内蔵の分析機能でも色々な情報が得られるんですが、どうせならアプリ外に睡眠データを持ち出したら何かできるかも…と思いませんか?

世の中どこもかしこもAI、きっと簡単に読み取れると思うので試してみました。
Amazon Textract
なんかダメそう!1

方針

さすがにスクリーンショットを文字認識APIに投げ込むだけでは無理そうなことが分かりました。仕方ないので以下の方針でチャレンジしてみます。

  1. 読み取りたいところを機械的に切り出す
  2. 日付や数値は文字認識APIでデータを読み取る
  3. グラフはピクセルを1つ1つ調べる

一気に泥臭くなった。
色々なデータを読み取るのは大変そうなので、最低限、日付とグラフだけ取得することにしましょう。

読み取りたいところを機械的に切り出す

Python+OpenCV(cv2)でやってみましょう。
OpenCVでこの手の処理をするときは基本的に次のような流れでやるようです。

  1. グレースケール化・二値化
  2. 輪郭抽出
  3. 切り出したい場所を示す輪郭を探す
  4. 輪郭を含む矩形で切り出した画像を保存

出来上がったものはこちらになります。

グレースケール化・二値化

cv2.cvtColorおよびcv2.thresholdを使います。
ウルトラ上手に二値化できました!

debug_img001.png

輪郭抽出

cv2.findContoursを使います。
cv2.RETR_TREEというオプションを使うと階層構造(どの輪郭の内側にどの輪郭があるか)まで取得できます。
一番外側の輪郭や細々とした輪郭は不要なので、何階層目か・輪郭の面積でフィルタしてあげるとこのようになります。

debug_img002.png

切り出したい場所を示す輪郭を探す

画面レイアウトを見ながら「一番上にある輪郭が日付で一番面積が大きい輪郭がグラフかな…」みたいな泥臭いロジックを組みます。
とりあえず正しく選択できてそうだけど、スクリーンショットの撮り方を変えたりスマホを機種変更したりするとどうなるかちょっと不安!

debug_img003.png

輪郭を含む矩形で切り出した画像を保存

cv2.boundingRectcv2.imwriteを使います。
cv2ではメモリ上の画像は多次元配列numpy.ndarrayになっているので、配列の操作で画像を切り出せます。便利。

debug_img004.png

保存した画像は以下の通り。これは勝ったな!

debug_img005.png

debug_img006.png

One more thing

切り出しが簡単にできたので、後工程のためにグラフをもうちょっと細かく切り出しましょう。
やることはだいたい同じです。グラフのあたりはコントラストが低いので二値化のパラメータを調整すると上手く輪郭抽出できそうです。

debug_img008.png

保存した画像は以下の通り。

debug_img009.png

この画像の下には横軸ラベルしかないのでついでに切り出せそうですね。これも切り出して画像を保存しておけば就寝時間と起床時間を読み取れそうです。

debug_img010.png

文字認識APIでデータを読み取れるか試してみる

保存した画像から日付や時間を読み取れるか手動で試してみましょう!ワクワク。
今回はGoogle Cloud Vision APIのデモで試してみます。

demo

2 0 2 3 4 7 F 2 1 8  T H E

なんかダメそう!
【完】

もうちょっと頑張るなら

数字の認識精度は高そうなので、さらに年・月・日の数字部分だけを切り出せばいい感じになりそうな気はします。

ChatGPTにお願いすればいい感じに補正してくれないかなーというのも試してみたけど、自分のプロンプトエンジニアリング力では無理でした。
「ローマ数字の"F"は10を表します2」は頭いいなあ。
chatgpt

【オワリ】

  1. Amazon Textractは2023年8月時点で日本語非対応なので仕方ない。参考:Amazon Textractのよくある質問

  2. 表しません。

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1