ビルドしたOpenCVをPython3(Anaconda3)で使用する

Windows10開発環境下でPython+OpenCVを使うときにちょっとハマったときの導入メモ。

OpenCVのビルド

少し古いけど、Ver3.4.7のソースをダウンロードして、CMakeでMakefileやVisual Studio用のソリューションおよびプロジェクトファイルを生成します。

事前にAnaconda3がインストールされていれば、下図のようにpython関連のライブラリは参照されているはず。OPENCV_PYTHON3_VERSIONがデフォルトでチェックOFFだったのでとりあえずON。何に影響あるか不明だったけどとりあえず。

opencv-python01-1

DLLが一塊になるBUILD_opencv_worldをON。大体ビルドすると80MBほどの1つの巨大DLLになる。個別にチョイスして小さくしたいならOFFのほうがいい。

opencv-python02

Visual Studio2017でソリューション丸ごとReleaseビルドする。特にエラーは出ないと思われる。

Python環境へインストール

build/python/直下にcv2フォルダが作成されているはず

opencv-python03

このcv2フォルダを丸ごと、%USERPROFILE%\Anaconda3\Lib\site-packages直下にコピーする

opencv-python04

ちゃんとロードできるか、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ファイルをロードさせてみる。

opencv-python05

上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の参照関係はというと。。

opencv-python06

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'
>>>

ちゃんとロードできました。ショボい理由でした。

-->