とりあえずWindows上のIPython Notebook + OpenCV環境構築

# この記事は
Python + OpenCVで画像を弄くりまわしちゃいたいので、Windows 7上にPython + virtualenv + OpenCV環境構築したときのメモです。
基本的に自分用のメモですので、読みにくくてもあしからず。

記事は
1. PythonのDLとインストール
2. virtualenvのインストール
3. OpenCVのインストール
4. テストラン
の順に書いていきます。

参考記事↓
[Windowsでpyenvとかvirtualenvを使おうと思ったときに学んだことのメモ](http://qiita.com/nobolis/items/12a464557f2ae007e9a1)
[Windows環境でVirtualenvする](http://blog.livedoor.jp/gab_km/archives/1406488.html)

# 1. Python DL&Install
とりあえず公式サイトへ行き、インストーラを入手します。
トップページからも入手できますが、x64バージョンを確実に入手したかったのでリリースノートから86-x64 MSI installerをDLしてきました。
公式: https://www.python.org/
3.4.3リリースノート: https://www.python.org/downloads/release/python-343/

DL後はインストーラにしたがって Next> をぽちぽちすればインストールされます。
(以下、インストール先は < PYTHON_PATH > と表します。私は何も考えずに C:/Python34 にインストールしました。)

インストールが終了したらPATHに以下の2つのパスを登録してください。
(例は```C:\Python34```にインストールしたとして)
Python本体: ```C:\Python34```
補助コマンド(pip, easy_install): ```C:\Python34\Scripts```

# 2. virtualenvのインストール
つづいて virtualenv をインストールします。
virtualenvは本体とは独立したPython環境を構築するためのツールで、Rubyでいうところのbundleと同等の機能を持っています。
環境を独立させることで、特定の作業にしか利用しないライブラリ(i.e. OpenCV)が他の環境へ影響を与えることを防ぎ、個々の環境を管理しやすくなります。
ざっくり言えば、↓なんだそうです。
> virtualenv is a tool to create isolated Python environments.
公式: https://virtualenv.pypa.io/

公式サイトに則り次のコマンドを入力するとインストール完了です。
https://virtualenv.pypa.io/en/latest/installation.html

```
> pip install virtualenv
```

インストールが完了すると```<PYTHON_PATH>\Scripts```にvirtualenv.exeが生成されていて、コマンドプロンプトから利用できるようになります。

virtualenvのインストールが完了したら、いよいよ作業用ディレクトリを作成します。
コマンドプロンプトを開き、適当な作業用ディレクトリを作成&移動したうえでOpenCV用の環境"opencv"をそのディレクトリに作成します。
次のコマンドを入力すると環境が構築できます。

```
> virtualenv opencv
```

仮想環境上で作業する際には activate.bat で環境に入り、抜ける際には deactive.bat で環境を閉じます。

```
> opencv\Scripts\activate.bat
(opencv) ...>
(opencv) ...> opencv\Scripts\deactive.bat

```

virtualenvの詳しい使い方は公式のユーザガイドを参照してください。
User Guide: https://virtualenv.pypa.io/en/latest/userguide.html
Reference Guide: https://virtualenv.pypa.io/en/latest/reference.html

# 3. OpenCVのインストール
Virualenvをインストールできたので、いよいよOpenCVをインストールします。

OpenCV2.x (2015年6月4日には3.0がリリースされました) では画像データをnumpyで管理しています。
まずはOpenCVをインストールする前にnumpyをインストールします。
Virtual Studioがインストールされていれば自前コンパイルも可能ですが、今回はカリフォルニア大学アーバイン校のGohlkeさんらが公開しているパッケージをつかってインストールします。
Unofficial Windows Binaries for Python Extension Packages: http://www.lfd.uci.edu/~gohlke/pythonlibs/
numpy: http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy
今回はnumpy-1.9.2+mkl-cp34-none-win_amd64.whlをDL&installします。

```
pip install "numpy-1.9.2+mkl-cp34-none-win_amd64.whl"
```

続いて opencv もDL&installします。
opencv: http://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv
今回はopencv_python‑3.0.0‑cp34‑none‑win_amd64.whlをDL&installします。

```
pip install "opencv_python‑3.0.0‑cp34‑none‑win_amd64.whl"
```

以上でインストールは終了です。

# 4. テストラン
テストランの前にせっかくなのでpython用の編集環境 ipython を整えます。
ipythonのnotebook機能は試行錯誤する際には重宝するツールです。
ipythonはjupyterというライブラリに依存するのでまずはjupyterをインストールし、次にipythonをインストールします。
また画像表示のためにmatplotlibをインストールします。

jupyter: http://www.lfd.uci.edu/~gohlke/pythonlibs/#jupyter
ipython: http://www.lfd.uci.edu/~gohlke/pythonlibs/#ipython
matplotlib: http://www.lfd.uci.edu/~gohlke/pythonlibs/#matplotlib

インストールしたのは
jupyter: jupyter‑1.0.0‑py2.py3‑none‑any.whl
ipython: ipython‑4.0.0‑py2.py3‑none‑any.whl
matplotlib: matplotlib‑1.4.3‑cp34‑none‑win_amd64.whl
です。

```
pip install "jupyter‑1.0.0‑py2.py3‑none‑any.whl"
pip install "ipython‑4.0.0‑py2.py3‑none‑any.whl"
pip install "matplotlib‑1.4.3‑cp34‑none‑win_amd64.whl"
```

インストール後、 ```ipython notebook```と入力するとブラウザが立ち上がりファイルの閲覧編集が可能になります。
詳しい使い方はGoogle等で検索すれば見つかるとおもいます。
はじめるiPython notebook: http://qiita.com/icoxfog417/items/175f69d06f4e590face9

今回は定番のレナさんの画像をとりあえず読み込んで表示してみます。
(Wikipediaで全体画像を見てみたけどなかなか良い、けど会社ではちょっと・・・)
画像本体(from カーネギーメロン大): http://www-2.cs.cmu.edu/~chuck/lennapg/lena_std.tif
[The Lenna Story](http://www.cs.cmu.edu/~chuck/lennapg/)
[Wikipedia: レナ_(画像データ)](https://ja.wikipedia.org/wiki/%E3%83%AC%E3%83%8A_(%E7%94%BB%E5%83%8F%E3%83%87%E3%83%BC%E3%82%BF))

コードを示します。

```py3
%matplotlib inline
import cv2 # opencv
import matplotlib.pyplot as plt # matplotlibの描画系

fn_img = "lena_std.tif" # レナさんの画像ファイル名
img = cv2.imread(fn_img) # レナさんの画像を読み込む

# opencvの処理系では (B,G,R) で管理されているが、
# matplotlib では (R,G,B) で画像を認識するので、
# 表示用に一旦変換する
show_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 

plt.imshow(show_img) #表示
```

実行結果は↓みたいな感じです。
![result.jpg](https://qiita-image-store.s3.amazonaws.com/0/79960/5f78324e-728c-2516-67dd-7936515fde7e.jpeg)


# おまけ
ためしに顔認識してみた結果を示します。

```py3
%matplotlib inline
import cv2 # opencv
import matplotlib.pyplot as plt # matplotlibの描画系

fn_img = "lena_std.tif" # レナさんの画像ファイル名
img = cv2.imread(fn_img) # レナさんの画像を読み込む

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # グレースケール化

# cascade の学習結果は https://github.com/Itseez/opencv/tree/master/data/haarcascades から落とせる
cascade_path = "haarcascade_frontalface_alt.xml"
cascade = cv2.CascadeClassifier(cascade_path) # カスケード分類器を作成
facerect = cascade.detectMultiScale(img_gray, scaleFactor=1.1, minNeighbors=1, minSize=(10,10)) # 顔認識

img_result = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 出力結果用にコピー & RGB化
rect_color = (0, 255, 0) # 矩形の色 (B=0, G=255, R=0)
if len(facerect) > 0:
    for rect in facerect:
        # 検出範囲を矩形で囲む
        cv2.rectangle(img_result, tuple(rect[0:2]), tuple(rect[0:2] + rect[2:4]), rect_color, thickness=2)

plt.imshow(img_result)
```

![sample2.jpg](https://qiita-image-store.s3.amazonaws.com/0/79960/622b6540-0990-299d-2cd6-32b357974f14.jpeg)

おしい・・・

![sample3.jpg](https://qiita-image-store.s3.amazonaws.com/0/79960/13dc3da1-3240-ec7b-c106-83e4e758b2bf.jpeg)

とりあえず、こんな感じで使えます。