現在地 >> メニュー >> サンプルコード::OpenCV >> OpenCV::基本編10 >> OpenCV::基本編10まとめ

問題


画像を読み込んでヒストグラムを計算、描画せよ。

答え


#include <iostream>
#include <cv.h>
#include <highgui.h>

//--------------- プロトタイプ宣言 --------------------//
IplImage *GetHistImg(IplImage *imgA);


//---------------- メイン関数 --------------------//
int main( int argc, char **argv)
{

	IplImage *imgA = cvLoadImage( "test2.jpg", CV_LOAD_IMAGE_GRAYSCALE);
	if(imgA ==NULL){
		std::cerr <<"Can't Load Image .\n";
		return -1;
	}

	IplImage *HistImg;
	HistImg = GetHistImg(imgA);


	cvNamedWindow("Original",CV_WINDOW_AUTOSIZE);
	cvShowImage("Original",imgA);


	cvNamedWindow ("Histogram", CV_WINDOW_AUTOSIZE);
	cvShowImage ("Histogram", HistImg);


	cvWaitKey(0); // 0秒待つ => ずっと入力待ち


	cvReleaseImage( &HistImg );
	cvReleaseImage( &imgA );

	cvDestroyWindow("Histogram");
	cvDestroyWindow("Original");

	return 0;
}



IplImage *GetHistImg(IplImage *imgA)
{

	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);


	//ヒストグラム出力用画像作成
	int HistWidth = 256; 
	IplImage *HistImg;
	HistImg = cvCreateImage (cvSize (HistWidth, 256), IPL_DEPTH_8U, 1);
	cvSet (HistImg, cvScalarAll (255), 0);


	//ヒストグラムの計算
	cvCalcHist (&imgA, hist, 0, NULL);

	//スケール変換
	float max_value = 0;
	cvGetMinMaxHistValue (hist, 0, &max_value, 0, 0);
	cvScale (hist->bins, hist->bins, static_cast<double>(HistImg->height) / max_value, 0);


	//棒グラフの横幅決定
	int bin_width;
	bin_width = cvRound (static_cast<double>(HistWidth) / hist_size);



	//ヒストグラム描画
	for (int j = 0; j < hist_size; ++j)
	{
		cvRectangle(
			HistImg, 
			cvPoint(j * bin_width , HistImg->height),
			cvPoint ( (j + 1) * bin_width ,HistImg->height - cvRound (cvQueryHistValue_1D (hist, j))),
			cvScalarAll (0),
			CV_FILLED, 8, 0
		);
	}

	cvReleaseHist(&hist); //メモリリリース

	return (HistImg);

}

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






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


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

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