11.3.3 허프 변환 메뉴 만들기
ImageTool 프로그램에 허프 변환을 이용한 직선 검출을 수행하는 메뉴 항목과 메뉴 이벤트 처리 함수를 추가해보자. Visual Studio 리소스 뷰에서 IDR_ImageToolTYPE 메뉴 항목을 더블 클릭하여 메뉴 편집 창이 나타나게 한 후, [필터] 팝업 메뉴 맨 아래에 [허프 변환 직선 검출] 메뉴 항목을 추가하자. [허프 변환 직선 검출] 메뉴 항목의 속성은 표 11-8을 참고하라.
ID |
Caption |
ID_HOUGH_LINE |
허프 변환 직선 검출(&H) |
메뉴 항목을 추가하였으면, 이제 이 메뉴에 대한 메뉴 이벤트 처리 함수를 추가하자. [허프 변환 직선 검출] 메뉴 항목에 대한 이벤트 처리기 마법사에 입력할 정보는 표 11-9를 참고하라. 새로 추가된 OnHoughLine 함수에 입력할 소스 코드는 소스 11-10에 나타내었다.
명령 이름(ID) |
처리 클래스 |
메시지 형식 |
처리기 이름 |
ID_HOUGH_LINE |
CImageToolDoc |
COMMAND |
OnHoughLine |
#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);; }