最終更新:
mikk_ni3_92 2008年10月22日(水) 17:01:26履歴
現在地 >> メニュー >> サンプルコード::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); }