OpenCVがWindows Server 2012 (R2) Standardで動かない。（解決済）


## ある日の事。

Python＋OpenCVで画像解析してみよう。

まずは、ローカルで開発して動作確認、、、よし、できた。

次は、検証環境のWindowsServerにアップロードして動作確認、、、

```py
>>> 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: 指定されたモジュールが見つかりません。
```

は！！？何で動かんのなら！！！？？ちゃっちゃ動けや、ぶちくらわすぞ！！！！！（唐突な岡山弁）


<br>
## 動作環境

- ローカル

|ソフト|バージョン|
|:--|:--|
|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|



<br>
## 直接原因
エラーメッセージを読んで字の如く、DLLファイルの読み込みに失敗したらしい。
何のDLLファイルなのかは明示してくれない。悲しい。

とりあえず直接的な原因は、**何かしらのDLLファイルが読み込めてない事**となる。

では何でDLLファイルが読み込めてないのか。根本的な原因は何なのか。

<br>
## 根本原因
あれこれ調べると、『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 が提供されました - 鳩の谷の街へ](https://hatonotani.wordpress.com/2013/10/23/2012-r2-essentials-%E7%94%A8-%E3%81%AB-windows-server-essentials-media-pack-%E3%81%8C%E6%8F%90%E4%BE%9B%E3%81%95%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82/)

更に、『Python3系でOpenCVを動作させるためには、「Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017 and 2019」をインストールする必要もある』という記述も見つけた。
[Unofficial Windows Binaries for Python Extension Packages](https://www.lfd.uci.edu/~gohlke/pythonlibs/)

<br>
検証環境を確認したところ、確かにメディアパックはインストールされておらず、かつ、Visual C++ 2015以降が存在していなかった。

つまり、**`import cv2`の宣言時にメディアパックに含まれるDLLを読みに行こうとして失敗していた事**が根本的な原因だと考えられる。
また、今回はエラーとして挙がってこなかったが、おそらくVisual C++がインストールされていない事によるエラーも発生したと予想される。


<br>
## 対策
以下のサイトにまとめられている手順でセットアップすればOK。
[[Python] 機械学習の画像認識のために OpenCV を Windows にインストールしてみた](http://hokatsu.net/machine-learning/install-opencv-in-windows/)
（このサイトに全ての手順は記載されているが、理由が書かれてなかったので今回記事を書いた）

セットアップの結果、無事にOpenCVが使えるようになった。

```py
>>> 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などが使えるようになる

#### つまり、
Snipping ToolやWindows Media Playerが使えるようになればOpenCVも使えるようになると考えられるため、Desktopエクスペリエンスを有効にすればよいと推測。

#### 実施手順
以下を参照。
[Windows Server 2012 または 2012 R2 へのデスクトップ エクスペリエンスのインストール](https://docs.vmware.com/jp/VMware-Horizon-7/7.2/com.vmware.horizon.published.desktops.applications.doc/GUID-13F25FDB-654C-467F-9BC9-F2F9C4E4EAD7.html)

これにより、無事にOpenCVが使えるようになった。

MSさん、、、適用手順くらい統一せにゃおえまぁが。

<br>
## まとめ
「ちゃっちゃと」は岡山弁じゃないらしい（どうでもいい）