Opencv顔認識--cvHaarDetectObjects関数
Opencv顔認識--cvHaarDetectObjects関数
転載は出典を明記してください.http://blog.csdn.net/itismelzp/article/details/50378468
一、Haar特徴分類器の紹介
Haarフィーチャー分類器は、人体の各部位のHaarフィーチャー値を記述するXMLファイルです.人の顔、目、唇などが含まれています.
Haarフィーチャー分類器格納ディレクトリ:OpenCVインストールディレクトリのdatahaarcascadesディレクトリの下、opencv 2.4.8バージョンのHaar特徴分類器は以下の通りである.
ネーミングによって各分類器の用途がすぐにわかります.
そのうち:haarcascade_frontalface_alt.xmlとhaarcascade_frontalface_alt2.xmlは顔認識のHaar特徴分類器です.
二、cvHaarDetectObjects関数の詳細
cvHaarDetectObjects関数で対応する顔特徴検出分類器を指定すると、画像内のすべての顔を検出し、検出した顔を矩形で返すことができます.この関数について説明します.cvHaarDetectObjectsのプロトタイプは次のとおりです.
合計8つのパラメータ、関数の説明:
パラメータ1:入力画像を表し、できるだけ階調図を使用して検出速度を速める.
パラメータ2:Haarフィーチャー分類器を表し、cvLoad()関数を使用してディスクからxmlファイルをHaarフィーチャー分類器としてロードできます.
パラメータ3:検出された候補ターゲットを格納するメモリキャッシュ領域.
パラメータ4:前後2回の連続スキャンにおいて、サーチウィンドウのスケール係数を示す.デフォルトは1.1です.つまり、検索ウィンドウごとに10%ずつ拡大します.
パラメータ5:検出対象を構成する隣接矩形の最小個数(デフォルトは3個)を示します.検出対象を構成する小さな矩形の個数がmin_未満である場合neighbors-1は除外されます.もしmin_Neighborsが0の場合、関数は何もしないですべての被検候補矩形ボックスを返し、この設定値は一般的にユーザが検出結果の組合せプログラムをカスタマイズするために使用される.
パラメータ6:既定値を使用するか、CV_を使用します.HAAR_DO_CANNY_PRUNING、CV_に設定した場合HAAR_DO_CANNY_PRUNINGでは、関数はCannyエッジ検出を使用してエッジが多すぎたり少なすぎたりする領域を排除します.そのため、これらの領域は通常、顔のある領域ではありません.
パラメータ7:検出ウィンドウの最小値を表し、一般的にはデフォルトに設定すればよい.
パラメータ8:検出ウィンドウの最大値を表し、一般的にはデフォルトに設定すればよい.関数の戻り値:関数は、検出された顔の長方形を表す一連のCvRectを含むCvSeqオブジェクトを返します.
三、顔認識例
まず処理前の2枚の図を見てみましょう
ビューティ
緑の矢侠の主役たち.
顔認識サンプルコード:
効果図は以下の通りです.
人体の他の部位を識別するには、上のhaarcascadeをfrontalface_alt2.xml分類器を置き換えればいいです.
ソースのダウンロード:http://download.csdn.net/detail/itismelzp/9385242
転載は出典を明記してください.http://blog.csdn.net/itismelzp/article/details/50378468
一、Haar特徴分類器の紹介
Haarフィーチャー分類器は、人体の各部位のHaarフィーチャー値を記述するXMLファイルです.人の顔、目、唇などが含まれています.
Haarフィーチャー分類器格納ディレクトリ:OpenCVインストールディレクトリのdatahaarcascadesディレクトリの下、opencv 2.4.8バージョンのHaar特徴分類器は以下の通りである.
haarcascade_eye.xml
haarcascade_eye_tree_eyeglasses.xml
haarcascade_frontalface_alt.xml
haarcascade_frontalface_alt_tree.xml
haarcascade_frontalface_alt2.xml
haarcascade_frontalface_default.xml
haarcascade_fullbody.xml
haarcascade_lefteye_2splits.xml
haarcascade_lowerbody.xml
haarcascade_mcs_eyepair_big.xml
haarcascade_mcs_eyepair_small.xml
haarcascade_mcs_leftear.xml
haarcascade_mcs_lefteye.xml
haarcascade_mcs_mouth.xml
haarcascade_mcs_nose.xml
haarcascade_mcs_rightear.xml
haarcascade_mcs_righteye.xml
haarcascade_mcs_upperbody.xml
haarcascade_profileface.xml
haarcascade_righteye_2splits.xml
haarcascade_smile.xml
haarcascade_upperbody.xml
ネーミングによって各分類器の用途がすぐにわかります.
そのうち:haarcascade_frontalface_alt.xmlとhaarcascade_frontalface_alt2.xmlは顔認識のHaar特徴分類器です.
二、cvHaarDetectObjects関数の詳細
cvHaarDetectObjects関数で対応する顔特徴検出分類器を指定すると、画像内のすべての顔を検出し、検出した顔を矩形で返すことができます.この関数について説明します.cvHaarDetectObjectsのプロトタイプは次のとおりです.
CVAPI(CvSeq*) cvHaarDetectObjects(
const CvArr* image,
CvHaarClassifierCascade* cascade,
CvMemStorage* storage,
double scale_factor CV_DEFAULT(1.1),
int min_neighbors CV_DEFAULT(3),
int flags CV_DEFAULT(0),
CvSize min_size CV_DEFAULT(cvSize(0,0)),
CvSize max_size CV_DEFAULT(cvSize(0,0))
);
合計8つのパラメータ、関数の説明:
パラメータ1:入力画像を表し、できるだけ階調図を使用して検出速度を速める.
パラメータ2:Haarフィーチャー分類器を表し、cvLoad()関数を使用してディスクからxmlファイルをHaarフィーチャー分類器としてロードできます.
パラメータ3:検出された候補ターゲットを格納するメモリキャッシュ領域.
パラメータ4:前後2回の連続スキャンにおいて、サーチウィンドウのスケール係数を示す.デフォルトは1.1です.つまり、検索ウィンドウごとに10%ずつ拡大します.
パラメータ5:検出対象を構成する隣接矩形の最小個数(デフォルトは3個)を示します.検出対象を構成する小さな矩形の個数がmin_未満である場合neighbors-1は除外されます.もしmin_Neighborsが0の場合、関数は何もしないですべての被検候補矩形ボックスを返し、この設定値は一般的にユーザが検出結果の組合せプログラムをカスタマイズするために使用される.
パラメータ6:既定値を使用するか、CV_を使用します.HAAR_DO_CANNY_PRUNING、CV_に設定した場合HAAR_DO_CANNY_PRUNINGでは、関数はCannyエッジ検出を使用してエッジが多すぎたり少なすぎたりする領域を排除します.そのため、これらの領域は通常、顔のある領域ではありません.
パラメータ7:検出ウィンドウの最小値を表し、一般的にはデフォルトに設定すればよい.
パラメータ8:検出ウィンドウの最大値を表し、一般的にはデフォルトに設定すればよい.
三、顔認識例
まず処理前の2枚の図を見てみましょう
ビューティ
緑の矢侠の主役たち.
顔認識サンプルコード:
#include <opencv2/opencv.hpp>
#include <cstdio>
#include <cstdlib>
using namespace std;
int main()
{
// 【1】
// Haar
// haarcascade_frontalface_alt2.xml ,
const char *pstrCascadeFileName = "haarcascade_frontalface_alt2.xml";
CvHaarClassifierCascade *pHaarCascade = NULL;
pHaarCascade = (CvHaarClassifierCascade*)cvLoad(pstrCascadeFileName);
if(!pHaarCascade) {printf("
");return -1;}
// 【2】
const char *pstrImageName = " .jpg";
IplImage *pSrcImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_UNCHANGED);
IplImage *pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);
cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY); // ,
//
CvScalar FaceCirclecolors[] =
{
{{0, 0, 255}},
{{0, 128, 255}},
{{0, 255, 255}},
{{0, 255, 0}},
{{255, 128, 0}},
{{255, 255, 0}},
{{255, 0, 0}},
{{255, 0, 255}}
};
//
CvMemStorage *pcvMStorage = cvCreateMemStorage(0);
cvClearMemStorage(pcvMStorage);
// 【3】
CvSeq *pcvSeqFaces = cvHaarDetectObjects(pGrayImage, pHaarCascade, pcvMStorage);
printf(" : %d
", pcvSeqFaces->total);
// 【4】
for(int i = 0; i <pcvSeqFaces->total; i++)
{
CvRect* r = (CvRect*)cvGetSeqElem(pcvSeqFaces, i);
CvPoint center;
int radius;
center.x = cvRound((r->x + r->width * 0.5));
center.y = cvRound((r->y + r->height * 0.5));
radius = cvRound((r->width + r->height) * 0.25);
cvCircle(pSrcImage, center, radius, FaceCirclecolors[i % 8], 2);
}
cvReleaseMemStorage(&pcvMStorage); //
// 【5】
const char *pstrWindowsTitle = "【 】";
cvShowImage(pstrWindowsTitle, pSrcImage);
cvWaitKey(0);
return 0;
}
効果図は以下の通りです.
人体の他の部位を識別するには、上のhaarcascadeをfrontalface_alt2.xml分類器を置き換えればいいです.
ソースのダウンロード:http://download.csdn.net/detail/itismelzp/9385242