顔認識での面積の求め方

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
抹茶
記事: 15
登録日時: 5年前

顔認識での面積の求め方

#1

投稿記事 by 抹茶 » 5年前

今opencvで顔認識をしています。
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;
}

アバター
usao
記事: 1598
登録日時: 7年前

Re: 顔認識での面積の求め方

#2

投稿記事 by usao » 5年前

>faceRect->width * faceRect*height
>で面積を計算しようとしたのですが値が0になってしまいます。

なぜ その計算しようとした状態のコード ではなく
その部分を抜いた(?)コードを提示するのでしょうか.この状態では読み手側としては,


>faceRect->width * faceRect*height

・これを一体どこに書いたのかわからないし
・値が0になったというのをどうやって確認しているのかもわからないし
・かなり謎な計算式になってるのは投稿時のタイプミスであって,実際のコードは違うんだよね? とか不確実な想像しかできない

結果として,
『矩形がまともに描画されているのであれば
 矩形の位置とサイズの情報が得られているということでしょうから,
 矩形の面積の求め方は自明ではないでしょうか.』
…とかしか言えないと思うのですが.

アバター
へにっくす
記事: 630
登録日時: 8年前
住所: 東京都

Re: 顔認識での面積の求め方

#3

投稿記事 by へにっくす » 5年前

抹茶 さんが書きました:faceRect->width * faceRect*height
書き方間違ってるようにしか見えません。
faceRect->width * faceRect->height
じゃないの?
written by へにっくす

抹茶
記事: 15
登録日時: 5年前

Re: 顔認識での面積の求め方

#4

投稿記事 by 抹茶 » 5年前

お二方、回答ありがとうございました。
先輩にも見てもらったところ、つまらないミスをしていたのが原因だったみたいです。
質問に不備があったようで申し訳ないです

閉鎖

“C言語何でも質問掲示板” へ戻る