Cfile23.uf .123F4B5A4D28B08E122350

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

이번에는 본격적으로 OpenCV를 사용하여 영상처리를 해 보겠습니다. 그 첫 단계로 메뉴기반 정지영상 처리를 해 볼 것이며, cvSplit함수를 사용하여 RGB 컬러공간을 분리하는 예제를 구현해 보겠습니다.

 

먼저 OpenCV 2.1 C API Reference에서 cvSplit함수를 찾아보면 다음과 같습니다.

Cfile23.uf .123F4B5A4D28B08E122350

cvSplit함수는 다중 채널(Multi-channel)배열을 여러 개의 단일 채널(Single-channel) 배열로 분할하거나, 배열에서 단일 채널을 추출 할 수 있음을 알 수 있습니다.

또한, 입력이 IplImage인 경우에는 cvCopy함수를 사용해서도 같은 결과를 얻을 수 있음을 알 수 있습니다.

 

이미 “영상처리 프로그래밍 by Visual C++”에서 해 본 것처럼 별도의 Class를 만들고 이를 호출하는 방식으로 예제를 구현해 보겠습니다.

 

먼저 해당 기능을 구현할 Class를 만듭니다. 저는 CDeiosColor라고 하겠습니다.

MFC를 공부할 때 헝가리언 표기법(Hungarian notation)을 알아둔다면 많은 도움이 됩니다. MS가 .Net에서 헝가리언 표기법을 포기했다고는 하지만 많은 이름들이 헝가리언 표기법을 근사적으로 따릅니다. 헝가리언 표기법을 반드시 따를 필요는 없지만 대략적으로 봐 둔다면 MFC프로그래밍 뿐만 아니라 각종 라이브러리 사용 시에 많은 도움이 됩니다. 자신만의 코딩 스타일을 만들어서 일관적으로 사용한다면 과거에 만들었던 코드를 분석하거나 디버깅 할 때에 많은 도움을 받게 될 것입니다.

참고로 Class 이름(DeiosColor) 앞의 C는 Class임을 알려주는 MS의 코딩 스타일입니다.

클래스 뷰에서 마우스 오른쪽 버튼을 클릭하고, [추가] → [클래스]를 선택하여 클래스 추가 마법사를 실행합니다.

Cfile26.uf .1758F74E4D28B08E0D5A80

 

[C++ 클래스]를 선택하여 일반 Class를 만든 후 클래스 이름을 지정해 주고 [마침]을 클릭합니다.

Cfile24.uf .162D77494D28B08F15FAF9

 

다음으로 멤버 함수를 추가하겠습니다. 멤버 함수는 DSplitRGB이며 함수 원형은 다음과 같습니다.

void DSplitRGB(IplImage *color_image, IplImage **red, IplImage **green, IplImage **blue)

헤더 파일(DeiosColor.h)에 cv.h를 include 한 후, 소스 파일(DeiosColor.cpp)에 다음과 같이 코딩합니다.

void CDeiosColor::DSplitRGB(IplImage * color_image, IplImage ** red, IplImage ** green, IplImage ** blue)

{

        *red = cvCreateImage(cvGetSize(color_image), IPL_DEPTH_8U,1);

        *green = cvCreateImage(cvGetSize(color_image), IPL_DEPTH_8U,1);

        *blue = cvCreateImage(cvGetSize(color_image), IPL_DEPTH_8U,1);

 

        cvSplit(color_image, *red, *green, *blue, NULL);

}

이번에는 새로운 메뉴를 등록해 보겠습니다. MFC 리소스 뷰의 메뉴 항목을 보면 다음과 같은 4개의 리소스가 보입니다.

Cfile10.uf .13594C4E4D28B08F0D62E7

 

이 중 IDR_MAINFRAME은 문서가 하나도 생성되지 않은 시점의 메뉴를, IDR_MFC_OpenCVTYPE은 한 개 이상의 문서가 생성된 시점의 메뉴를, IDR_POPUP_EDIT은 팝업 메뉴를 의미합니다. 우리는 한 개의 문서(사진)을 필요로 하기 때문에 IDR_MFC_OpenCVTYPE리소스를 편집해야 합니다.

다음과 같은 모양으로 메뉴를 편집하고 다음과 같은 속성을 줍니다.

Cfile2.uf .166F5A4D4D28B08F105B98

Cfile4.uf .1376D54C4D28B09011A757

이번에는 Split RGB메뉴를 클릭했을 때 발생할 이벤트를 처리하는 이벤트 처리기를 등록해 보겠습니다.

[Ctrl + Shift + X]키를 누르면 [Class Wizard]가 열립니다.

Cfile25.uf .196F7C4D4D28B090108BEF

 

“DeiosColor.h”파일을 include한 후 다음과 같이 코딩합니다.

void CMFC_OpenCVView::OnColorSplitRgb()

