解決策
why happened
c++でopencvを使おうとcuda対応のopencvをビルドしたらなぜかpythonのopencvが使えなくなった。
Traceback (most recent call last):
File "<>", line 1, in <module>
import cv2
File "<>/Lib/site-packages/cv2/__init__.py", line 181, in <module>
bootstrap()
File "<>/Lib/site-packages/cv2/__init__.py", line 153, in bootstrap
native_module = importlib.import_module("cv2")
File "<>/lib/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
ImportError: DLL load failed while importing cv2: 指定されたモジュールが見つかりません。
whats happening
import cv2をすると__init__.py
内でbootstrap()
(一番最後の行にある)が呼び出されてopencvのdllとかを探して読み込む処理が走るのだろうがうまくdllが読み込まれない。
def load_first_config(fnames, required=True):
あたりで/Lib/site-packages/cv2/
にあるconfig.py
からBINARIES_PATHS
を読み込み
for p in l_vars['BINARIES_PATHS']:
try:
os.add_dll_directory(p)
でdllの検索パスに追加する。
ここでdllのあるディレクトリが検索パスに追加されていないからモジュールが見つからないとなったのだ!つまりはconfig.py
に環境変数のPATHを追加したり直接パスを書き込めばうまく読み込んでくれるという
how to solve
/Lib/site-packages/cv2/config.py
を
import os
BINARIES_PATHS = [
*os.environ["PATH"].split(";") # <-これ
] + BINARIES_PATHS
こういう風に書き換える。ちゃんと必要なdllが環境変数のパスのフォルダにあればこれで解決するはず
足りないdllの見つけ方
足りていないdllはここからprocess monitorをダウンロードして
画面上部のメニューFilter ->Filter
をクリックし、
以下のフィルターを追加する
Process Name contains Python then Include
Path Contains .dll then Include
-
Result is SUCCESS then Exclude
<-optional
Applyで適用して
python -c "import cv2;"
とかでopencvをインポートするだけのコードを実行する。
出てきたResultがNAME NOT FOUNDになってるのが見つからなかったdllであるから、それが含まれるディレクトリをパスに追加する。
私の場合はcudnn、cuda、opencvのdllが不足してた。
ほかの解決策
-
pip install opencv-contrib-python
- windows N/KNではWindows Media Feature Packがないから実行できないとかがあるらしいlink
参考