PythonでOpenCVを使う(Windows版)

  • 11
    いいね
  • 0
    コメント

OpenCV3.1.0が出ていたので、久しぶりに画像解析をやってみました。マシンスペック上の都合と環境に慣れているという理由でWindows環境を使います。

環境・ソフトウェアなど

  • Windows10(64bit)
  • WinPython ※Pythonは2.7系を利用。
  • OpenCV3.1.0

環境構築

WinPython

WinPythonを使うとWindows上でPython環境をまるっと一式構築できます。Spyderという強力なエディタ(IDE)がついていて、便利なインタラクティブシェル(IPython)があるので初心者でもおすすめ。

ダウンロードは以下のサイトから

http://winpython.sourceforge.net/

今回はPython2.7系を使うんでダウンロードページからWinPython-64bit-2.7.10.3.exe(2016年1月8日時点)をダウンロードします。
32bitを使ってる場合は32bit版を落としましょう。
インストールはインストーラの導く通りに。構築はCドライブ直下に置いとくといいかと思います。。

OpenCV

公式サイトからダウンロードします。
http://opencv.org/
OpenCV for Windowsを落としてきます。これもインストーラに従って導入。環境はCドライブ直下に格納。

OpenCVとWinPythonの連携

Pythonでは追加されたモジュールをsite-packageというフォルダ(ディレクトリ)で管理しています。OpenCVのインストールフォルダから必要な管理ファイルをとってきます。

OpenCVをインストールしたフォルダを開き
build→python→2.7の順にフォルダを開いていきます。opencv/build/python/2.7/以下には32bit版と64bit版の二種類の管理ファイルがあります。今回は64bit版を使うので
opencv/build/python/2.7/x64/以下にあるcv2.pydファイルをクリップボードにコピーします。このファイルをWinPythonのモジュール管理フォルダに格納します。

WinPythonをインストールしたフォルダを開き
python-2.7.10.amd64→Lib→site-packageの順に進み、先ほどのcv2.pydを貼り付けます。

これで準備は完了。

画像の読み込みと表示

WinPythonのインストールフォルダでSpyderを起動します。
Spyder.PNG

右下にIPythonコンソールがあるので、ここでインストールできてるか確認しましょう。In[1]:のところでcv2モジュールをインポートします。

import cv2

エラーが出なければOK。WinPythonの3系をインストールしているとエラーが出てモジュールの読み込みはできません。

ここからcv2を使って画像を読み込んだり、切り出したりをやっていきます。作業フォルダに手ごろな画像を格納しておきます。今回はmusume.jpgを使いました。

import cv2
image = cv2.imread('musume.jpg', 1)
cv2.imshow('musume_photo', image)
cv2.waitKey()

これで別ウィンドウが開き写真が表示されます。
cv2.imreadは第一引数に画像のパス、第二引数は0~の数値をとります。0はグレー、1以上で3チャンネルカラー画像になるらしいです。

画像の切り出し

なんとなくの使い方が分かったところで今度は画像の切り出しをやってみます。娘の写真から顔の部分だけを取り出します。インタラクティブシェルを使ってテストしながら進めていきます。

import cv2
image = cv2.imread('musume.jpg', 1)
cascade_path =  'C:\opencv\sources\data\haarcascades\haarcascade_frontalface_default.xml'
cascade = cv2.CascadeClassifier(cascade_path)
face_cascade = cascade.detectMultiScale(image, 1.1, 3)

OpenCVをインストールすると、正面からの顔を抽出できるXMLファイルが入ってます。ファイルの場所をcascade_pathで指定し分類器に読み込んでいます。
face_cascade以下で使用する画像を分類器に読み込ませ、該当する画像上の位置を取り出しています。face_cascadeを呼び出してみると

print(face_cascade)

画像の中で顔と思わしき場所が出力されます。

[[1517 1865   94   94]
 [1114 1762  119  119]
 [1319 1263  118  118]
 [1392  843  863  863]
 [ 964 1590   69   69]
 [1974 1809   73   73]
 [2151 1760   73   73]
 [2112 1764   57   57]
 [1949 1866   72   72]]

9個顔があるらしい。娘が増えた。
このリストは画像中の顔の位置を示しています。これを使って画像を切り出していきます。

i = 0
for rect in face_cascade:
    x = rect[0]
    y = rect[1]
    w = rect[2]
    h = rect[3]
    img = image[y:y+h, x:x+w]
    cv2.imwrite('musume_face_' + str(i) + '.png', img)
    i += 1

さっきの9個のリストを上から順に読み込みます。んで一つづつ画像として保存(cv2.imwrite)します。

sample.PNG

左上の画像がもともとの写真。顔の抽出もできていますが、なんか3個の点があれば全部顔と認識してるっぽいですね。

この結果を使ってCaffeなんかで学習させると娘を識別させることもできるかも。