---
title: "RGB 컬러 공간 분리 – 메뉴 기반 구현2"
id: "711"
type: "post"
slug: "408"
published_at: "2011-01-10T05:18:57+00:00"
modified_at: "2025-12-12T04:28:41+00:00"
url: "https://dworld.deios.kr/408/"
markdown_url: "https://dworld.deios.kr/408.md"
excerpt: "이번에는 지난 시간에 해 봤던 “RGB 컬러 공간 분리 – 메뉴 기반 구현(http://deios.kr/407)”의 새 창으로 여는 부분을 조금 더 일반화 하고, MFC에 적합하게 만들어 보겠습니다. 먼저 새 창으로 이미지를 여는 전역 함수를 작성해 보겠습니다. App Class의 헤더 파일을 열어 가장..."
taxonomy_category:
  - "Study"
taxonomy_post_tag:
  - "MFC"
  - "OpenCV 2.1"
  - "vs 2010"
---

이번에는 지난 시간에 해 봤던 “[RGB 컬러 공간 분리 – 메뉴 기반 구현(http://deios.kr/407)](https://dworld.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.zip***http***://mfc-opencv.googlecode.com/svn/trunk/ -> r2

### 관련된 글:

1. [Visual Studio 2010에서 OpenCV 이용하기](https://dworld.deios.kr/395/)
2. [OpenCV 파일 저장기능 구현2](https://dworld.deios.kr/402/)
3. [Drag and Drop 지원하기](https://dworld.deios.kr/404/)
4. [모든 창 닫기 구현](https://dworld.deios.kr/405/)

## Similar Posts

- [https://dworld.deios.kr/430/](https://dworld.deios.kr/430/) 예전에 한번 했던거지만… ARToolkit 리빌드 기념으로 모토글램에 올려봤다… 뭐 역시… 일본인의 집념에 찬사를… 관련된 글: 고속 네트워크에서의 메모리 병목 현상 TCP 폭주(혼잡)제어 Drag and Drop 지원하기 Face Detect
- [https://dworld.deios.kr/402/](https://dworld.deios.kr/402/) “OpenCV 파일 저장기능 구현(http://deios.kr/401)”에 파일 저장기능과 파일 열기기능을 강화해 보도록 하겠습니다. 먼저 “새 이름으로 저장”시 자동으로 확장자를 추가하기 위해서 OnFileSaveAs함수를 수정하겠습니다. 수정 전 CFileDialog dlgFile(TRUE); CString fileName; const int c_cMaxFiles = 100; const int c_cbBuffSize = (c_cMaxFiles * (MAX_PATH + 1)) + 1; dlgFile.GetOFN().lpstrFile = fileName.GetBuffer(c_cbBuffSize); dlgFile.GetOFN().nMaxFile = c_cbBuffSize; int chk = dlgFile.DoModal(); fileName.ReleaseBuffer();…
- 고속 네트워크 프로토콜중leaky bucket, flowspec, RSVP, policing, admission control 등의 유기적인 관계를 정확히 쓰시오(수행 과정, 목적 등) 과 모임을 위하여 술집을 예약하는 과정을 빗대어서 설명.Application은 Network에게 질적인 정보나 양적인 정보를 준다. 질적인 정보는 쉽게 명세가 가능하지만 양적인 정보는 쉽게 명세가 불가능하다. Application이 Network에게 주는 이러한 정보를 flowspec이라고 한다. flowspec은 흐름의 트래픽 특성(양적인 정보)을 묘사하는 부분과…
- [https://dworld.deios.kr/406/](https://dworld.deios.kr/406/) 이번에는 자주 사용하는 기능인 C&P(Copy & Paste)를 구현해 보도록 하겠습니다. C&P를 구현하기 위해서는 이미지를 DIB(장치 독립 비트맵;Device Independent Bitmap)으로 변환하여 클립보드 영역에 넘겨주거나, 클립보드 영역에서 데이터를 받아오면 됩니다. 클립보드 영역으로 데이터를 넘겨주기 위하여 CopyClipBoard맴버함수, CopyToHandle 맴버 함수를 추가하여, ID_EDIT_COPY이벤트 핸들러에 등록합니다. 먼저 CopyClipBoard 맴버 함수를 Doc Class에 작성하겠습니다. 반환 형식 : void 함수 이름…
- TCP의 폭주제어에서 예약방식을 못 쓰고 피드백 기반 방식을 사용하여야 하는 이유를 설명하시오. 예약 방식의 경우 데이터 전송 중 경로상의 라우터에서 폭주 혹은 에러가 발생했을 경우 송신자는 계속 데이터를 보내게 되어 혼잡이 가중된다. 이를 해결하기 위해 피드백 방식을 사용한다.송신자는 약간의 데이터만 전송하여 도착 여부를 확인 후 점점 전송량을 늘려간다. 이처럼 네트워크의 상태에 따라 송신측에서 전송량을 조절하여야 한다….
- [https://dworld.deios.kr/425/](https://dworld.deios.kr/425/) 관련된 글: 2계층과 4계층의 오류제어, 흐름제어 모든 창 닫기 구현 클립보드 기능 구현 프로젝트 설정 파일 적용하기

### 답글 남기기 [응답 취소](/408/?t=1792040488#respond)
