11.3.3 허프 변환 메뉴 만들기

    ImageTool 프로그램에 허프 변환을 이용한 직선 검출을 수행하는 메뉴 항목과 메뉴 이벤트 처리 함수를 추가해보자. Visual Studio 리소스 뷰에서 IDR_ImageToolTYPE 메뉴 항목을 더블 클릭하여 메뉴 편집 창이 나타나게 한 후, [필터] 팝업 메뉴 맨 아래에 [허프 변환 직선 검출] 메뉴 항목을 추가하자. [허프 변환 직선 검출] 메뉴 항목의 속성은 표 11-8을 참고하라.

    표 11-8 [허프 변환 직선 검출] 메뉴 항목 속성

    ID

    Caption

    ID_HOUGH_LINE

    허프 변환 직선 검출(&H)

    메뉴 항목을 추가하였으면, 이제 이 메뉴에 대한 메뉴 이벤트 처리 함수를 추가하자. [허프 변환 직선 검출] 메뉴 항목에 대한 이벤트 처리기 마법사에 입력할 정보는 표 11-9를 참고하라. 새로 추가된 OnHoughLine 함수에 입력할 소스 코드는 소스 11-10에 나타내었다.

    표 11-9 [허프 변환 직선 검출] 메뉴 이벤트 처리기 정보

    명령 이름(ID)

    처리 클래스

    메시지 형식

    처리기 이름

    ID_HOUGH_LINE

    CImageToolDoc

    COMMAND

    OnHoughLine

    소스 11-10 [허프 변환 직선 검출] 메뉴 이벤트 처리 함수(ImageToolDoc.cpp)
    #include <algorithm>
    #include <functional>
    
    void CImageToolDoc::OnHoughLine()
    {
        CONVERT_DIB_TO_BYTEIMAGE(m_Dib, img)
        IppByteImage imgEdge;
        IppEdgeCanny(img, imgEdge, 1.4f, 30.f, 60.f);
    
        std::vector<IppLineParam> lines;
        IppHoughLine(imgEdge, lines);
    
        if (lines.size() == 0)
        {
            AfxMessageBox(_T("검출된 직선이 없습니다."));
            return;
        }
    
        std::sort(lines.begin(), lines.end());
    
        // 최대 10개의 직선만 화면에 그려줌.
        int cnt = _ _min(10, lines.size());
        for (int i = 0; i < cnt; i++)
            IppDrawLine(img, lines[i], 255);
    
        CONVERT_IMAGE_TO_DIB(img, dib)
    
        AfxPrintInfo(_T("[허프 선 검출] 입력 영상: %s, 중요 직선: rho = %4.2f, angle = %4.2f,
            vote = %d"),
            GetTitle(), lines[0].rho, (lines[0].ang * 180 / 3.14f), lines[0].vote);
        AfxNewBitmap(dib);;
    }
    
    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.