ある日の事。
Python+OpenCVで画像解析してみよう。
まずは、ローカルで開発して動作確認、、、よし、できた。
次は、検証環境のWindowsServerにアップロードして動作確認、、、
>>> import cv2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\xxxxxxxx\AppData\Local\Programs\Python\Python37-32\lib\site-packages\cv2\__init__.py", line 3, in <module>
from .cv2 import *
ImportError: DLL load failed: 指定されたモジュールが見つかりません。
は!!?何で動かんのなら!!!??ちゃっちゃ動けや、ぶちくらわすぞ!!!!!(唐突な岡山弁)
## 動作環境
- ローカル
ソフト | バージョン |
---|---|
OS | Windows 10 Enterprise 2016(x64) |
Python | 3.7.1 |
OpenCV | 4.1.0.25 |
Microsoft Visual C++ | 2005/2008/2010/2013/2017 |
- 検証環境
ソフト | バージョン |
---|---|
OS | Windows Server 2012 R2 Standard(x64) |
Python | 3.7.2 |
OpenCV | 4.1.1.26 |
Microsoft Visual C++ | 2008/2010/2013 |
## 直接原因 エラーメッセージを読んで字の如く、DLLファイルの読み込みに失敗したらしい。 何のDLLファイルなのかは明示してくれない。悲しい。
とりあえず直接的な原因は、何かしらのDLLファイルが読み込めてない事となる。
では何でDLLファイルが読み込めてないのか。根本的な原因は何なのか。
## 根本原因 あれこれ調べると、『OpenCV3.4以降を使用するには、メディアパックなるものが必要である』という記述を見つけた。 [“DLL load failed” when import cv2 (opencv) - stackoverflow](https://stackoverflow.com/questions/52349669/dll-load-failed-when-import-cv2-opencv)
そして、『Windows Server 2012 R2には、メディアパックが標準実装されていない』という記述も見つけた。
2012 R2 Essentials 用 に Windows Server Essentials Media Pack が提供されました - 鳩の谷の街へ
更に、『Python3系でOpenCVを動作させるためには、「Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017 and 2019」をインストールする必要もある』という記述も見つけた。
Unofficial Windows Binaries for Python Extension Packages
検証環境を確認したところ、確かにメディアパックはインストールされておらず、かつ、Visual C++ 2015以降が存在していなかった。
つまり、import cv2
の宣言時にメディアパックに含まれるDLLを読みに行こうとして失敗していた事が根本的な原因だと考えられる。
また、今回はエラーとして挙がってこなかったが、おそらくVisual C++がインストールされていない事によるエラーも発生したと予想される。
## 対策 以下のサイトにまとめられている手順でセットアップすればOK。 [[Python] 機械学習の画像認識のために OpenCV を Windows にインストールしてみた](http://hokatsu.net/machine-learning/install-opencv-in-windows/) (このサイトに全ての手順は記載されているが、理由が書かれてなかったので今回記事を書いた)
セットアップの結果、無事にOpenCVが使えるようになった。
>>> import cv2
>>>
>>> cv2.__version__
'4.1.0'
>>>
おんどりゃ、やりゃできるやんけ!!!!!えろぉ手間かけさせやがって!!!!!
ちなみに、
本稿は「Windows Server 2012 R2 Standard」での手順だが、
これが「Windows Server 2012 Standard」になると、途端に状況が変わってくる。
後者にはEssentialsエクスペリエンスが実装されていない。
そのため、手順内の「Windows Server Essentials エクスペリエンスの設定」「Windows Server Essentials Media Pack のインストール」が実施できない。
つまり、新しい手順をしなければならない。
あほんだらぁ。
調査結果
- 「Windows Server 2012 R2 Standard」の場合
- Essensialエクスペリエンスを有効にする
- メディアパックをインストールする
- これによりSnipping ToolとかWindows Media Playerなどが使えるようになる
- それと同時に、OpenCVが使えるようになる
- 「Windows Server 2012 Standard」の場合
- Desktopエクスペリエンスを有効にする
- これによりSnipping ToolとかWindows Media Playerなどが使えるようになる
- Desktopエクスペリエンスを有効にする
つまり、
Snipping ToolやWindows Media Playerが使えるようになればOpenCVも使えるようになると考えられるため、Desktopエクスペリエンスを有効にすればよいと推測。
実施手順
以下を参照。
Windows Server 2012 または 2012 R2 へのデスクトップ エクスペリエンスのインストール
これにより、無事にOpenCVが使えるようになった。
MSさん、、、適用手順くらい統一せにゃおえまぁが。
## まとめ 「ちゃっちゃと」は岡山弁じゃないらしい(どうでもいい)