Windows10開発環境下でPython+OpenCVを使うときにちょっとハマったときの導入メモ。
OpenCVのビルド
少し古いけど、Ver3.4.7のソースをダウンロードして、CMakeでMakefileやVisual Studio用のソリューションおよびプロジェクトファイルを生成します。
事前にAnaconda3がインストールされていれば、下図のようにpython関連のライブラリは参照されているはず。OPENCV_PYTHON3_VERSION
がデフォルトでチェックOFFだったのでとりあえずON。何に影響あるか不明だったけどとりあえず。
DLLが一塊になるBUILD_opencv_world
をON。大体ビルドすると80MBほどの1つの巨大DLLになる。個別にチョイスして小さくしたいならOFFのほうがいい。
Visual Studio2017でソリューション丸ごとReleaseビルドする。特にエラーは出ないと思われる。
Python環境へインストール
build/python/
直下にcv2フォルダが作成されているはず
このcv2フォルダを丸ごと、%USERPROFILE%\Anaconda3\Lib\site-packages
直下にコピーする
ちゃんとロードできるか、import cv2
で確認すると、
(base) C:\Users\hoge>python
Python 3.7.4 (default, Aug 9 2019, 18:34:13) [MSC v.1915 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>>
>>>
>>> import cv2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\hoge\Anaconda3\lib\site-packages\cv2\__init__.py", line 89, in <module>
bootstrap()
File "C:\Users\hoge\Anaconda3\lib\site-packages\cv2\__init__.py", line 79, in bootstrap
import cv2
ImportError: DLL load failed: 指定されたモジュールが見つかりません。
>>>
ここで悩むことに。。
%USERPROFILE%\Anaconda3\Lib\site-packages\cv2\python-3.7
以下にあるcv2.cp37-win_amd64.pyd
がpythonで最初にimportされるDLLのようなモジュールになる。
まずはこいつの依存関係をまずチェックすることに。
Dependencies
https://github.com/lucasg/Dependencies
https://github.com/lucasg/Dependencies/releases/download/v1.9/Dependencies_x64_Release.zip
Dependenciesは昔VisualStudioにツールとして同梱されていたDependency Walkerの後継ツールになる。ツールをダウンロードして、DependenciesGui.exe
を実行してpydファイルをロードさせてみる。
上2つのDLLへの参照が切れていることがわかる。
python37.dll
はAnaconda3の直下に存在しているので、Anacondaのコンソールから実行する場合はロードできているはずである。
> set
:
Path=%USERPROFILE%\Anaconda3;...
:
> cd %USERPROFILE%\Anaconda3
> dir python*
2019/08/10 08:35 95,232 python.exe
2019/08/10 08:35 438,272 python.pdb
2019/08/10 08:34 51,712 python3.dll
2019/08/10 08:34 3,748,864 python37.dll
2019/08/10 08:34 9,539,584 python37.pdb
2019/08/10 08:35 93,696 pythonw.exe
2019/08/10 08:35 438,272 pythonw.pdb
そうすると、opencv_world347.dll
へのパスが利いてないということがわかる。このDLLの参照関係はというと。。
system32以下のDLLしか見てないので、こいつへのパスを通すだけで大丈夫そう。システムの環境変数に以下のパスを追加する。
> set Path={opencv build dir}\opencv\build\bin\Release;%Path%
(base) C:\Users\hoge>python
Python 3.7.4 (default, Aug 9 2019, 18:34:13) [MSC v.1915 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>>
>>> import cv2
>>> cv2.__version__
'3.4.7'
>>>
ちゃんとロードできました。ショボい理由でした。