Canopyによる楽々Python+OpenCVプログラミング


# ねらい
+ 「OpenCVというオープンソースライブラリで色々画像処理できると聞いたんだけどビルドでこけてつらい」
+ 「Pythonが便利らしいんでこの際C++やMatlabから移行したいんだけど環境構築でこけてつらい」

といった方のために，Canopyと呼ばれるPythonの統合開発環境の構築法および利用例を紹介します．Visual studio等を用いてC++&openCV環境を構築する場合と比較して非常に簡単です．主に学生〜教職員を対象としています（アカデミックアカウント前提で話をします）．また，Macでの構築例を紹介していますが，他プラットフォームでも大差ないと思います．Linux, Windowsの場合パス設定周りを適当に読み替えてください．

# Step 1 アカウント開設〜ダウンロード

もしあなたが***.ac.jpみたいな大学のメールアカウントを持っている場合，Canopyでアカデミックアカウントを開設でき，200以上ものpre-build packageを無償で利用できるようになります．大学アカウントを持ってない方は，http://www.i.u-tokyo.ac.jp/edu/entra/ http://www.i.kyoto-u.ac.jp/admission/guide.html この辺りを参考にしてください．

+ https://store.enthought.com/accounts/login/?next=/licenses/academic/request/ でアカウントを申請します．
+ https://store.enthought.com/downloads/ からCanopyをダウンロードします．

