現在地 >> メニュー >> サンプルコード::OpenCV >> OpenCV::基本編10
INDEXOpenCV::基本編09 << OpenCV::基本編10 >> OpenCV::基本編11


ヒストグラム構造体


OpenCVのヒストグラム構造体は、以下の通り


struct CvHistogram
{
	int  type;
	CvArr*  bins;  //ここにデータが格納される
	float   thresh[CV_MAX_DIM][2];
	float** thresh2;
	CvMatND mat;
};


使い方


ヒストグラムは、以下の手順で使う。
  1. ヒストグラムを作成
  2. ヒストグラムを計算
  3. 描画

[1].ヒストグラムの作成


ヒストグラムの作成はcvCreateHist()関数で行う。

[例]:1次元ヒストグラムの作成

//ヒストグラム作成と計算
int hist_size = 256;  //0〜255までの合計256個
float range_data[] = { 0, 256 }; // 0 ≦ value < 256
float **range[] = { range_data };

CvHistogram *hist;
hist = cvCreateHist (1, &hist_size, CV_HIST_ARRAY, range, 1);


注意点は、画素値の範囲。
 0 ≦ 画素値 < 256
が範囲となる。

[2].ヒストグラムの計算


計算はcvCalcHist()関数で行う。

[例]

IplImage *imgA;
... ...
CvHistogram *hist;
... ...
cvCalcHist (&imgA, hist, 0, NULL);


[3].描画する


計算されたヒストグラムの各データは、
「ヒストグラム構造体」の中の「CvArr *bins」に格納されている。

描画には、そのデータを取り出して、Iplimageに書き込む。

<データへのアクセス方法>


ヒストグラムのデータへのアクセス方法には、様々ある。

以下では「cvQueryHistValue_*D()関数」を使う。

<描画に必要なもの>


ヒストグラムを描画するには

  • 表示用IplImageの大きさ→ 最大値がはみ出さないようにウィンドウを合わせる
  • 棒グラフの描画

を考える必要がある。


■表示用IplImageの大きさ

ヒストグラムを描画するためにIplImageを用意する。
注意点は、「横幅はヒストグラムのbinの数」より多くする点。

[例]

//ヒストグラム出力用画像作成
int hist_width = 256;//ビンの数と同じにした
IplImage *hist_img;
hist_img=cvCreateImage (cvSize (hist_width, 300), IPL_DEPTH_8U, 1);
cvSet (hist_img, cvScalarAll (255), 0); //画像をまっ白にする

//ウィンドウに入るようにスケール変換
float max_value = 0;
cvGetMinMaxHistValue (hist, 0, &max_value, 0, 0); //ヒストグラムの最大値取得
cvScale (hist->bins, hist->bins, ((double) hist_img->height) / max_value, 0); 



■棒グラフの描画

棒グラフの横幅を決定して、cvRectangle()関数で描画していく。
また、ピクセルの座標は「int型」なので「cvRound()関数」で四捨五入する。

[例]

int bin_width;
bin_width = cvRound ((double) hist_width / hist_size);  //計算結果を四捨五入
for (int j = 0; j < hist_size; ++j)
{
	cvRectangle(
		hist_img, 
		cvPoint(j * bin_width , hist_img->height),              //左下
		cvPoint ( (j + 1) * bin_width ,hist_img->height - cvRound (cvQueryHistValue_1D (hist, j))),//右上
		cvScalarAll (0),
		CV_FILLED, 8, 0
		);
}


サンプルコード >> OpenCV::基本編10まとめ
×

この広告は60日間更新がないwikiに表示されております。

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます