私は、OpenCV-2.1.0(cvHaarDetectObjects)のHaarアルゴリズムを使用して、iOS4.2のObjective-Cプロジェクト内から写真やビデオフレームの顔を検出することに成功しています。ただし、ほとんどの条件下でiPhone 4のビデオフレームの処理時間は約1〜2秒かかります。私が使用しているコードの例を以下に示します。
NSString *path = [[NSBundle mainBundle] pathForResource:@"haarcascade_frontalface_alt" ofType:@"xml"];
CvHaarClassifierCascade* cascade =
(CvHaarClassifierCascade*)cvLoad([path cStringUsingEncoding:NSASCIIStringEncoding],
NULL, NULL, NULL);
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* faces = cvHaarDetectObjects(small_image, cascade, storage, 1.2, 0,
0 |CV_HAAR_DO_ROUGH_SEARCH |CV_HAAR_FIND_BIGGEST_OBJECT, cvSize(30, 30));
ROIのスマートな適用や、浮動小数点数ではなく整数の使用など、複数の最適化手法を試しました。しかし、これらの変更には膨大な時間がかかり、わずかなメリットしかありませんでした。
LBPを利用すると、顔検出時間を大幅に短縮できることが示唆されました。私はLBPを実装する方法を実験して探してきましたが、役に立ちませんでした。opencvにはカスケードファイル(lbpcascade_frontalface.xml)がありますが、それを使用する方法についての提案は見つかりません。
他の最適化手法や検索で見逃した可能性のあるGoogleリンクなど、助けていただければ幸いです。検出の精度は、それが合理的に効果的である限り、重要ではありません。
ありがとう!