2015년 9월 26일 토요일

OpenCV - 같은 그림 찾기 - compareHist

matchTemplate을 사용하면 같은 그림을 찾을 수 있다. 하지만 단점이 있는데 모양이 비슷한 것은 비슷한 결과를 돌려 준다. 즉, 정확도가 떨어진다.

그림을 찾는 또 다른 방법으로 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

double compareHist(InputArray H1, InputArray H2, int method)

히스토그램 H1과 H2를 비교해서 결과를 돌려 준다.


http://docs.opencv.org/doc/tutorials/imgproc/histograms/histogram_comparison/histogram_comparison.html

OpenCV - 같은 그림 찾기 - matchTemplate

아래 그림처럼 개들이 잔뜩 있는 곳에서 강아지 한마리를 찾아 내려면 어떻게 해야 할까.

 방법은 강아지 그림을 움직여 가면서 비교해 보면 된다.

왼쪽에서 오른쪽으로 그리고 위에서 아래쪽으로 한 픽셀씩 움직이면서 각 픽셀의 빼기나 곱하기 계산을 한다. 그 결과를 배열로 저장해서 보면 아래 그림처럼 가장 값이 큰(밝은) 부분이 가장 가능성이 높은 부분임을 알 수 있다.





matchTemplate

void matchTemplate(InputArray image, InputArray templ, OutputArray result, int method)

image안에서 x, y로 한칸씩 이동하면서 templ을 겹쳐 놓고 각 셀의 차이나 곱의 합을 계산해서 result배열을 만들어서 돌려 준다. 이때 image의 크기는 templ의 크기보다 커야 하고 계산 방식은 method로 정해진다.

CV_TM_SQDIFF ... 각 픽셀의 차이의 합
CV_TM_SQDIFF_NORMED ... CV_TM_SQDIFF / sqrt(각 픽셀의 제곱의 곱)
CV_TM_CCORR ... 각 픽셀의 곱의 합
CV_TM_CCORR_NORMED ... CV_TM_CCORR / sqrt(각 픽셀의 제곱의 곱)
CV_TM_CCOEFF
CV_TM_CCOEFF_NORMED ... CV_TM_CCOEFF / sqrt(각 픽셀의 제곱의 곱)


normalize

void normalize(InputArray src, OutputArray dst, double alpha=1, double beta=0, int norm_type=NORM_L2, intdtype=-1, InputArray mask=noArray() )

normType=NORM_MINMAX일때 src를 alpha(최소값)과 beta(최대값) 사이의 값으로 환산한다.


minMaxLoc

void minMaxLoc(InputArray src, double* minVal, double* maxVal=0, Point* minLoc=0, Point* maxLoc=0, InputArraymask=noArray())

src배열에서 최소와 최대값을 찾은 후 그 값과 위치를 돌려 준다.


http://stackoverflow.com/questions/11541154/checking-images-for-similarity-with-opencv
http://docs.opencv.org/doc/tutorials/imgproc/histograms/template_matching/template_matching.html

2015년 9월 22일 화요일

MS Windows 인증 확인 방법

Software Licensing Management Tool

인증기간 : slmgr /xpr
인증갱신 : slmgr /ato
인증상태 : slmgr /dli

Wndows 7 OEM

Windows 7 Enterprise


Windows 8.1 Enterprise

2015년 9월 18일 금요일

엑셀 - 교차하는 두 직선의 교차점 구하기

두개의 직선이 교차하는 지점은 어디일까.

직선1 : y1 = m1x1 + c1 (m1: 기울기, c1: 절편)
직선2 : y2 = m2x2 + c2 (m2: 기울기, c2: 절편)

두직선이 만나는 교차점을 x, y라고 하면, y = m1x + c1 이고 y = m2x + c2가 된다.
이를 합치면 m1x + c1 = m2x + c2가 되고
여기에서 x를 왼쪽으로 빼면 x =  (c2-c1) / (m1-m2) 
다시 처음식에 x를 대입하면 y = m1x + c1


함수

SLOPE(y축데이터, x축데이터) : 기울기를 구한다.
INTERCEPT(y축데이터, x축데이터) : 절편을 구한다.



http://www.listendata.com/2012/10/excel-intersection-of-two-linear.html