考えていた生活支援/対老化ツールを作るのにopencvを使うのがよいだろうという結果に達した。 遅ればせながらであるがopencvの環境を勉強して作ることにした。 opencvのサンプルコードを評価しつつ、 「現在の個人ツール群がほぼnodejs/typescript系でまとめられているので、やるならnodejs系のツールにしたい」 という訳でopencv4nodejsの利用を検討。 開発ツールはほぼWindowsでまとまっているのでopencv4nodejsをwindows版でビルドして使おうと考えた。
が、これをビルドするのにこの1週間くらい試行錯誤しまくった。。。
単純に npm install opencv4nodej ではよく分からないところでエラー。
自動ビルドではダメだったし手動ビルドを試してもまたエラー。。。
まず開発環境のnode-gypの環境が乱れまくってたのでそのあたりを整理が必要だった。
npmとclassic yarnとyarn2が混じり合ってる(かつツールのインストールもwindowsインストーラーだったり chocoだったり、npmの自己インストールだったり) このあたりをとにかく整理して、少なくともnode-gypを使うプロジェクトはnpmを使う方向でまず整理。
次はPython2とPython3の問題。。。
これもwindowsインストーラーだったり、chocoだったり、PATHを通すのもCドライブだったりDドライブだったり。 これもとりあえずはpyenv-winで整理したもののPATHの認識がおかしいケースなどもあって結局環境変数に直書き。
VisualStudio類はとりあえず入っているが、cmakeは入れてなかったのでcmakeをインストール。
このときcmakeのRC版を入れたら、原因不明のSSLエラーになってそれで数日悩む。cmakeの公式版を入れたら問題解決。。。
で、このあたりまでで手動ビルドのopencv4nodejsは走った。
結構USBカメラでいろいろ写したり、画像ファイルを認識させたりは結構面白い。
でも基本機能しか走らない。各種解説サイトとか検索しつつ、よくよく解説を読むとライセンスからみの問題があるものは別ソースで 再ビルドが必要とのこと。
https://github.com/opencv/opencv_contrib
各種サイトを参考にしつつ、contrib含み版をビルドしようとするもエラーが結構出る。
1週間近くああでもないこうでもないとやるものの、opencv4nodejsのdnnとかの拡張機能動作しない。
そのうちnode-gypのVisualStudioの直ビルドとかも組み合わせたり、ubuntuでビルドしたら動くのかを確認したり
(ubuntu wsl2では環境設定をすればまったくエラーが出ず拡張機能まで動作した。ただWindows側のUSBカメラが認識しない。。。)
npmのopencv4nodejs-prebuiltや@nut-tree/opencv-build-win32を使ってみたり。
(こっちは基本機能までは実にさくっと動いた。ただ拡張機能はやはり動かず。contribも動くと書かれているのになぜ??)
もう頭にきて、ビルド時のエラーメッセージを丁寧に読むことにした。
(普通にnpmインストールしたときに、細かいエラーメッセージを出さないのも結構きつかった)
固有の根の深い問題1
opencv4nodejsがopencvをビルドするのに内部でopencv-buildというパッケージを使っているのだがこれのwindows build tools (VisualStudioのビルド部分のみを切り出したツール)のパス検出が決め打ち気味。 MSBuild\15.0\Bin\MSBuild.exe 自分の環境ではそのままVisualStudioが通るものだと思って動かしていたが、MSBuild.exeが見つからないところで落ちまくっていたようだ。 これは公式説明通りに古いwindows build toolsを取り込んだら落ちないのかもしれないが、そんなにSDKばかり入れる訳にもいかない。固有の根の深い問題2
ビルドがほぼほぼ通った後に一番最後に手間取った問題はopencv4nodejs.nodeのスタブバイナリが生成されているのに実行時に
Error: The specified module could not be found.
...\node_modules\opencv4nodejs\build\Release\opencv4nodejs.node
と出て動かない問題。
https://github.com/justadudewhohacks/opencv4nodejs/issues/440
で類似現象があったのでよく読んでみる。 opencvのbinライブラリのパスを システム環境変数 に登録すること。 システム環境変数に入れることは、公式にも書かれてはいるもののユーザ環境変数側ではダメなのか。。。 いや環境変数も中盤のビルドで似たような環境変数の設定で何回もああでもないこうでもないをやっているので何か別の問題なのかもしれないが、 とにかくopencvのbinのライブラリのパスをシステム環境変数側のPATHに加えて、ようやく拡張機能もnodejs側から試せるようになった。
でも「The specified module could not be found」なら試行錯誤の中盤くらいでも見たことはあり、そのときにうまく設定していれば もっと早く解決したのかなぁ。。。とにかくこの手の環境依存の問題はWindowsでは結構面倒。。。 Macならunix系環境なので癖はあるもののこの手の問題は起きにくい。だからMacを使うという人が多いのもわからんではないのだが macはもうメインには遠慮したい。
とりあえず役に立ったサイトリンクを。
https://www.npmjs.com/package/opencv4nodejs
https://github.com/opencv/opencv_contrib
https://www.npmjs.com/package/opencv4nodejs-prebuilt
(とりあえずopencv4nodejs windowsを動かすの参考になった)
https://swallow-incubate.com/archives/blog/20200508/
(opencv windows版ビルドの参考になった)
https://github.com/justadudewhohacks/opencv4nodejs/issues/115
(正しく動くためののPATH値の参考になった)
https://github.com/justadudewhohacks/opencv4nodejs/issues/440
(モジュール見つからないの原因確定)
あとどこだったか サンプルコードの cv.xmodules.dnn は cv.modules.dnn だったという話も役だった。
一旦nodeベースで認識が動くとなれば、いろいろ組み込みやテストもしやすいだろう。
少し落ち着いたら個人管理ツールへの応用を少しずつ作ってみよう。