blog

画像位置の特定

画像認識してボタンをクリックするのを自動化するために,Rでコードを書いていたら,やはり使いものにならないぐらい遅かった. そこで,Rcppを使ってC++で書き直した. 最低でも10倍,うまくいけば50倍ぐらいになると思っていたが,3倍ぐらいの速度にしかならない. しかも,場合によっては3倍ぐらい遅いこともある. たぶん,C++の書き方が良くないのだと思うが,別の方法で実装することにした. 同じような色だけの画像を認識するのは難しいが,通常 1 needle_imageとhaystack_imageの各ピクセルで共通する色を抽出 2 抽出した色のうちhaystack_imageで出現頻度の少ないものから1つ選んでneedle_imageでの位置を把握 3 needle_imageでの位置をもとに,haystack_imageの基準点(1,1)を抽出 4 出現頻度の少ないものから,順次2と3を繰り返し 5 haystack_imageの基準点が1つに絞れたら,それが探し出そうとしている画像の基準点と一致しているはず 全ピクセルの一致を目指しているのではないので,厳密な一致はしない可能性はあるが,画像があれば必ず一致するはずだ. 厳密な一致を求めるときは,最後にチェックを入れれば良い. ということで,コードを書いたら結構速い速度になって,満足. 単一色の画像の中からその一部を特定するのは無理だが(このコードに限らず,そもそも無意味),実用的な範囲では使えそうな感じだ.

コマンドラインでスクリーンショット

Windowsで画面のスクリーンショットをとるにはPrtScを押せば良いが,コマンドラインから取りたいときには不便. コマンドラインからできないか探したら,C# でつくったものがあった. .net frameworkは必要だが,“selfcompiled C# program"とのことなので,batを実行すれば勝手にexeが生成される. これはすごい. https://superuser.com/questions/75614/take-a-screen-shot-from-command-line-in-windows#answer-943947 https://github.com/npocmaka/batch.scripts/blob/master/hybrids/.net/c/screenCapture.bat また,下のところにあるコードはマルチディスプレイにも対応している. https://superuser.com/questions/75614/take-a-screen-shot-from-command-line-in-windows

Windowsのユーザ名のその後

少し前にWindows11のユーザ名変更について書いたが,別のPCでやったら色々と大変なことになった. その後なんとか修復したけど,普通にやりたい場合は,ネットで検索して出てくるものを参考にしたほうが良さそうだ.

干し草の中から針を探す

PythonのPyAutoGUIには,画像認識をしてボタンをクリックする機能があるのだが(正確にはpyscreezeの機能),RのKeyboardsimulatorには,それがない. PyAutoGUIからコードを辿って見ていくと,Confidenceの設定(Confidenceの設定はOpenCV使用)をしない場合は,単純に画像を端から一致するか判定しているみたいだ. これだったら,自分の力とRで実装できそう. 速度が遅ければ,検索部分のループだけ(ほぼCの)C++で書こう. ところで,画像認識のコードに,needleImage と haystackImage という変数がでてくる. 一瞬何のことか分からなかったが,「干し草の中から針を探す」だ. すごく良い変数名だ. 自分のコードにもこのネーミングを使う予定だ.

Windowsのユーザ名

Windows11のパソコンを複数台使っている. 初期設定のときに合わせればよかったのだが,ユーザ名(表示名も,実際のユーザー名)が異なっている. アプリケーションごとに保存されるデータが,C:\Users\USERNAME\AppData\Local\ (USERNAME:ユーザアカウント名)にあってここを指定するときに微妙にコードが異なってくるのがめんどくさい. %USERNAME%とかで処理していれば良いが,直接書いていることもあるためだ. 表示名(フルネーム)はわりと簡単に変更できるが,これを変更しても実際のユーザー名(ユーザーアカウント名)はそのまま残る. そのため,上記のユーザフォルダは変更されずにそのまま残っていた. ユーザフォルダの名前を変更しようとしても,できないようになっている(そりゃそうだ). レジストリの以下を変えると,フォルダ名を変更できるようになる. コンピューター\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList ProfileImagePath https://pc-karuma.net/change-windows-11-user-folder-name/ ユーザやシステムの環境変数のPATHは,変更前のままなので変更する. よくわからないけど,PC上の設定も変更前のままだったら,以下を参考にしてユーザーネームを変更する. https://osechi-tech.net/windows11-username-change-method/ 多分だがこれぐらいやっておけば,だいたいできた感じだろう.

pivotea 1.0.1

Rでピボットテーブルのようなものをつくるためのパッケージpivoteaを更新した. ホグワーツのデータを追加し,ちょっとバグを修正. https://cran.r-project.org/web/packages/pivotea/ https://github.com/matutosi/pivotea/

R Package Scholar

R Package Scholarというのがあるらしく,pivoteaがこれに登録されたとの電子メールが届いた. “pivotea is quite a useful package so we created some page tools for it!“だとさ. たぶん,いろんなところに送っているのだろうけど,褒められるのは嬉しい. https://scholar.rpkg.net/authordetails.php?author=Toshikazu+Matsumura https://github.com/matutosi/pivotea/

hogwarts

pivotea (pivot easy)の時間割データとして良いものがないか探していたら,ホグワーツ魔法魔術学校の時間割を見つけた. https://github.com/Arcfej/HogwartsTimetable/

pivotea

Rでピボットテーブルのようなものをつくるためのパッケージpivoteaを作成した. 主な関数は,pivot()のみ. 詳細は以下を参考にして欲しい. https://cran.r-project.org/web/packages/pivotea/index.html https://github.com/matutosi/pivotea/ tidyなデータフレームをもとにして,列(row,縦)・行(col,横)・値(value,セルの中身)・分割(split)にそれぞれ配置したい列を文字列指定するだけで簡単にピボットテーブルのようなものが作れる. tidyr::pivot_wider(), tidyr::pivot_longer()でもピボットはできるが,同一セルに複数の値が入るときの処理が面倒くさい. 複数の値がある場合は,pivot()では縦に別の行として並べるところが,工夫点である. 同じコマに重複する科目があるときの時間割を作成するのに便利である(というか,それを目的に関数を作成した). 以下のvignettesでは,このことが分かりにくいかもしれないと思ったので,時間割のデータを追加する予定. vignettes: https://cran.r-project.org/web/packages/pivotea/vignettes/pivoteasy.html

GPT-3

OpenAIのGPT-3に登録して,ちょっと遊んでみた. 文章生成やチャットをしてくれる. 内容的にはびっくりするぐらいよくできているが,具体性が少なく,どこかから取ってきた文章みたいで,内容自体には面白みに欠ける. GitHubのcoplilotもちょっと試してみた. これは,プログラムをAIがサポートするもので,コメントを書くだけでコードを提案してくれてすごく便利だ. ただ,誰かが書いたコードをなぞっているという感じで,全く新しいプログラムを想像しているわけではない. そのため,自分は具体的なコードを知らないけど,たぶん誰かが既に考えてるだろうというものを書く(勉強する)のに向いているとは思う. 一方,個別の事案や全く新しいものを作り出すのはやっぱり自分の頭が必要だ.