오늘 할거는 히스토그램 그리는건데여, 히스토그램..만만치 않습니다... 갑자기 이렇게 어려운거로 건너뛰기를 한 이유는... 그냥!!
히스토그램은 관찰 데이터의 빈도수를 막대그래프로 표시한것으로 확률 밀도정도를 표시할수잇다. 그냥 얼마나 그러한색상이 모여잇고 복잡한가 정도를 나타내는 것이에요! 그렇다면...!!
항상그래왔듯이 소스 보시죠!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | #include "opencv.hpp" using namespace std; using namespace cv; void histogram(int histSize, float valueRange[], const float*ranges[], int channels, int dims) { Mat srcImage = imread("lena.jpg", IMREAD_GRAYSCALE); if (srcImage.empty()) return; Mat hist; calcHist(&srcImage, 1, &channels, Mat(), hist, 1, &histSize, ranges); Mat histImage(512, 512, CV_8U); normalize(hist, hist, 0, histImage.rows, NORM_MINMAX, CV_32F); histImage = Scalar(255); int binW = cvRound((double)histImage.cols / histSize); int x1, y1, x2, y2; for (int i = 0; i < histSize; i++) { x1 = i*binW; y1 = histImage.rows; x2 = (i + 1)*binW; y2 = histImage.rows - cvRound(hist.at<float>(i)); rectangle(histImage, Point(x1, y1), Point(x2, y2), Scalar(0), -1); } imshow("histImage", histImage); } int main() { int histSize[10] = {128,256,512}; float valueRange[] = { 0, 256 }; const float * ranges[] = { valueRange }; int channels = 0; int dims = 1; for (int i = 0; i < 3; i++) { histogram(histSize[i], valueRange, ranges, channels, dims); waitKey(); } return 0; } | cs |
보시면 처음보는게 많습니다. calcHist라든가 normalize라든가 cvRound... histImage.cols...
그래도 다알려줄게!
calcHist 이함수는 영상의 히스토그램값을 계산하는 함수라는데... 그냥 히스토그램 그리기위한 준비단계 제일처음!
별로 설명해줄게 없음...
normalize함수는 hist를 NORM_MINMAX로 범위가 [0,histimage,rows]가 되도록해서 히스토그램 최소값은 0, 최대값은 histimage.row로 해놓는 함수임. NORM_MINMAX 이건 상수에요! opencv에서 정해놓은 속성을 그냥 가져다 쓰는거임.
cvRound 는 정수형으로 변환할때 반올림을 하기위해서 쓰는거임. 반올림 무시해버리면 안되는거죠~ 쉬운개념이죠!
이건 걔산된 히스토그램을 막대로 보이게 하기위해서 설정하는것임.
이렇게하면 히스토그램이 그냥나와버리네요. 제가 히스토그램 그리는걸 함수로 따로 해놓은 이유는 히스토그램 막대기 갯수를 다르게 해보고싶어서엿어용.
히스토그램 사용하는곳은 물체비교! 손인식에도 쓸수 잇죠! 등등 예시는 많이는 모르겟어요...ㅋㅋ;; 메마른 지식.
음 일단이걸로 히스토그램은 마치구.. 나중에 히스토그램 나올때 설명 더 자세히 하도록하구 다음포스트에서 봅시다@@
'OpenCV' 카테고리의 다른 글
| DataType 클래스 (0) | 2016.05.07 |
|---|---|
| opencv의 기본 클래스!! (0) | 2016.05.06 |
| opencv 원그리기 (0) | 2016.03.20 |
| opencv 선,사각형 그리기 (0) | 2016.03.20 |
| OPENCV 시작!! (0) | 2016.03.20 |