# Step 2 インストール〜初期設定
+ Applicationsのディレクトリに放り込み，起動します．
![kobito.1418787043.739989.png](https://qiita-image-store.s3.amazonaws.com/0/69/ce850a34-b9af-7447-1a6d-528e6fd77802.png "kobito.1418787043.739989.png")

---

+ 以下のように/Users/ユーザ名/Library 以下に環境ファイルが作成されます．<b>つまり，元々入っているpythonと競合しない</b>ので，好きに作ったり消したりできます．
![kobito.1418787125.262010.png](https://qiita-image-store.s3.amazonaws.com/0/69/65f1c7d3-04a9-cfd5-fc39-a0a14f801a20.png "kobito.1418787125.262010.png")

---

+ Canopyのpythonをデフォルトで利用するかどうか決めます（後から変更可能）．
![kobito.1418787221.972218.png](https://qiita-image-store.s3.amazonaws.com/0/69/1389b5ac-9e21-575f-9d74-38ccf7562786.png "kobito.1418787221.972218.png")

多くの場合yesで良いですが，VimやEmacsでpython開発環境を作りたい or 作っている場合は， http://stackoverflow.com/questions/19617936/importerror-no-module-named-site-vim-and-enthought-canopy この辺のエラーで怒られてしまうという問題があります．

+ 僕の場合，Canopy pythonはデフォルトに設定せず，Canopy内でよく使うipython, 後述のenpkgあたりのエイリアスを作るようにしています．この辺りもっといい方法がありましたらどなたか教えてください．
![kobito.1418787531.691445.png](https://qiita-image-store.s3.amazonaws.com/0/69/fbcd1d77-8461-09a4-0916-ead27d832015.png "kobito.1418787531.691445.png")

# Step 3 パッケージのインストール
+ Canopyを起動するとこのようなウィンドウが出てきます．まずは先に開設したアカウントでログインし，Package Managerを選択しましょう．

![kobito.1418787608.128430.png](https://qiita-image-store.s3.amazonaws.com/0/69/430d70e5-211d-a9ad-ade5-abe6501a60a6.png "kobito.1418787608.128430.png")

---

+ こんな感じでアップデート可能なパッケージがずらずらと

![kobito.1418787657.428824.png](https://qiita-image-store.s3.amazonaws.com/0/69/95c10090-44a2-b1b0-fdc9-fde721002cfd.png "kobito.1418787657.428824.png") 

---

+ OpenCVも検索すれば出てきます．Installを選択するとインストールされます．簡単ですね．

![kobito.1418787708.844389.png](https://qiita-image-store.s3.amazonaws.com/0/69/9d90bc8c-e125-3f70-ee8e-fbe87c093d22.png "kobito.1418787708.844389.png") 

---

### ターミナルで頑張りたい
「こんなGUIは使いたくない！ターミナル上で頑張りたい！」という方はenpkgを使いましょう．僕は専らenpkg派です．

+ enpkgはここにあります．

![kobito.1418794148.808244.png](https://qiita-image-store.s3.amazonaws.com/0/69/2e6204ca-18a1-453b-2d36-9d25661cad14.png "kobito.1418794148.808244.png")

---

+ --whats-newでアップデート可能なパッケージが出てきます．

![kobito.1418787909.465810.png](https://qiita-image-store.s3.amazonaws.com/0/69/a8432738-623c-cd97-e70e-8eea0b9e4b3f.png "kobito.1418787909.465810.png")

---

+ -s でパッケージ検索ができます．

![kobito.1418788060.607035.png](https://qiita-image-store.s3.amazonaws.com/0/69/5f77197f-1269-b98d-6c2b-56d39e13ff5f.png "kobito.1418788060.607035.png")

---

+ インストールします．

![kobito.1418788083.535679.png](https://qiita-image-store.s3.amazonaws.com/0/69/8f091803-9776-66a9-29bf-cc669aac641b.png "kobito.1418788083.535679.png")


# iPython notebookによる開発

Canopy自体はコンソール・エディタを持っており，それだけで開発も可能なのですが，ここではiPythonのウェブベース開発環境である，iPython notebookを利用してみましょう．

+ ターミナル上で ```ipython notebook```を実行
	+ ipython notebookを起動したディレクトリ上にバックアップファイル等が生成されていきます．

![kobito.1418790333.038322.png](https://qiita-image-store.s3.amazonaws.com/0/69/84302a15-7644-b7ca-b031-3e1395fd31fc.png "kobito.1418790333.038322.png")
	
---

+ 以下のような画面がでてきます．右のNew Notebookを選択しましょう．
![kobito.1418790420.377056.png](https://qiita-image-store.s3.amazonaws.com/0/69/607ec948-c0be-4bf2-f6dc-d121b6311e96.png "kobito.1418790420.377056.png")

---

+ iPython notebookでは，「セル」と呼ばれるテキストボックスにスクリプトを書き，実行することができます．

![kobito.1418790535.752484.png](https://qiita-image-store.s3.amazonaws.com/0/69/adde070a-631f-1287-68aa-7e485b99e2df.png "kobito.1418790535.752484.png")

---

+ 関数やクラスを書くこともできます．

![kobito.1418790595.188506.png](https://qiita-image-store.s3.amazonaws.com/0/69/d82966f7-b0c3-65af-36d5-2ab3407ea150.png "kobito.1418790595.188506.png")

---

+ メニュー左のプルダウンからMarkdownを選択することで，マークダウンを書くこともできます．

![kobito.1418790793.932163.png](https://qiita-image-store.s3.amazonaws.com/0/69/4667d684-0316-579d-9774-c2f4c684382a.png "kobito.1418790793.932163.png")
![kobito.1418790709.589093.png](https://qiita-image-store.s3.amazonaws.com/0/69/7b940d42-c089-7e40-0a34-5e747dc67831.png "kobito.1418790709.589093.png")
↓
![kobito.1418790717.607891.png](https://qiita-image-store.s3.amazonaws.com/0/69/cd2cffe2-2715-82eb-119e-f2c2e9f8c361.png "kobito.1418790717.607891.png")

---

+ bashを書くこともできます．

![kobito.1418790912.356443.png](https://qiita-image-store.s3.amazonaws.com/0/69/b36fcdb2-345b-f9fd-5c96-e821244ddfb1.png "kobito.1418790912.356443.png")

---

+ htmlを書くこともできます．

![kobito.1418790971.489943.png](https://qiita-image-store.s3.amazonaws.com/0/69/05d64c29-ed35-6d94-d175-b1781f91ddd0.png "kobito.1418790971.489943.png")


# OpenCVを試してみよう
最後に，openCVの諸機能を簡単に試してみましょう．


### 画像の表示
![kobito.1418791217.305235.png](https://qiita-image-store.s3.amazonaws.com/0/69/6e0cc19d-7430-62dd-cea7-08cda7e592d8.png "kobito.1418791217.305235.png")


+ ```%pylab inline``` はmagic functionと呼ばれる関数のひとつで，これを実行することで画像をインラインに表示することができるようになります．


### カメラから取得した映像の表示
![kobito.1418791517.292589.png](https://qiita-image-store.s3.amazonaws.com/0/69/bd7cb52d-4a68-3c76-cb31-db475c0edfbb.png "kobito.1418791517.292589.png")


+ ```time.time()```は1970年1月1日真夜中（午前0時0分0秒）からの経過秒をfloatで返します．
+ ```cv2.VideoCapture(0)```で0番目に接続されたカメラに接続します．ここで動画ファイルを指定すると，その動画が読み込まれます．
+ ```cap.read()```で画像をキャプチャし，imshowで吐き出しています．上記のinline環境だとうまく動画を再生してくれないので，ここではosx環境を利用します．
+ ```plt.draw()```をすることで，初めてインタラクティブに画像が更新されます（忘れやすい点）


### 顔検出
ここでは有名なViola&Jonesのカスケード型顔検出を試してみます．

+ 顔検出の学習済みモデルを拾ってきます．せっかくなのでnotebook上でbashを書いてみましょう．![kobito.1418792138.620981.png](https://qiita-image-store.s3.amazonaws.com/0/69/c7d09796-52bf-6bbd-437a-349fb33eefd5.png "kobito.1418792138.620981.png")
+ ![kobito.1418792473.383984.png](https://qiita-image-store.s3.amazonaws.com/0/69/17ce1878-d4ef-ac38-6153-8e74b0f82d80.png "kobito.1418792473.383984.png")


# おまけ: scikit imageによる画像処理
PythonにはopenCVとは別にscikit imageと呼ばれるパッケージがあり，openCVには実装されていない手法が搭載されています．
詳細は http://scikit-image.org/docs/dev/auto_examples/index.html

### 画像細分割（oversegmentation）
![kobito.1418793602.836684.png](https://qiita-image-store.s3.amazonaws.com/0/69/3b680977-f99b-8d44-0a0a-54972a3da3f4.png "kobito.1418793602.836684.png")


+ ```skimage.io.ImageCollection```では，引数に合致する画像群をリストとして読み込みます．たとえば，img0.png, img1.png,...img10.pngがあるディレクトリ上で，```img = ImageCollection('img*.png')```を実行すると，i番目の要素にi番目の画像が含まれたリストが作成されます．
+ ```skimage.segmentation.slic```に実装されたSLICは画像細分割（oversegmentation）手法の一つであり，上のように画像をいくつかの小領域（superpixel）に分割することができます．```mark_boundaries```はそれを描画するための関数です．