이번에는 지난 시간에 해 봤던 “RGB 컬러 공간 분리 – 메뉴 기반 구현(http://deios.kr/407)”의 새 창으로 여는 부분을 조금 더 일반화 하고, MFC에 적합하게 만들어 보겠습니다.
먼저 새 창으로 이미지를 여는 전역 함수를 작성해 보겠습니다. App Class의 헤더 파일을 열어 가장 마지막에 다음과 같이 추가해 줍니다.
void OpenByNewDocument(LPTSTR szTitle, IplImage * image);
이 전역 함수는 문서의 제목과 이미지를 받아 새 창으로 열어주는 함수입니다.
App Class를 열어 가장 마지막에 다음과 같이 코딩합니다.
void OpenByNewDocument(LPTSTR szTitle, IplImage * image) { // 새 창에서 열 이미지의 크기를 계산합니다. CSize sizeTotal = CSize(image->width, image->height); // 새 도큐먼트를 생성하는 코드입니다. POSITION pos = ((CMFC_OpenCVApp *)AfxGetApp())->GetFirstDocTemplatePosition(); CDocTemplate *pTemplate = ((CMFC_OpenCVApp *)AfxGetApp())->GetNextDocTemplate(pos); CMFC_OpenCVDoc *pDoc = (CMFC_OpenCVDoc* )pTemplate->OpenDocumentFile(NULL); pos = pDoc->GetFirstViewPosition(); CMFC_OpenCVView *pView = (CMFC_OpenCVView *)pDoc->GetNextView(pos); pView->SetScrollSizes(MM_TEXT, sizeTotal); pView->ResizeParentToFit(FALSE); // 두 번째 인자로 받아온 이미지를 새로 만들어진 문서에 적용합니다. pDoc->m_CvvImage.CopyOf(image,-1); if(NULL != szTitle){ pDoc->SetTitle(szTitle); } }
이젠 View Class에 설정되어 있던 ID_COLOR_SPLIT_RGB 이벤트 처리기를 Doc Class로 옮기겠습니다.
이를 위해 먼저 View Class의 이벤트 처리기를 제거하겠습니다.
[Ctrl + Shift + X]를 눌러 MFC 클래스 마법사를 실행한 후 그림과 같은 철자를 수행합니다.
View Class에 이벤트 처리기를 등록했던 절차와 동일하게 Doc Class에 이벤트 처리기를 등록합니다.
그 후 만들어진 이벤트 처리기에서 다음과 같이 코딩합니다.
void CMFC_OpenCVDoc::OnColorSplitRgb() { // TODO: 여기에 명령 처리기 코드를 추가합니다. if( m_CvvImage.GetImage()->nChannels != 3 ){ AfxMessageBox( TEXT("컬러 영상이 아닙니다."), MB_ICONSTOP ); return; } IplImage *red, *green, *blue; CDeiosColor cColor; cColor.DSplitRGB( m_CvvImage.GetImage(), &red, &green, &blue ); OpenByNewDocument(TEXT("[SplitRGB()] 변환 결과 - 빨강 채널"), red); OpenByNewDocument(TEXT("[SplitRGB()] 변환 결과 - 초록 채널"), green); OpenByNewDocument(TEXT("[SplitRGB()] 변환 결과 - 파랑 채널"), blue); cvReleaseImage( &red ); cvReleaseImage( &green ); cvReleaseImage( &blue ); }
마지막으로 Doc Class의 상단에 DeiosColor.h 헤더파일을 include 하고, View Class에서는 제거합니다.
Reference
황선규/영상처리프로그래밍byC++/한빛미디어/2009/222p~227p
cfile25.uf.114484374D2A96AB18F7AF.pdfcfile25.uf.15467E374D2A96AC132546.ziphttp://mfc-opencv.googlecode.com/svn/trunk/ -> r2