はじめに
ふと、「カメラの画角の中にQRコードが映ったときに、その時刻と内容をロギングできるアプリ」を、そのへんのWindowsPCで実行させといて現場に放り投げておきたいという衝動にかられたので作りました。
ライブラリの準備
当方、pipenvで仮想環境を切っているのでとりあえず以下で設定
pipenv --python 3
pipenv install pyinstaller numpy pyzbar opencv-python~=4.5.3.56
※現段階では、opencv-pythonのバージョンを上述に揃えないとうまく行かないそうです、1ハマり
コード
以下を参考にしました
exe化後に実行するとdllが足りない問題
一度、.pyファイルをexe化して、何度か実行を繰り返したところ、「libiconv.dll
がみつからない」とか「libzbar-64.dll
がみつからない」とかいうエラーになりました。
#1回目
(中略)
pyimod03_ctypes.install.<locals>.PyInstallerImportError: Failed to load dynlib/dll 'C:\\Users\\<<<USERNAME>>>_~1\\AppData\\Local\\Temp\\_MEI232402\\pyzbar\\libiconv.dll'. Most likely this dynlib/dll was not found when the application was frozen.
[8952] Failed to execute script 'read_qr_with_camera' due to unhandled exception!
#2回目
(中略)
pyimod03_ctypes.install.<locals>.PyInstallerImportError: Failed to load dynlib/dll 'C:\\Users\\<<<USERNAME>>>_~1\\AppData\\Local\\Temp\\_MEI232322\\pyzbar\\libzbar-64.dll'. Most likely this dynlib/dll was not found when the application was frozen.
[13688] Failed to execute script 'read_qr_with_camera' due to unhandled exception!
.specファイルをエディタで開き、以下を追加。dllファイルのパスはエクスプローラとかで検索して調べる。
a = Analysis(
(~~中略~~)
binaries=[(r'.\.venv\Lib\site-packages\pyzbar\libiconv.dll', '.'),(r'.\.venv\Lib\site-packages\pyzbar\libzbar-64.dll', '.')],
(~~中略~~)
)
Pyinstallerで作成したexeファイルのカレントディレクトリ
もし相対パスでファイルの入出力がどうしてもしたい場合は以下を参照
おわりに
まさかこんなところでバージョンの相性問題と出くわすとは思わなかった。
また、いまさらpyinstallerでexe化するのも流行らないとは思いますけど、まぁそこはね…。
解像度のせいで微妙に識別率が悪いのが難点。というかいまどきのWEBカメラは全部広角過ぎて遠くのQRコードは読めない、というかそもそもQRコードは遠距離から読み取るものじゃない。ARマーカってしゅごい。