pythonは環境ごとにモジュールを入れなければいけないなど、非常に環境構築が面倒です。なので、実行ファイル化のためのツール「pyinstaller」はありがたい存在です。しかし、Ubuntuで実行ファイル化をして実際に動かしてみると、画像認識(OpenCV)が上手く処理していないことが判明。解決策があまり出てこなかったので、記録ついでに。
##作業環境
Ubuntu20.04
python(pyinstaller、opencv-python、opencv-contrib-pythonインストール済み)
※windowsは実行ファイル化の際にそれらしいdllファイルを作ってくれるので、今回のようなエラーは発生しないと思います。
今回は実行ファイルをonefileにせずpyinstallerを動かしています。
##エラー内容
qt.qpa.plugin: Could not find the Qt platform plugin "xcb" in "/home/ユーザ名/opt/etc/Desktop/dist/main/cv2/qt/plugins"
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
以前投稿した画像認識処理と似たようなコードを使用しています(画像取り込み→結果をウィンドウ表示)。
カメラで画像を取り込めたものの、取り込めた画像を表示できないようです。因みに画像取り込み自体ができていない場合は画像加工の処理で何かしらのエラーが出るはずです。
##解決策
結局のところ、pyinstallerのファイル参照が不十分なのが原因でした。
エラー内容と照らし合わせると、cv2
フォルダの中にあるqt
フォルダを参照できなかったとのこと。なので、まずqtフォルダを作業環境のcv2フォルダからコピぺします(cv2フォルダは、デフォの環境なら~/.local/lib/python3.8/site-packages
の中に入っているはず)。
これで、plugins以下のフォルダ・ファイルは認識可能となりますが、この状態では全てのソースファイルを参照していないため、引き続きqt.qpa.pluginは出てしまいます。参照していないファイルの確認は、libqxcb.soを閲覧することで分かります。下が参照しきっていないソースファイルの一覧。
$ ldd main/cv2/qt/plugins/platforms/libqxcb.so | grep "not"
libQt5XcbQpa-70670cdb.so.5.15.0 => not found
libfreetype-8d3bcff4.so.6.14.0 => not found
libz-d8a329de.so.1.2.7 => not found
libQt5Gui-ca084835.so.5.15.0 => not found
libQt5Core-d92f2856.so.5.15.0 => not found
libX11-xcb-1ae4fd0e.so.1.0.0 => not found
libxcb-icccm-413c9f41.so.4.0.0 => not found
libxcb-image-e82a276d.so.0.0.0 => not found
libxcb-shm-7a199f70.so.0.0.0 => not found
libxcb-keysyms-21015570.so.1.0.0 => not found
libxcb-randr-a96a5a87.so.0.1.0 => not found
libxcb-render-util-43ce00f5.so.0.0.0 => not found
libxcb-render-637b984a.so.0.0.0 => not found
libxcb-shape-25c2b258.so.0.0.0 => not found
libxcb-sync-89374f40.so.1.0.0 => not found
libxcb-xfixes-9be3ba6f.so.0.0.0 => not found
libxcb-xinerama-ae147f87.so.0.0.0 => not found
libxcb-xkb-9ba31ab3.so.1.0.0 => not found
libxkbcommon-x11-c65ed502.so.0.0.0 => not found
libxkbcommon-71ae2972.so.0.0.0 => not found
これらを参照するには、opencv_python.lib
フォルダを先ほどの作業環境からcv2フォルダと同じディレクトリ(今回の場合はmainフォルダ)へコピペする必要があります。opencv_python.libフォルダの中を見ると、大体同じようなファイルがいくつかあるかと思います。
このフォルダをコピペして初めて画像取り込み結果のGUIが表示されます。
まとめを兼ねて、最終的なファイル構成図を載せておきます。使用環境からcv2とopencv_python.libを探して、必要なものをコピペするという感じですね。
main
|- cv2(実行ファイル化の際にフォルダ生成)
| |- cv2.cpython-38-x86_64-linux-gnu.so(生成済み)
| |- qt(使用環境からコピペする)
| |- fonts
| |- plugins
| |- platforms
| |- libqxcb.so
|
|- opencv_python.libs(使用環境からコピペする)
| |- 各種ファイル
|
(中略)
|
|- main(実行ファイル)
pyqt5でも同じようなエラーが出るらしいのですが、pyqt5の解決策だけでは足りないというのには注意ですね。