실시간 영상에서의 히스토그램을 측정하고 그래프로 나타내는 소스 코드입니다.
히스토그램 그래프에서 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;
}