Cfile10.uf .1932334D4D2A95F62876AA

RGB 컬러 공간 분리 – 메뉴 기반 구현2

이번에는 지난 시간에 해 봤던 “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 클래스 마법사를 실행한 후 그림과 같은 철자를 수행합니다.

Cfile10.uf .1932334D4D2A95F62876AA

 

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에서는 제거합니다.

Cfile7.uf .12363A4F4D2A95F7115279

 

Reference
황선규/영상처리프로그래밍byC++/한빛미디어/2009/222p~227p

cfile25.uf.114484374D2A96AB18F7AF.pdfcfile25.uf.15467E374D2A96AC132546.ziphttp://mfc-opencv.googlecode.com/svn/trunk/ -> r2

Similar Posts

  • 모든 창 닫기 구현

    이번 시간에는 열려있는 모든 창을 닫는 기능을 구현해 보도록 하겠습니다. 먼저 리소스 뷰를 보기 좋게 꺼내어 두는게 좋겠죠? [보기] → [다른 창] → [리소스 뷰]를 클릭합니다.   이번엔 메뉴 바에 해당 기능을 추가할 예정입니다. 리소스 뷰에서 [Menu] → [IDR_*TYPE]을 선택한 후 그림과 같이 지정합니다. Caption : 모든 창 닫기 ID : ID_FILE_CLOSE_ALL Prompt : 열려진…

  • 정지영상 캡춰기능 구현

    이번 내용도 후딱 넘어가겠습니다. 이전 시간까지 Cam에서 영상을 받아와 Dialog로 뿌려주는 부분을 했었죠? 이번 시간에는 이 동영상의 스틸 컷(Still Cut)을 만들 수 있게 정지영상으로 캡춰하는 기능을 구현해 보도록 하겠습니다. 참고로 동영상으로 저장하고 싶다면 cvReleaseVideoWriter, cvWriteFrame, cvReleaseVideoWriter를 적절하게(?) 쓰시면 됩니다.   정지영상 캡춰기능은 정말 간단합니다. 버튼 하나 만들구요, 그 버튼을 누르면… 전에 만들었던 전역 함수 기억하시죠?…

  • HVR-2000 Series 이용하기

    이번 시간에는 조금 더 재미있는 것을 해 보겠습니다. 바로 요놈입니다.   바로 HyVision System의 HVR-2000 Series입니다. 일반적인 웹캠이야 그냥 연결만 해주면 바로 써먹을 수 있었는데, 요놈은 조금 다릅니다.   USB드라이버야 당연히 깔아줘야 하는거고… 별도의 SDK를 이용해서 Cam에 접근하게 됩니다.   하이비전시스템에서 HVR SDK Interface Guide를 친절하게 작성해 주셔서 별 무리 없이 실습을 진행 해 볼…

  • 공간 영역 필터링 – Dialog Box 기반 구현

    이번 시간에는 Dialog Box기반으로 OpenCV를 이용하는 방법에 대해서 알아보겠습니다.   공간 필터링(Spatial Filtering)이란 영상에 있는 공간 주파수 대역을 제거하거나 강조하는 필터 처리입니다. 사용되는 필터의 계수에 따라 특정 주파수를 제거하거나 강조하게 되며, 필터 마스크(Filter Mask)또는 회선 마스크의 가중치 선택이 공간 필터의 행동을 결정하게 됩니다. 영상처리에 사용되는 회선 마스크는 홀수 차원의 정방형 마스크가 사용되게 됩니다.   필터는…

  • MFC – Cam 영상 출력해보기

    이번 시간에는 MFC프로젝트에서 Cam 영상을 받아오는 부분을 구현해 보겠습니다.   “동영상 처리” → “영상 보기”메뉴를 추가하고, 해당 메뉴를 클릭했을 때, 영상을 뿌려주는 Dialog를 띄웁니다. Dialog에서 “시작” 버튼을 클릭했을 경우 Caption이 “중지”로 바뀌고, Static 영역에 영상을 뿌려주게 만들어 보겠습니다.   먼저 사용할 다이얼로그부터 만들어야겠죠? [리소스 뷰]에서 [리소스 추가]를 선택합니다.   [Dialog]가 선택된 것을 확인하고 [새로 만들기]를…

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다