2022-12-11

腱鞘炎になった

利き手の右手首が腱鞘炎になった話。

特に使いすぎた認識はないのですが右手首が腱鞘炎になりました。

若干右手首をひねると違和感があるな~から急激に悪化。激痛を伴うようになりました。今では家の鍵を回すだけも激痛です。

整形外科で見てもらったところ教科書通りの腱鞘炎とのこと。そして治療は安静にするだけの方針になりました。痛みはありますが保存療法とのことで安静にして炎症が収まるのを待つ感じです。

ただ、日常生活で利き腕を使うシーンは多く、ことあるごとに痛みが発生していました。なにかを持つときだけでなく、ポケットに手を入れるときですら痛みが伴う状態でした。

ですので、お医者様のおすすめ通りにサポータで固定することにしました。

いくつかサポータを購入し使いこみましたので未来の患者仲間のためにメモを残しておきます。

重装タイプ

まずはきっちり手首を固定して完全にガードするタイプを購入しました。

ポイントは手のひら半分まで添え木(アルミ製らしい)が来ており、きっちりガードされることです。ちょっとした力作業(運悪くネジを締める作業が発生)でも痛みを感じることはありませんでした。

力作業のほか、手をあまり使う必要のない寝るとき、サイクリング、お出かけなどで使用しました。痛みの出る可動域に達しないように防いでくれます。

デメリットはパソコンのマウス操作に若干干渉することです。マウスの持ち方に依存しましが手のひらに添え木がある分、「マウスを握る」ところに干渉します。

こちらは可動域がかなり制限されますが、細かい動きが不要な日常生活、就寝時に使用しています。

軽装タイプ

仕事柄、パソコン作業が必要となります。重装タイプだと添え木とマウスが干渉し操作性が悪くなります。

それを解決し、可動域をある程度確保したのがこちら。

首付近までガードされるタイプで、添え木も軟骨(柔軟なプラスチック?)です。可動域が広く柔軟があるためマウス操作には影響軽微です。

重装タイプほど防御力は高くないですが、そのかわり機動性が高くなっています。
こちらはパソコンを使用したお仕事時につけています。

運用

現状は、仕事のパソコン作業中は軽装タイプ、それ以外は重装タイプのサポータを装着しています。
どちらも手首の可動域に制限をかけることで痛みが発生する領域に達しないようにガードしてくれます。

重装と軽装を使い分けて日常生活の作業を維持しながら安静状態を維持して、早く治るようにしたいです。

2022-09-18

Sikulixでウマ娘のステータス情報を読み取る

Sikulixは画像を検出してクリックなどの操作を自動化できるツールです。お仕事やゲームなどのパソコン上の操作を自動化する便利ツールです。

画像の検出とクリックの繰り返しだけであれば SikuliXの汎用的な自動周回用スクリプト・改のように操作したい画像を用意してやれば可能です。

しかし、変化する情報から次の操作を決定するような場合は、単純な画像検索ではなく、表示内容を読み取ることが必要になります。

Sikulixには、画面上の文字情報を認識するOCR機能が組み込まれているため簡単に分析が可能です。

サンプルとして、ウマ娘のゲーム画面からステータス情報を読み取る仕組みを構築してみます。

ウマ娘のステータス情報を読み取る


ウマ娘はトレーニングによりステータスが上昇していきます。同じトレーニングのみを選択するのであれば単純に画像検索のみで実現可能ですが、まともにゲームを進めることができません。(スピードだけ上げればよいバクシン的な娘もいますが。

不足しているステータスに対するトレーニングを選択するためには、現状のステータスがどのようになっているか認識する必要があります。ここで、SikulixのOCR機能が使えます。

Sikulixでステータス情報を読み取る

SikulixのOCR機能を使い、ウマ娘のゲーム画面上からステータス情報を読み取ってみます。

OCR機能の使い方は簡単で、文字を認識させたい領域オブジェクト「Region」を作成し、「text()」メソッドを呼び出すだけです。


# 文字列検出させる領域を設定
r = Region(35,520,380,35)
# OCRを実行しログ出力
print(r.text())

Regionで指定してる領域には以下情報が表示されています。


text()の結果得られる文字列は以下。

(225 F119 GP Ss! fp 144i pp 124) 131°


部分的に数値を検出できていますが、関係ない部分も無理やり文字として読み取ってしまっています。

読み取り処理の改善

ゲーム画面などは多様なフォントやデザインからなる画面になっているため、標準的なOCRだとうまく認識されませんでした。

ですので、ステータスの数値の領域のみOCR対象にする必要があります。

# 文字列検出させる領域を設定
r_spd = Region(59,522,36,15)
r_stm = Region(123,522,36,15)
r_pow = Region(187,522,36,15)
r_gut = Region(251,522,36,15)
r_int = Region(314,522,36,15)

# Region確認のためハイライトさせる
r_spd.highlight()
r_stm.highlight()
r_pow.highlight()
r_gut.highlight()
r_int.highlight()
sleep(5)

# OCRを実行しログ出力
print(r_spd.text())
print(r_stm.text())
print(r_pow.text())
print(r_gut.text())
print(r_int.text())

文字列検出させる領域をハイライトさせたときの画面は以下。




実行結果は以下。

225
119
155
144
124


うまく読み取れました。

文字列として読み取れますので、これを数値に変換して「目標値以下なら~」といった条件分岐が可能になります。

まとめ

ウマ娘のステータス情報の読み取りを例にSikulixのOCR機能について記載しました。

標準では英数のみの読み取りのみサポートされています。

日本語の読み取りは日本語用OCRライブラリを導入することで可能となりますが、ゲーム画面などは誤検出が多く、また応答が返ってこなくなるなど不安定でした。

英数のみであっても、画面全体を一度に認識させると誤認識も多いです。

このため、サンプルでは認識したい文字がある領域だけを認識させることで、目的の文字列を読み取るようにしました。

画面上の情報を条件判定に使えるようになることで複雑な条件分岐ができるようになると思います。