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 영상에 빨간색 원으로 코너를 표시합니다.