OpenCV 2.3.1でカスケードを作って、Androidで使ってみる
OpenCV 覚書
WindowsでOpenCV 2.3.1を使う準備
LBPカスケードのサンプル(アニメ顔検出)とPythonコード
LBPカスケードを作ってみる
TOP
用意するもの
●OpenCV 2.3.1
OpenCV-2.3.1-win-superpack.exe(Windows版)
●intel TBB(並列処理用)
tbb40_20120408oss_win.zip
●Python
Windows x86 MSI Installer (2.7.3)
●numpy(Python用数学ライブラリ)
numpy-1.6.2-win32-superpack-python2.7.exe (5.7 MB)
●CMake(Visual Studio用のプロジェクト作成)
cmake-2.8.8-win32-x86.exe(Windows用Binary Distribution)
●Visual C++ 2010
無ければ、無償のExpress Editionでも可
Expressの場合、起動時に登録キーを要求してきます。キー取得にはWindows LiveのIDとパスが必要なので、まだの方は事前に取得しておきましょう。
Visual C++ 2010 Express Edition
Express Editionが有料版と異なるのは、リモートデバッグ・バージョン管理・マクロ・アドイン・Mobile用アプリ開発機能などはない、ということです。
今回のように、プロジェクトファイルをビルドする分には問題ありません。
では実際に動くのか試してみます。
カスケードは
この方
がお作りになったものを使ってみます。
lbpcascade_animeface.xmlです。
検出用の顔のサンプルはこれ。
で、結果はこんな感じ(Python、PC + Webカメラ)。
PythonのコードはSamplesのものを修正して使ってみました。
【anime_facedetect.py】
import numpy as np import cv2 import cv2.cv as cv from video import create_capture from common import clock, draw_str help_message = ''' USAGE: facedetect.py [--cascade <cascade_fn>] [--nested-cascade <cascade_fn>] [<video_source>] ''' def detect(img, cascade): rects = cascade.detectMultiScale(img, scaleFactor=1.3, minNeighbors=4, minSize=(30, 30), flags = cv.CV_HAAR_SCALE_IMAGE) if len(rects) == 0: return [] rects[:,2:] += rects[:,:2] return rects def draw_rects(img, rects, color): for x1, y1, x2, y2 in rects: cv2.rectangle(img, (x1, y1), (x2, y2), color, 2) if __name__ == '__main__': import sys, getopt print help_message args, video_src = getopt.getopt(sys.argv[1:], '', ['cascade=']) try: video_src = video_src[0] except: video_src = 'synth:bg=../cpp/anime_face.jpg:noise=0.05' args = dict(args) cascade_fn = args.get('--cascade', "../../data/lbpcascades/lbpcascade_animeface.xml") cascade = cv2.CascadeClassifier(cascade_fn) cam = create_capture(video_src) while True: ret, img = cam.read() gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) gray = cv2.equalizeHist(gray) t = clock() rects = detect(gray, cascade) vis = img.copy() draw_rects(vis, rects, (0, 255, 0)) for x1, y1, x2, y2 in rects: roi = gray[y1:y2, x1:x2] vis_roi = vis[y1:y2, x1:x2] dt = clock() - t draw_str(vis, (20, 20), 'time: %.1f ms' % (dt*1000)) cv2.imshow('facedetect', vis) if cv2.waitKey(5) == 27: break
まず、参照するドキュメントはここ。
Cascade Classifier Training
HarrとLBPの両方について書かれています。内容としては......
●トレーニングデータの準備として、opencv_createsamples.exeの使い方。
vecファイルの作成。
●ポジティブ画像とネガティブ画像の配置の仕方や、データについて記述したファイルの作り方。
●カスケード・トレーニング用コマンドの記述方法。
(LBPカスケードを作るコマンド)opencv_traincascade.exeの引数のセットの仕方など。
コマンド発行用のコンソールアプリは、このページの例だと、
C:\OpenCV231\rebuild\bin\Release
にあります。