더북(TheBook)

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);;
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.