見出し画像

パズル写真をスキャンしてデジタルで解きたいプロジェクト

先日ふと、パズルの写真を撮影するだけでpuzz.linkで遊べるようになったら解きなおしとか原稿作成に便利なのになあ、と思っていたことを思い出しまして、最近は仕事も落ち着いたので手を出してみようかなあ、と勢いで記事を書くことにしました。

イメージとしては、QRコードリーダーに限りなく近いです。パズルの種類と縦横のマス数をあらかじめ入力して、画像を用意すると、そのpuzzlinkのURLを出してくれる。
理想を言えば、カメラをかざすだけでURLが出てきてくれる。

大雑把なシステムの構想


1.Webカメラや写真などで盤面の画像を用意する
.種類・マス数(これについてはあらかじめ入力する)をもとに盤面の長方形を取得、画像を1マスずつ細かく分割する
3.各マスごとに何が書かれているか、境界線がどうなっているかをがんばって認識する
4.盤面オブジェクトを作成して、これをpuzzlinkのURLに変換する

難しそうなのは2の部分、つまり写真から盤面部分をきれいな長方形として切り出す部分と、3の部分、つまり1マスごとに何が入っているかを見つける部分です。

前者は、盤面の4つの隅を特徴点として検出できれば、この4点の座標から3次元行列の中身のパラメータを計算、それを使ってきれいな長方形に幾何変換できる、みたいな話をコンピュータビジョンの講義で習った記憶があるので、そこを勉強すればなんとかなりそうな気がします。OpenCVとかのライブラリにありそうなので、しばらくはここらへんの勉強ということになりましょう。

後者は画像認識・文字認識というタスクなのでディープなラーニングの出番でしょうか。黒マス白マスの区別や境界線の太線などのシンプルな幾何学図形はCVの技法でがんばったほうがよさそうですが、少なくとも数字についてはニューラルネットが必要でしょう。とはいえMNISTデータの識別モデルはそれほど大掛かりな学習なく組めるので(卒論修論でさんざんやったのです)、これに2桁対応や画像のリサイズなどの処置を加えればなんとかいけそうな気はしています。

誤認識はあるという前提で、実際に認識した盤面が一意解になるのかをソルバーを回して判定できればなおのこと理想。
誤り訂正はできずとも、誤り検出だけでもあるとだいぶ違いそうです。

環境構築

理想を言えば「スマホをかざすとURLが出てくる」なのですが、スマホアプリ開発経験が皆無なうえストアの審査とか考えると嗚呼、となってしまいましたので、ひとまずはPC環境で作ることにします。

画像処理や深層学習メインなので、開発言語は無難にPythonにしましょうか。
ひとまず、画像処理系ということで OpenCV のライブラリを入れます。案の定ちょっと詰まったので導入メモ。
なお、Windows11 + WSL2 (Ubuntu) の環境です。

こちらの記事を参考に、以下のコマンドを実行。

$ python3 -m pip install opencv-python

公式ドキュメント通りにやったらうまくいかなったのですが、pip経由で入れたら無事に import cv2 が成功いたしました。
自分のように長らく放置しているような場合は、先に

$ sudo apt update
$ sudo apt upgrade
$ python3 -m pip install --upgrade pip

あたりもやっておくと、より確実かもしれないです(パッケージマネージャを最新版にアプデする作業です)。

最初の難関も越えたので、これからぼちぼち、進めていこうかなと思います。

この記事が気に入ったらサポートをしてみませんか?