개발/Computer Vision

[OpenCV] 영상에서의 히스토그램 구하기

hojak99 2016. 10. 21. 17:13


실시간 영상에서의 히스토그램을 측정하고 그래프로 나타내는 소스 코드입니다.


히스토그램 그래프에서 y축은 픽셀의 빈도수를, x축은 픽셀값들을 나타냅니다.



#include <iostream>

#include <opencv2\opencv.hpp>


int main()

{

cv::Mat frame, tmpImg;

cv::Mat hist;


cv::VideoCapture video(0);


cv::namedWindow("image", CV_WINDOW_AUTOSIZE);

cv::namedWindow("histogramImg", CV_WINDOW_AUTOSIZE);

const int ch[] = { 0 };

const int size = 256;

float ch_range[] = { 0,255 };

const float * range = { ch_range };


double minVal = 0; //최소 빈도수

double maxVal = 0; //최대 빈도수


int hpt = static_cast<int> (0.9*size); //nbins의 90%를 최대점으로 설정




while (true)

{

video >> tmpImg;

cv::Mat histogramImg(size, size, CV_8UC3, cv::Scalar(0, 0, 0));



cv::cvtColor(tmpImg, frame, CV_BGR2GRAY);

cv::imshow("image", frame);


cv::calcHist(&frame, 1, ch, cv::Mat(), hist, 1, &size, &range);

cv::minMaxLoc(hist, &minVal, &maxVal, 0, 0);



for (int i = 0; i < size; i++) {

float binVal = hist.at<float>(i);

int intensity = static_cast<int> (binVal*hpt / maxVal);


cv::line(histogramImg, cv::Point(i, size), cv::Point(i, size - intensity), cv::Scalar(0, 255, 255));

}

cv::imshow("histogramImg", histogramImg);

histogramImg.release();


if (cv::waitKey(27) == 27) {

break;

}

}


video.release();

tmpImg.release();

frame.release();

hist.release();


cv::destroyAllWindows();


return 0;

}


반응형