Cfile2.uf .2071424B4D332EB2026819

MFC – Cam 영상 출력해보기

이번 시간에는 MFC프로젝트에서 Cam 영상을 받아오는 부분을 구현해 보겠습니다.

 

“동영상 처리” → “영상 보기”메뉴를 추가하고, 해당 메뉴를 클릭했을 때, 영상을 뿌려주는 Dialog를 띄웁니다. Dialog에서 “시작” 버튼을 클릭했을 경우 Caption이 “중지”로 바뀌고, Static 영역에 영상을 뿌려주게 만들어 보겠습니다.

 

먼저 사용할 다이얼로그부터 만들어야겠죠?

[리소스 뷰]에서 [리소스 추가]를 선택합니다.

Cfile2.uf .2071424B4D332EB2026819

 

[Dialog]가 선택된 것을 확인하고 [새로 만들기]를 누릅니다.

ID : IDD_CamView

Cfile10.uf .1908EA4F4D332EB214E549

여기에 [Picture Control]을 추가하겠습니다. 방법은 “공간 영역 필터링 – Dialog Box 기반 구현(http://deios.kr/409#AddControl)”을 참고하세요.

 

ID는 “IDC_STATIC_VIEW”로 주고 다음과 같이 컨트롤을 적당하게 배열합니다.

Cfile7.uf .120BC44F4D332EB3110614

 

이제 “확인”버튼의 Caption을 “시작”으로, “취소”버튼의 Caption을 “닫기”로 변경합니다. Dialog의 Caption도 “Cam View”정도로 바꿔주는 것이 좋겠네요. 이 정도는 눈 감고도 하실 수 있겠죠?

 

UI의 구성은 대충 끝났고, 이제 이 Dialog에서 무슨 짓을 할지 생각해 봅시다~

 

먼저, [클래스 추가]를 이용해 이 Dialog에 대응하는 Class를 만들어 줘야겠죠? 그 후 초기화 부분인 “OnInitDialog()”에서 각종 초기화와 “cvCaptureFromCAM”함수를 호출해 줘야겠고, “시작”버튼에 대한 이벤트 처리기에서 화면에 Cam영상을 뿌려주는 코드를 작성해야겠네요… 그리고 “시작”버튼을 “중지”로 만들어 줘야겠죠? 이 작업을 처리하려면 “IDC_STATIC_VIEW”와 “IDOK”는 대응하는 멤버 변수를 만들어 줘야겠네요. “OnDestroy()”에서는 “cvReleaseCapture”함수를 호출해 줘야 깔끔하겠죠?

 

Cam영상을 뿌려주는 부분은 이미지를 연속적으로 받아서 출력해줘야 하니, Timer를 하나 등록해서 “OnTimer”이벤트 처리기에서 작업을 처리해 주는게 좋겠네요. 자… 그럼 작업은 다음과 같이 진행되겠습니다.

 

1. Dialog에 대응하는 Class 만들기

2. OnInitDialog()에서 초기화 및 cvCaptureFromCAM함수 호출

3. OnTimer()구현

4. OnOK()구현

5. 메뉴에 추가

 

자~ 그럼 시작해 볼까요?

1. Dialog에 대응하는 Class만들기

Class추가 방법이 기억나지 않으시는 분은 “공간 영역 필터링 – Dialog Box 기반 구현(http://deios.kr/409#DialogClass)”를 참고하세요~ [클래스 이름]은 “CViewDlg”로 할께요~

 

이제 다음과 같은 멤버 변수를 추가합니다.

CvvImage m_CvvImage;

CvCapture *capture;

IplImage *image;

bool viewState;

 

그리고 Control에 해당하는 멤버 변수도 만들어 줘야겠죠? 앞으로 Control에 해당하는 멤버 변수는 “Control 객체”라고 부르겠습니다. “IDC_STATIC_VIEW”와 “IDOK”에 해당하는 Control 객체를 만들어 줍니다. 역시 기억나지 않으시는 분은 “공간 영역 필터링 – Dialog Box 기반 구현(http://deios.kr/409#ControlObj)“를 참고해 주세요~

IDC_STATIC_VIEW : m_sView

IDOK : m_btnOk

 

2. OnInitDialog()에서 초기화 및 cvCaptureFromCAM함수 호출

OnInitDialog()를 재정의 합니다. 그 후 다음과 같은 코드를 작성합니다.

BOOL CViewDlg::OnInitDialog()

{       CDialogEx::OnInitDialog();

        // TODO:  여기에 추가 초기화 작업을 추가합니다.

        capture = cvCaptureFromCAM(0);

        image = 0;

        viewState = FALSE;

 

        return TRUE;  // return TRUE unless you set the focus to a control

        // 예외: OCX 속성 페이지는 FALSE를 반환해야 합니다.

}

3. OnTimer()구현

WM_Timer에 대한 이벤트 처리기를 추가하고 구현합니다. 코드는 다음과 같습니다.

void CViewDlg::OnTimer(UINT_PTR nIDEvent)

{       // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.

        if(1 == nIDEvent){

                cvGrabFrame( capture );

                image = cvQueryFrame( capture );

                m_CvvImage.CopyOf(image);

                CRect viewSize;

                m_sView.GetClientRect(&viewSize);

                m_CvvImage.DrawToHDC( m_sView.GetDC()->GetSafeHdc() ,viewSize);

        }

        CDialogEx::OnTimer(nIDEvent);

}

4. OnOK()구현

“viewState”가  “FALSE”일 때(영상을 뿌려주고 있지 않을 때)는 Caption을 “중지”로 바꾸고, 타이머를 동작시킵니다. 반대로 “TRUE”일 때(영상을 뿌려주고 있을 때)는 Caption을 “시작”으로 바꾸고, 타이머를 중지시킵니다. 코드는 다음과 같습니다.

void CViewDlg::OnOK()

{       // TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.

        if(viewState){

                KillTimer(1);

                viewState = FALSE;

                m_btnOK.SetWindowText(TEXT("시작"));

        }else{

                SetTimer(1,((double)1/12)*1000,NULL);

                viewState = TRUE;

                m_btnOK.SetWindowText(TEXT("중지"));

        }

}

5. 메뉴에 추가

“동영상 처리” → “영상 보기”메뉴를 추가합니다. 역시 잘 기억나지 않으시는 분은 “RGB 컬러 공간 분리 – 메뉴 기반 구현(http://deios.kr/407#AddMenu)“을 참고하세요~

“영상 보기”의 ID는 “ID_CAM_VIEW”로 하겠습니다. 아~ 물론 코드는 다음과 같겠죠?

여기서 중요한 점은 App Class에서 작성해야 한다는 것입니다.

void CMFC_OpenCVApp::OnCamView()

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

        CViewDlg dlg;

        dlg.DoModal();

}

Cfile9.uf .1560AD494D332EB3069036

 

짝짝짝~!

cfile26.uf.130BC44F4D332F8F1295A8.pdfcfile29.uf.2022E34F4D33346A07AE9E.zip
http://mfc-opencv.googlecode.com/svn/trunk/ -> r6

Similar Posts

  • |

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

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

  • HVR-2000 Series 이용하기

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

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

    이번에는 본격적으로 OpenCV를 사용하여 영상처리를 해 보겠습니다. 그 첫 단계로 메뉴기반 정지영상 처리를 해 볼 것이며, cvSplit함수를 사용하여 RGB 컬러공간을 분리하는 예제를 구현해 보겠습니다.   먼저 OpenCV 2.1 C API Reference에서 cvSplit함수를 찾아보면 다음과 같습니다. cvSplit함수는 다중 채널(Multi-channel)배열을 여러 개의 단일 채널(Single-channel) 배열로 분할하거나, 배열에서 단일 채널을 추출 할 수 있음을 알 수 있습니다. 또한,…

  • Drag and Drop 지원하기

    이번 시간에는 드래그 앤 드롭(Drag & Drop) 기능을 구현해 보도록 하겠습니다. App Class의 InitInstance함수에 다음과 같은 코드를 추가하면 끝~! pMainFrame->DragAcceptFiles();   cfile8.uf.163148404D261B97190741.pdfcfile10.uf.133139404D261B9716AF4E.zip 관련된 글: Visual Studio 2010에서 OpenCV MFC 프로젝트 만들기 OpenCV 파일 저장기능 구현 OpenCV 파일 저장기능 구현2 RGB 컬러 공간 분리 – 메뉴 기반 구현2

  • Cam 영상 출력해보기

    지금까지 VS2010과 OpenCV 2.1라이브러리를 이용한 MFC 프로그래밍 기초에 대해서 알아봤습니다. 우리가 하려고 하는 것이 동영상 처리이므로 이번 시간에는 Cam으로부터 영상을 받아와서 출력하는 방법에 대해서 알아보겠습니다. 먼저 새 프로젝트를 Win32 콘솔 응용 프로그램 형식으로 만들어 줍니다.   OpenCV 2.1 라이브러리를 사용하기 위한 각종 세팅은 당연히 해주셔야 겠죠? 자세한 내용은“Visual Studio 2010에서 OpenCV MFC 프로젝트 만들기(http://deios.kr/400)”를 참고하세요….

10 Comments

  1. 실행 파일이 없으면…. 어떻게 실행을 해야 하나요??
    프로제트를 생성해서 소스를 넣으려고 해도.. ;;;

  2. 안녕하세요 ^^

    위에서 말씀하신 OnInitDialog 재정의를 어디서 어떻게 하는 건지 궁금합니다 ㅠ

    새로 만든 클래스에서 직접 타이핑하니 오류가 나네요.

    1. CDialogEx를 상속받는게 위 코드에서는 CViewDlg입니다.
      따라서 이 클래스에 OnInitDialog를 재정의 해주시면 되죠~
      어떤 에러가 나는지도 알려주시면 조금 더 상세히 설명드릴 수 있을것 같네요~

  3. 감사합니다 ^^ OnInitDialog 재정의 할 때 클래스 마법사에서 메시지 추가를 하려 했는데.
    OnInitDialog 은 메시지가 아니더군요. 그래서 소스에서 직접 추가하였습니다. 답변 감사합니다 ^^

  4. 비주얼 2008버전인데 오류가 나오는데 어떤 오류인지 궁금합니다.
    1>c:\documents and settings\심재용\my documents\visual studio 2008\projects\asdqwe\asdqwe\asdqwe.cpp(83) : error C2065: ‘CViewDlg’ : 선언되지 않은 식별자입니다.
    1>c:\documents and settings\심재용\my documents\visual studio 2008\projects\asdqwe\asdqwe\asdqwe.cpp(83) : error C2146: 구문 오류 : ‘;’이(가) ‘dlg’ 식별자 앞에 없습니다.
    1>c:\documents and settings\심재용\my documents\visual studio 2008\projects\asdqwe\asdqwe\asdqwe.cpp(83) : error C2065: ‘dlg’ : 선언되지 않은 식별자입니다.
    1>c:\documents and settings\심재용\my documents\visual studio 2008\projects\asdqwe\asdqwe\asdqwe.cpp(84) : error C2065: ‘dlg’ : 선언되지 않은 식별자입니다.
    1>c:\documents and settings\심재용\my documents\visual studio 2008\projects\asdqwe\asdqwe\asdqwe.cpp(84) : error C2228: ‘.DoModel’ 왼쪽에는 클래스/구조체/공용 구조체가 있어야 합니다.
    왜 오류가 나는지 궁금합니다.

답글 남기기

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