반응형

OpenCV에서는 cornerHarris( ) 함수를 통해 쉽게 코너를 검출할 수 있도록 지원하고 있다.

 

하지만 상황에 따라 해당 함수를 사용하여 적용하기보단 나의 상황에 맞도록 코너검출의 과정을 수정하고 싶을 때가 있다. 이를 위해 opencv의 cornerHarris( ) 함수를 사용하지 않고 직접 구현하여 코너를 검출하는 과정에 대해 설명한다.

 

이를 위해 우선 어떻게 코너를 검출하는지 과정부터 살펴볼 필요가 있다.

 

기본적으로 2차원의 GrayScale 이미지는 아래와 같은 형태를 갖고 있다.

위의 그림에서 하나의 네모칸을 '픽셀'이라고 표현하며 GrayScale의 이미지는 0~255의 정수로 표현되는 픽셀값을 갖고 있다.

그럼 여기서 코너를 어떻게 정의할 수 있을까?

 

위의 그림에서 (a)는 그냥 아무런 특징이 나타나지 않는 면에 해당된다.

(b)의 경우 '엣지'라고 불리는 부분이며 말 그대로 모서리에 대한 부분을 나타내고 있다. 이러한 경우 x축의 방향으로는 픽셀값의 차이가 뚜렷하게 나타나지만(영상이 밝은곳에서 어두운곳으로 진행하다가 다시 밝은 부분이 나오게 된다.) y축 방향으로는 영상의 픽셀에 대한 변화가 나타나지 않게 된다. 다시 말해 분홍색 윈도우가 x축으로 이동하게 되면 변화가 발생하지만 y축으로 이동하면 변화가 발생하지 않는다. 이러한 부분을 엣지라고 정의한다.

(c)의 그림이 코너에 해당하는 부분으로 분홍색 윈도우를 x축, y축으로 이동시켜보면 어느 방향으로 이동시켜도 윈도우 내 영상에서 변화가 감지되게 된다.  이를 코너의 특징으로 볼 수 있다.

 

그럼 영상에서 코너를 왜 취득하는걸까? 코너가 갖는 의미는 무엇일까?

 

좌측의 그림과 같은 바다의 풍경이 담긴 사진이 있다고 보자.

우리는 A윈도우의 정보를 갖고 A가 원본 이미지의 어떤 위치를 나타내는지 알 수 있는가?

하늘은 모두 A와 유사하기에 "A가 정확히 여기이다!" 라고 말하기 어렵다.

 

B역시 바다의 수평선에 대한 정보(엣지)만 존재하므로 이 부분이 정확히 바다의 어떤 위치를 나타내는지는 알기 어렵다.

 

 

하지만 C는 어떤가. C의 위치는 원본 이미지에서 정확이 어떠한 부분인지를 나타낼 수 있는 정보를 보여주고 있다. 그리고 이는 '코너'정보를 갖고 있다. 이렇게 코너는 영상의 특징이 될 수 있는 정보를 담고있으므로 Feature Point(특징 점)으로 표현한다.

 

이를 수식으로 표현하면 다음과 같이 나타낼 수 있다.

내용을 보면 영상의 변화율 E는 영상 내 윈도우 w의 (x, y)에 대하여 이미지 I를 x축, y축으로 이동시켰을 때 나타나는 변화율의 크기를 통해 표현하고 있다.

위의 값이 크다면 영상의 x, y에 대한 차이가 크다는 것이고 이는 코너임을 나타낼 수 있다.

 

그럼 이 식을 조금 변형하여 보자.

 

 

반응형

+ Recent posts