1
2

More than 1 year has passed since last update.

OpenCVとpyzbarを使ったQRコード読み取りアプリをPyinstallerでexe化する

Last updated at Posted at 2022-09-09

はじめに

ふと、「カメラの画角の中に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マーカってしゅごい。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2