더북(TheBook)
소스 11-13 [해리스 코너 검출] 메뉴 이벤트 처리 함수(ImageToolDoc.cpp)
#include "HarrisCornerDlg.h"


void CImageToolDoc::OnHarrisCorner()
{
    CHarrisCornerDlg dlg;
    if (dlg.DoModal() == IDOK)
    {
        CONVERT_DIB_TO_BYTEIMAGE(m_Dib, img)
            std::vector<IppPoint> corners;
        IppHarrisCorner(img, corners, dlg.m_nHarrisTh);

        BYTE** ptr = img.GetPixels2D();

        int x, y;
        for (IppPoint cp : corners)
        {
            x = cp.x;
            y = cp.y;

            ptr[y - 1][x - 1] = ptr[y - 1][x] = ptr[y - 1][x + 1] = 0;
            ptr[y][x - 1] = ptr[y][x] = ptr[y][x + 1] = 0;
            ptr[y + 1][x - 1] = ptr[y + 1][x] = ptr[y + 1][x + 1] = 0;
        }

        CONVERT_IMAGE_TO_DIB(img, dib)

        AfxPrintInfo(_T("[해리스 코너 검출] 입력 영상: %s, Threshold: %d, 검출된 코너 갯수: %d"),
                GetTitle(), dlg.m_nHarrisTh, corners.size());
        AfxNewBitmap(dib);
    }
}

OnHarrisCorner 함수에서는 먼저 해리스 코너 검출 대화 상자를 띄워서 코너 응답 함수의 임계값을 입력 받는다. 그리고 IppHarrisCorner 함수를 호출하여 코너 포인트들의 정보를 std::vector<IppPoint> 타입의 변수 corners로 넘겨받는다. 그리고 검출된 코너 포인트 위치에 3×3 크기의 검정색 점을 표시하도록 하였다.

그림 11-26은 다양한 영상에 대하여 [해리스 코너 검출] 메뉴를 실행한 결과이다. 화면에 나타난 차일드 윈도우의 영상은 왼쪽부터 abcdef.bmp, house.bmp, pentagon.bmp 파일에서 코너 포인트를 찾을 결과이다. 세 개의 영상 모두 해리스 코너 응답 함수에 대한 임계값은 20000을 사용하였다.

그림 11-26 ImageTool 프로그램에서 해리스 코너 검출 결과
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.