2017-02-11

PythonOpenCV PythonでOpenCV - Nao_uの日記 を含むブックマーク はてなブックマーク - PythonでOpenCV - Nao_uの日記 PythonでOpenCV - Nao_uの日記 のブックマークコメント

オプティカルフローを取得するのはOpenCVでやるのがよさそうで、OpenCVで画像処理するならC++よりPythonのほうが色々融通が利く。

ちょうど「ゼロから作るDeep Leraning」のためにAnaconda3を入れてたので、そこでOpenCVを動かして試すのが楽そう。

Deep Learning本を見てた時はコマンドラインでやってたけど、いろいろ調べてたらSpyderという統合環境がAnacondaを入れたときに一緒にインストールされてたことに気づいた。これは便利。

Pythonは10年以上前にバイナリコンバートツールを作った時からちゃんと触ったことがなかったけど、当時より応用範囲が増えてて、速度を問わないことをやるならC++より便利な環境になってる。使い方を覚えておいて損はなさそう。

Windows Anaconda Python 3.5 への OpenCV 3.1 のインストール

スタートメニューから Anaconda3 → Anaconda Prompt を起動し、

conda install -c https://conda.binstar.org/menpo opencv3

と入力。 Anaconda のパッケージマネージャ conda を使ってインストールする。途中で“Proceed?”とか聞かれたので y を入力しエンターキーを押す。

しばらく待つと OpenCV 3.1.0 がインストールされた。

PythonOpenCV入門


顔認識して枠を表示

import numpy as np
import cv2

def readFile(filename):
    image = cv2.imread(filename)
    gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)  # RGB画像をグレースケールに変換
   
    # 分類器を作る
    cascade_path = "test/haarcascade_frontalface_alt.xml"
    cascade = cv2.CascadeClassifier(cascade_path)
    color = (255,255,255)
    # 顔認識
    facerect = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1))
    # 認識した顔に枠を表示
    if len(facerect) > 0:
        for rect in facerect:
            cv2.rectangle(image, tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]), color, thickness=2)
    else:
        print("no face")        
        
    cv2.imshow('original',image)
    cv2.imshow("Show",gray)

    cv2.waitKey()
    
readFile("test/Lenna.png")

f:id:Nao_u:20170211121829p:image

簡単にできてとても素敵。

OpenCVで密なオプティカルフローを計算する

オプティカルフロー(Optical Flow)


f:id:Nao_u:20170212000317p:image

いろいろ弄ってたらなんとなくそれっぽいものが出るようになってきた。OpenCVの画像の扱いやパラメータの調整がよくわからないのでまだ試行錯誤が必要そう。

とりあえず、まともに使えるものができてるのか、Unityに出して試してみる予定。

Unityで直接OpenCVが使えたら楽なんだけど、そっちはそっちで別方向にハードルが高そう。とりえずしばらくはPythonで。