CvHaarClassifierCascadeを使っているのですが、cvRectangleで顔を矩形で囲むことができています。
このときの矩形の面積を求めたいのですが、cvPointで用いているのを利用し、
faceRect->width * faceRect*height
で面積を計算しようとしたのですが値が0になってしまいます。
面積を求めるにはどのようにすればいいでしょうか。
また、検出情報を受け取るためのシーケンスを用意を
CvSeq* face;
としているのですが、このfaceには何が入っているのでしょうか。出力すると数字が表示されるので、顔の大きさの判断に使えるのではと考えています。
顔認識についてはこれと同じプログラムを使っています。
#include "cv.h"
#include "highgui.h"
// 顔検出(動画)
int main(int argc, char* argv[]) {
// ビデオキャプチャ構造体
CvCapture *capture = 0;
// フレーム単位データ
IplImage *frame = 0;
// 縦横サイズ
double height = 240;
double width = 320;
// 入力キー受け付け用
int c;
// 正面顔検出器の読み込み
CvHaarClassifierCascade* cvHCC = (CvHaarClassifierCascade*)cvLoad("haarcascade_frontalface_default.xml");
// 検出に必要なメモリストレージを用意する
CvMemStorage* cvMStr = cvCreateMemStorage(0);
// 検出情報を受け取るためのシーケンスを用意する
CvSeq* face;
// 0番号のカメラに対するキャプチャ構造体を生成するる
capture = cvCreateCameraCapture (0);
// キャプチャのサイズを設定する。ただし、この設定はキャプチャを行うカメラに依存するので注意る
cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH, width);
cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, height);
cvNamedWindow ("capture_face_detect", CV_WINDOW_AUTOSIZE);
// 停止キーが押されるまでカメラキャプチャを続ける
while (1) {
frame = cvQueryFrame (capture);
// 画像中から検出対象の情報を取得する
face = cvHaarDetectObjects(frame, cvHCC, cvMStr);
for (int i = 0; i < face->total; i++) {
// 検出情報から顔の位置情報を取得
CvRect* faceRect = (CvRect*)cvGetSeqElem(face, i);
// 取得した顔の位置情報に基づき、矩形描画を行う
cvRectangle(frame,
cvPoint(faceRect->x, faceRect->y),
cvPoint(faceRect->x + faceRect->width, faceRect->y + faceRect->height),
CV_RGB(255, 0 ,0),
3, CV_AA);
}
// 顔位置に矩形描画を施した画像を表示
cvShowImage ("capture_face_detect", frame);
// 終了キー入力待ち(タイムアウト付き)
c = cvWaitKey (10);
if (c == 'e') {
break;
}
}
// 生成したメモリストレージを解放
cvReleaseMemStorage(&cvMStr);
// キャプチャの解放
cvReleaseCapture (&capture);
// ウィンドウの破棄
cvDestroyWindow("capture_face_detect");
// カスケード識別器の解放
cvReleaseHaarClassifierCascade(&cvHCC);
return 0;
}