{

        // TODO: 여기에 명령 처리기 코드를 추가합니다.

        CMFC_OpenCVDoc* pDoc = GetDocument();  

        ASSERT_VALID(pDoc);  

 

        IplImage *color_image = pDoc->m_CvvImage.GetImage();  

 

        if( color_image->nChannels != 3 ){  

            AfxMessageBox( TEXT("컬러 영상이 아닙니다."), MB_ICONSTOP );  

            return;  

        }

 

        IplImage *red, *green, *blue;  

           

        CDeiosColor cColor;  

        cColor.DSplitRGB( color_image, &red, &green, &blue );  

 

        pDoc->CopyClipBoard( red );

        ((CMFC_OpenCVApp *)AfxGetApp())->OnEditPaste();

        CMFC_OpenCVDoc *pDoc1 = (CMFC_OpenCVDoc *)((CMDIFrameWnd*)AfxGetMainWnd())->GetActiveFrame()->GetActiveDocument();  

        pDoc1->SetTitle(TEXT("[SplitRGB()] 변환 결과 - 빨강 채널"));  

 

        pDoc->CopyClipBoard( green );  

        ((CMFC_OpenCVApp *)AfxGetApp())->OnEditPaste();

        CMFC_OpenCVDoc *pDoc2 = (CMFC_OpenCVDoc *)((CMDIFrameWnd*)AfxGetMainWnd())->GetActiveFrame()->GetActiveDocument();  

        pDoc2->SetTitle(TEXT("[SplitRGB()] 변환 결과 - 녹색 채널"));  

 

        pDoc->CopyClipBoard( blue );  

        ((CMFC_OpenCVApp *)AfxGetApp())->OnEditPaste();

        CMFC_OpenCVDoc *pDoc3 = (CMFC_OpenCVDoc *)((CMDIFrameWnd*)AfxGetMainWnd())->GetActiveFrame()->GetActiveDocument();  

        pDoc3->SetTitle(TEXT("[SplitRGB()] 변환 결과 - 파랑 채널"));  

 

        cvReleaseImage( &red );  

        cvReleaseImage( &green );  

        cvReleaseImage( &blue );  

 

        Invalidate( FALSE );  

}

마지막으로 MFC_OpenCV.h에서 OnEditPaste를 public으로 바꿔줍니다.

Cfile9.uf .116EC14D4D28B0911BC278

 

Cfile25.uf .19405A574D28B09119CFCE

Reference
정성환외 1명/컴퓨터 비전 실무 프로그래밍/홍릉과학출판사/2007/274p~287p
최호성/Visual C++ 2008 MFC 윈도우 프로그래밍/프리렉/2009/669p~674p
OpenCV 2.1.0 The Reference Manual/127p

 

cfile10.uf.123821514D28B1571795C9.pdfcfile7.uf.184156574D28B1ED16BFD9.zip

Similar Posts

  • |

    고속 네트워크 프로토콜의 목적과 수행과정

    고속 네트워크 프로토콜중leaky bucket, flowspec, RSVP, policing, admission control 등의 유기적인 관계를 정확히 쓰시오(수행 과정, 목적 등) 과 모임을 위하여 술집을 예약하는 과정을 빗대어서 설명.Application은 Network에게 질적인 정보나 양적인 정보를 준다. 질적인 정보는 쉽게 명세가 가능하지만 양적인 정보는 쉽게 명세가 불가능하다. Application이 Network에게 주는 이러한 정보를 flowspec이라고 한다. flowspec은 흐름의 트래픽 특성(양적인 정보)을 묘사하는 부분과…

  • |

    TCP 폭주(혼잡)제어

    TCP의 폭주제어에서 예약방식을 못 쓰고 피드백 기반 방식을 사용하여야 하는 이유를 설명하시오. 예약 방식의 경우 데이터 전송 중 경로상의 라우터에서 폭주 혹은 에러가 발생했을 경우 송신자는 계속 데이터를 보내게 되어 혼잡이 가중된다. 이를 해결하기 위해 피드백 방식을 사용한다.송신자는 약간의 데이터만 전송하여 도착 여부를 확인 후 점점 전송량을 늘려간다. 이처럼 네트워크의 상태에 따라 송신측에서 전송량을 조절하여야 한다….

  • 프로젝트 설정 파일 적용하기

    이전 시간까지는 처음에 만들었던 “MFC_OpenCV”라는 프로젝트를 기준으로 진행하였습니다. 하지만, 이제부터는 새 프로젝트를 만들어서 진행하는 경우가 많이 생길텐데요… 이 때마다 프로젝트 설정을 바꿔줘야 하는게 여간 귀찮은게 아닙니다… 그. 래. 서. 이번 시간에는 이러한 설정을 파일로 저장하고, 가져오는 방법에 대해서 알아보겠습니다. 일단 첨부한 OpenCV210.props 파일을 적당한 디렉토리에 다운로드 하시구요… 먼저 이 파일을 어떻게 불러오는지부터 알아보겠습니다. 먼저 VS2010실행하셔서…

  • Visual Studio 2010에서 OpenCV 라이브러리 빌드하기

    저번에 해봤던 “Visual Studio 2010에서 OpenCV 이용하기(http://deios.kr/395)”에서는 디버그 모드로 이용이 불가능한 문제가 있었습니다. 그래서 이 번에는 직접 OpenCV 2.1 라이브러리를 빌드해 보도록 하겠습니다.   먼저 CMake를 다운받습니다. CMake는 크로스 플렛폼 Make네요. http://www.cmake.org/cmake/resources/software.html 설치는 별 다른게 없습니다. 그냥 다음 연타로 CMake를 설치해 줍니다.   다음으로 OpenCV 2.1 Windows Version을 다운받고, 적당한 곳에 압축을 풀어 줍니다. http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.1/OpenCV-2.1.0-win.zip/download…

  • HVR-2000 Series 이용하기

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

One Comment

답글 남기기

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