Python + OpenCVを使いたかった (失敗録)

# やりたかったこと

* 大量の顔写真データから顔の部分の位置を検出して切り取りたい
* 何やらOpenCVなるものを使うと簡単に顔検出できるらしい
* Pythonって触ったことないけどなんとかなるでしょ

顔検出以前に環境構築でハマった失敗録です。

## (失敗) Windows 10 + Visual Studio 2017 + Python 3.6 + pip install

Visual Studio 2017はPythonを入れることができるのなら、それが早いかな。
Visual StudioインストーラでPythonを選択してインストール、IDEを起動してソリューションエクスプローラーを右クリックしPython環境メニューから`opencv-python`と入力すれば・・・

![image.png](https://qiita-image-store.s3.amazonaws.com/0/197772/746b8c1f-c860-9cf3-07b8-36a0cf475220.png)

~~~:出力
----- 'opencv-python==3.3.0.10' をインストールしています -----
Collecting opencv-python==3.3.0.10
  Could not fetch URL https://pypi.python.org/simple/opencv-python/: There was a problem confirming the ssl certificate: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749) - skipping
  Could not find a version that satisfies the requirement opencv-python==3.3.0.10 (from versions: )
No matching distribution found for opencv-python==3.3.0.10
----- 'opencv-python==3.3.0.10' をインストールできませんでした -----
~~~

あれ、SSLエラーでインストールできないってメッセージが・・・。
`--trusted-host`オプションで解決できるよ、という情報は見つけたけど、Visual StudioのIDEから実行する方法がわからん。別のやり方にしよう。

## (失敗) Windows 10 + Visual Studio 2017 + CMake + OpenCV 3.3

ふむ、Visual Studioでビルドする手順もあるのか。そっちやってみよう。

参考: [VisualStudio2013のPython3.4でOpenCVを使う](http://prpr.hatenablog.jp/entry/2015/04/14/VisualStudio2013%E3%81%AEPython3.4%E3%81%A7OpenCV%E3%82%92%E4%BD%BF%E3%81%86)

* まずVisual Studio 2017にC++を追加でインストール
* CMakeのWindows版をダウンロードしてきてインストール

あとはGUI版のCMakeを起動してディレクトリを指定すれば・・・・ってエラーが出て進まないんだけど。

![image (1).png](https://qiita-image-store.s3.amazonaws.com/0/197772/edb4c715-2791-3d44-1c97-55c244c055f5.png)

~~~:CMakeError.log
  C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.11.25503\bin\HostX86\x64\link.exe /ERRORREPORT:QUEUE /OUT:".\CompilerIdC.exe" /INCREMENTAL:NO /NOLOGO kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /PDB:".\CompilerIdC.pdb" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:".\CompilerIdC.lib" /MACHINE:X64 Debug\CMakeCCompilerId.obj
LINK : fatal error LNK1181: 入力ファイル 'gdi32.lib' を開けません。 [C:\opencv\build\CMakeFiles\3.10.0-rc3\CompilerIdC\CompilerIdC.vcxproj]
プロジェクト "C:\opencv\build\CMakeFiles\3.10.0-rc3\CompilerIdC\CompilerIdC.vcxproj" (既定のターゲット) のビルドが終了しました -- 失敗。

ビルドに失敗しました。
~~~

`gdi32.lib`が見つからないから失敗？64ビット環境だとダメなのかな？
Visual Studio 2017のインストール選択画面にはそれっぽいの見つからなかったけど・・・。

Windowsはよく分からないな。

## (失敗) Ubuntu 16.04(LXC) + Python 3.6 + OpenCV 3.3

WindowsよくわからないならLinuxでやろう。
今ある環境を汚したくないから、LXCコンテナ上でやればいいか。

* 参考サイト1: [UbuntuにOpenCV3.2とcontribをインストールする。](http://shibafu3.hatenablog.com/entry/2017/03/28/164125)
* 参考サイト2: [Ubuntu 16.04 にOpenCV 3.3.0 rc をインストールした](http://fpga.blog.jp/archives/71641962.html)

~~~:ホスト
lxc launch images:ubuntu/xenial/amd64 test
lxc run test bash
~~~

あとは参考サイトに従ってにビルドに必要なパッケージをインストールして、最新版のOpenCVを`git clone`してビルドすればいいんだな。

よし、ビルドも通った。

あれ〜〜、cv2.soができてないんだけど。
どこで間違えたんだろう？

## (失敗) Ubuntu 16.04(docker) + Python 3.6 + OpenCV 3.3

LXCがダメだったのか？なら1コンテナ1アプリケーションの原則には反するけど、dockerでやってみるか。

~~~
docker run -it ubuntu test
~~~

以下、LXCと同様にビルドしてみたが、やっぱりcv2.soがないよ〜。


## (とりあえず成功) Ubuntu + apt-get

PythonもOpenCVもバージョン古いけど、apt-getだけでできることに今さらながら気づく。

~~~bash
sudo apt-get install python-opencv
python
~~~

~~~Py
Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'2.4.9.1'
>>>
~~~

できた。

最新バージョンにこだわらず、Python 2.7 + OpenCV 2.4なら何の苦労もせずにすんだのか・・・。

## (成功) Windows 10 + Visual Studio 2017 + Python 3.6 + OpenCV 3.3

結局、Windows 10で最新のPythonとOpenCVをインストールできた。

1. 管理者としてPowerShellを起動
1. PythonのインストールパスにあるScriptsディレクトリに移動(VS2017のデフォルトでは`C:\Program Files\Python36\Scripts`)
1. PowerShellから`pip install`を`--trusted-host`オプション付きで実行

~~~:PowerShell
cd C:\Program Files\Python36\Scripts
.\pip.exe install opencv-python --trusted-host pypi.python.org
~~~

Python 3.6とOpenCV 3.3がインストールできた。
![image (2).png](https://qiita-image-store.s3.amazonaws.com/0/197772/432e79a8-4c37-9748-0103-7dd9ca36d162.png)

numpyパッケージも含めてインストールされたことをVisual StudioのIDEでも確認。
![image (3).png](https://qiita-image-store.s3.amazonaws.com/0/197772/c502802d-d66e-f198-eb1d-efbecfb49e6a.png)


顔検出に使うHaar検出器のデータはインストールされないので、別途ダウンロードが必要。

# 感想

いや〜ハマった。
環境構築した後は、先人たちのサンプルプログラムのおかげで顔検出は簡単だった。

Pythonって初めて触るけど、インタプリタがあるからMathematicaライクに使えて良いかも。

----
後日追加

## (成功) Ubuntu 16.04(docker) + Python 3.6 + OpenCV 3.3

Pythonの公式イメージを起動して、pipでインストールするだけでした。
なんでdocker上でビルドしようと頑張っていたのか、コレガワカラナイ。

~~~bash
docker run -it python:3.6.3 /bin/bash
~~~

コンテナ上で`pip install opencv-python`。

~~~bash
root@bc1ffc65c5a6:/# pip install opencv-python
Collecting opencv-python
  Downloading opencv_python-3.3.0.10-cp36-cp36m-manylinux1_x86_64.whl (15.4MB)
    100% |████████████████████████████████| 15.5MB 134kB/s 
Collecting numpy>=1.11.3 (from opencv-python)
  Downloading numpy-1.13.3-cp36-cp36m-manylinux1_x86_64.whl (17.0MB)
    100% |████████████████████████████████| 17.0MB 124kB/s 
Installing collected packages: numpy, opencv-python
Successfully installed numpy-1.13.3 opencv-python-3.3.0.10
root@bc1ffc65c5a6:/# python3
Python 3.6.3 (default, Oct 10 2017, 02:29:16) 
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.3.0'
~~~