그림을 찾는 또 다른 방법으로 compareHist가 있다. compareHist는 히스토그램이 얼마나 같은지 비교해 준다. 즉, 색상분포가 얼마나 비슷한지를 알 수 있다. 하지만 색상분포만 같은 것으로 같은 그림이라고 할 수 없기 때문에 matchTemplate가 함께 사용하면 99%이상 동일한 그림을 찾을 수 있다.
히스토그램은 명도에 상관없이 계산되는 것이 바람직하다. 따라서 HSV로 변환한 뒤 Hue(색조)와 Saturation(채도)에 대해서만 계산하도록 한다.
cvtColor
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 )
src를 code로 지정된 형식으로 변환해서 dst로 돌려 준다. HSV로 변환할 때 CV_BGR2HSV를 지정한다.
calcHist
void calcHist(const Mat* images, int nimages, const int* channels, InputArray mask, OutputArray hist, int dims, const int* histSize, const float** ranges, bool uniform=true, bool accumulate=false )
images로 지정된 이미지에서 히스토그램을 계산해서 hist로 돌려준다. HSV이미지 한개를 지정할때 nimages는 1, channels는 {0, 1}, mask는 사용하지 않도록 Mat()를 지정한다.
dims : 히스토그램 갯수, HS를 지정한 경우 2
histSize : 각 히스토그램의 크기를 배열로 지정한다. HS을 각각 60으로 지정하는 경우 {60, 60}
ranges : 히스토그램 범위, H는 {0,180}, S는 {0,256}
uniform : true
accumulate : false
compareHist
http://docs.opencv.org/doc/tutorials/imgproc/histograms/histogram_comparison/histogram_comparison.html