動作環境
Windows 7 Home 64bit
OpenCV 3.1.0
Visual Studio 2013
はじめに
これまでなぜかCascadeDetectorに存在していたHOG検出器は削除され、使用不可となった。
(ソースは整理されていなく、いくつ残骸が残っている。Type指定でHOGをはねている。またdataフォルダーには、hogcascade_pedestrianの辞書が残ったままである。)
変わりに、OpenCV 3.1でようやくHOGの説明が設けられた。
使い方
ファイルの読み込み、GRAYへの変換、領域の表示は省略
cv::HOGDescriptor hog;
hog.setSVMDetector(hog.getDefaultPeopleDetector());
std::vector< cv::Rect > locations;
hog.detectMultiScale(gray, locations);
以上で検出できる。また、detectMultiScaleのパラメータがいくつか省略されており、きちんと書くと
hog.detectMultiScale(gray, locations, 0, cv::Size(), cv::Size(), 1.05, 2, false);
となる。
DefaultPeopleDetectorの辞書は、INRIAのデータで作成されたもので、2.4のころからなぜかソースに辞書データがハードコーディングされている。画像のサイズは、64x128と大きめである。
冒頭の画像は、デフォルト辞書でアニメの人を検出した結果である。アニメだから検出精度がいまひとつではなく、人でも検出精度はかわらない。
小さい辞書
また、代わりの辞書としてDaimlerPeopleDetectorも提供されており、こちらの画像のおおきさは、48x96で、使用方法は以下の用である。
hog.winSize = cv::Size(48, 96);
hog.setSVMDetector(hog.getDaimlerPeopleDetector()));
Daimler辞書での検出結果、デフォルトに比べで検出枠が増えているが誤検出が多い。
オリジナル辞書作成
さらに、3.1からは、辞書の作成方法もサポートされるようになり、
opencv31\sources\samples\cpp\train_HOG.cpp
を使用すれば自分で辞書を作成することができる。
注意
リリースモードでは、なぜか落ちるのでdebugで使用している。ubuntuで確認してみる