더북(TheBook)

cornerHarris() 함수를 이용하여 코너 점을 검출하는 예제 코드를 코드 14-1에 나타냈습니다. 코드 14-1의 corner_harris() 함수는 building.jpg 빌딩 영상에서 코너 점을 찾아 빨간색 원으로 표시합니다. corner_harris() 함수가 정의된 소스 파일과 사용된 영상 파일은 내려받은 예제 파일 중 ch14/corners 프로젝트에서 확인할 수 있습니다.

코드 14-1 해리스 코너 검출 예제 [ch14/corners]

01    void corner_harris()
02    {
03        Mat src = imread("building.jpg", IMREAD_GRAYSCALE);
04     
05        if (src.empty()) {
06            cerr << "Image load failed!" << endl;
07            return;
08        }
09     
10        Mat harris;
11        cornerHarris(src, harris, 3, 3, 0.04);
12     
13        Mat harris_norm;
14        normalize(harris, harris_norm, 0, 255, NORM_MINMAX, CV_8U);
15     
16        Mat dst;
17        cvtColor(src, dst, COLOR_GRAY2BGR);
18     
19        for (int j = 1; j < harris.rows - 1; j++) {
20            for (int i = 1; i < harris.cols - 1; i++) {
21                if (harris_norm.at<uchar>(j, i) > 120) {
22                    if (harris.at<float>(j, i) > harris.at<float>(j - 1, i) &&
23                        harris.at<float>(j, i) > harris.at<float>(j + 1, i) &&
24                        harris.at<float>(j, i) > harris.at<float>(j, i - 1) &&
25                        harris.at<float>(j, i) > harris.at<float>(j, i + 1) ) {
26                        circle(dst, Point(i, j), 5, Scalar(0, 0, 255), 2);
27                    }
28                }
29            }
30        }
31     
32        imshow("src", src);
33        imshow("harris_norm", harris_norm);
34        imshow("dst", dst);
35     
36        waitKey(0);
37        destroyAllWindows();
38    }

 

3행 building.jpg 영상을 그레이스케일 형식으로 불러와 src에 저장합니다.

10~11행 src 영상으로부터 해리스 코너 응답 함수 행렬 harris를 구합니다.

13~14행 harris 행렬 원소 값 범위를 0부터 255로 정규화하고, 타입을 CV_8UC1로 변환하여 harris_norm에 저장합니다. harris_norm은 그레이스케일 영상 형식을 따르며, 해리스 코너 응답 함수 분포를 영상 형태로 화면에 표시하기 위해 만들었습니다.

16~17행 src 영상을 3채널 컬러 영상으로 변환하여 dst에 저장합니다.

21행 harris_norm 영상에서 값이 120보다 큰 픽셀을 코너로 간주합니다.

22~27행 간단한 비최대 억제를 수행합니다. (i, j) 위치에서 주변 네 개의 픽셀을 비교하여 지역 최대인 경우에만 dst 영상에 빨간색 원으로 코너를 표시합니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.