---
title: "MFC – Cam 영상 출력해보기"
id: "742"
type: "post"
slug: "420"
published_at: "2011-01-16T17:49:22+00:00"
modified_at: "2025-12-12T04:29:16+00:00"
url: "https://dworld.deios.kr/420/"
markdown_url: "https://dworld.deios.kr/420.md"
excerpt: "이번 시간에는 MFC프로젝트에서 Cam 영상을 받아오는 부분을 구현해 보겠습니다. “동영상 처리” → “영상 보기”메뉴를 추가하고, 해당 메뉴를 클릭했을 때, 영상을 뿌려주는 Dialog를 띄웁니다. Dialog에서 “시작” 버튼을 클릭했을 경우 Caption이 “중지”로 바뀌고, Static 영역에 영상을 뿌려주게 만들어 보겠습니다. 먼저 사용할 다이얼로그부터..."
taxonomy_category:
  - "Study"
taxonomy_post_tag:
  - "AR"
  - "cam"
  - "MFC"
  - "opencv"
  - "VS2010"
  - "증강현실"
---

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

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

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

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

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

ID : IDD_CamView

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

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

이제 “확인”버튼의 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 만들기](/#1.%20Dialog%EC%97%90%20%EB%8C%80%EC%9D%91%ED%95%98%EB%8A%94%20Class%EB%A7%8C%EB%93%A4%EA%B8%B0)

[2. OnInitDialog()에서 초기화 및 cvCaptureFromCAM함수 호출](/#2.%20OnInitDialog%28%29%EC%97%90%EC%84%9C%20%EC%B4%88%EA%B8%B0%ED%99%94%20%EB%B0%8F%20cvCaptureFromCAM%ED%95%A8%EC%88%98%20%ED%98%B8%EC%B6%9C)

[3. OnTimer()구현](/#3.%20OnTimer%28%29%EA%B5%AC%ED%98%84)

[4. OnOK()구현](/#4.%20OnOK%28%29%EA%B5%AC%ED%98%84)

[5. 메뉴에 추가](/#5.%20%EB%A9%94%EB%89%B4%EC%97%90%20%EC%B6%94%EA%B0%80)

자~ 그럼 시작해 볼까요?

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

Class추가 방법이 기억나지 않으시는 분은 “[공간 영역 필터링 – Dialog Box 기반 구현(http://deios.kr/409#DialogClass)](https://dworld.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)](https://dworld.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)](https://dworld.deios.kr/407#AddMenu)
“을 참고하세요~

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

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

```
void CMFC_OpenCVApp::OnCamView()

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

        CViewDlg dlg;

        dlg.DoModal();

}
```

짝짝짝~!

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

### 이 글 공유하기:

- [Facebook으로 공유하기 (새 창에서 열림)Facebook](https://dworld.deios.kr/420/?share=facebook)
- [X에 공유 (새 창에서 열림)X](https://dworld.deios.kr/420/?share=x)
-

### 이것이 좋아요:

좋아하기로드 중...

### *관련*

### 관련된 글:

1. [Cam 영상 출력해보기](https://dworld.deios.kr/413/)
2. [모덜리스(Modeless) Dialog로 변환하기](https://dworld.deios.kr/421/)
3. [정지영상 캡춰기능 구현](https://dworld.deios.kr/422/)
4. [Face Detect](https://dworld.deios.kr/423/)

## Similar Posts

- [https://dworld.deios.kr/401/](https://dworld.deios.kr/401/) “Visual Studio 2010에서 OpenCV MFC 프로젝트 만들기(http://deios.kr/400)”에 이어 이번에는 파일 저장기능을 구현해 보도록 하겠습니다. 파일 열기는 OnOpenDocument()함수를 재정의 했던거 기억하시죠? 마찬가지로 파일 저장은 OnSaveDocument()함수를 재정의 하면 됩니다. 이젠 그림만 봐도 아시겠죠? return CDocument::OnSaveDocument(lpszPathName); 부분을 다음과 같이 수정합니다. USES_CONVERSION; return m_CvvImage.Save(W2A(lpszPathName)); 저번에도 말씀드렸지만 OpenCV 라이브러리가 char *형을 받기 때문에 W2A매크로를 사용해 줍니다. 이번에는 새… ### 이 글 공유하기: - [Facebook으로 공유하기 (새 창에서 열림)Facebook](https://dworld.deios.kr/401/?share=facebook) - [X에 공유 (새 창에서 열림)X](https://dworld.deios.kr/401/?share=x) - ### 이것이 좋아요: 좋아하기로드 중...
- [https://dworld.deios.kr/398/](https://dworld.deios.kr/398/) 저번에 해봤던 “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… ### 이 글 공유하기: - [Facebook으로 공유하기 (새 창에서 열림)Facebook](https://dworld.deios.kr/398/?share=facebook) - [X에 공유 (새 창에서 열림)X](https://dworld.deios.kr/398/?share=x) - ### 이것이 좋아요: 좋아하기로드 중...
- 함수종속 어떤 릴레이션 R에서 X와 Y를 의 애트리뷰트 집합의 부분집합이라 하자. X의 값 각각에 대해 시간에 관계 없이 Y의 값이 오직 하나만 연관되어 있을 때 Y는 X에 함수종속이라 하고 X →Y로 표기한다. 이 때, X를 결정자, Y를 종속자라고 한다. 제 1 정규형(1NF) 어떤 릴레이션 R에 속한 모든 도메인이 원자값만으로 되어 있다면 제 1 정규형이라고 한다. 제 2… ### 이 글 공유하기: - [Facebook으로 공유하기 (새 창에서 열림)Facebook](https://dworld.deios.kr/374/?share=facebook) - [X에 공유 (새 창에서 열림)X](https://dworld.deios.kr/374/?share=x) - ### 이것이 좋아요: 좋아하기로드 중...
- 이제 슬슬 공부나 해볼까하고 마음먹던중;;; 그냥 갑자기 C를 하고 싶어졌습니다… 이제까지 하려고 하려고 해도… 귀찮아서 접어두었던 C 책 한권을 꺼내서;;; 첫장을 펼처보니 “Turbo C++”를 설치하라는 겁니다… 전 착한 학생이기 때문에(~ㅋ) 하라는데로 설치했죠;;; 설치하고 보니 이게 왼걸;;; 구석기시대에서나 볼수있는 인터페이스;;; ㄷㄷ;;; 그래서 부대안에 있을때 사용했던 AcroEdit과 연결하기로 마음먹었습니다… 열심히 컴파일러를 찾아 해매였는데…;;; 이게 왠걸;;; 도처히 못찾겠습니다.;;;… ### 이 글 공유하기: - [Facebook으로 공유하기 (새 창에서 열림)Facebook](https://dworld.deios.kr/163/?share=facebook) - [X에 공유 (새 창에서 열림)X](https://dworld.deios.kr/163/?share=x) - ### 이것이 좋아요: 좋아하기로드 중...
- [https://dworld.deios.kr/404/](https://dworld.deios.kr/404/) 이번 시간에는 드래그 앤 드롭(Drag & Drop) 기능을 구현해 보도록 하겠습니다. App Class의 InitInstance함수에 다음과 같은 코드를 추가하면 끝~! pMainFrame->DragAcceptFiles(); cfile8.uf.163148404D261B97190741.pdfcfile10.uf.133139404D261B9716AF4E.zip 관련된 글: Visual Studio 2010에서 OpenCV 이용하기 OpenCV 파일 저장기능 구현2 모든 창 닫기 구현 클립보드 기능 구현 ### 이 글 공유하기: - [Facebook으로 공유하기 (새 창에서 열림)Facebook](https://dworld.deios.kr/404/?share=facebook) - [X에 공유 (새 창에서 열림)X](https://dworld.deios.kr/404/?share=x) - ### 이것이 좋아요: 좋아하기로드 중...
- 오류제어 및 흐름제어 기능은 계층 2와 4에도 있다. 이들의 차잇점을 쓰시오. 2계층과 4계층의 차이점.2계층은 서로 연결된 두 노드간의 제어이며, 4계층은 단대단 제어이다.따라서 4계층의 오류제어와 흐름제어는 단말과 네트워크를 포함한 제어 기술이다.2계층의 오류 제어는 오류제어를 담당한다. 4계층의 오류제어는 송신측과 수신측 단대단 오류 제어이다.2계층의 흐름제어는 역시 인접노드간의 흐름 제어이고, 4계층의 흐름제어는 단대단 흐름제어이다. 관련된 글: 고속 네트워크 프로토콜의… ### 이 글 공유하기: - [Facebook으로 공유하기 (새 창에서 열림)Facebook](https://dworld.deios.kr/373/?share=facebook) - [X에 공유 (새 창에서 열림)X](https://dworld.deios.kr/373/?share=x) - ### 이것이 좋아요: 좋아하기로드 중...

## 10 Comments

1. 실행 파일이 없으면…. 어떻게 실행을 해야 하나요?? 프로제트를 생성해서 소스를 넣으려고 해도.. ;;; [답글](#comment-247)
  1. 무엇을 하고 싶고, 어떤 실행파일이 없으신지??? [답글](#comment-248)

2. 안녕하세요 ^^ 위에서 말씀하신 OnInitDialog 재정의를 어디서 어떻게 하는 건지 궁금합니다 ㅠ 새로 만든 클래스에서 직접 타이핑하니 오류가 나네요. [답글](#comment-249)
  1. CDialogEx를 상속받는게 위 코드에서는 CViewDlg입니다. 따라서 이 클래스에 OnInitDialog를 재정의 해주시면 되죠~ 어떤 에러가 나는지도 알려주시면 조금 더 상세히 설명드릴 수 있을것 같네요~ [답글](#comment-250)

3. 감사합니다 ^^ OnInitDialog 재정의 할 때 클래스 마법사에서 메시지 추가를 하려 했는데. OnInitDialog 은 메시지가 아니더군요. 그래서 소스에서 직접 추가하였습니다. 답변 감사합니다 ^^ [답글](#comment-251)
  1. 해결되신거 같아 다행이네요~ ^^ 좋은 하루 보내세요~ [답글](#comment-252)

4. OpenCV2.2에서는 CvvImage가 없어지지않았나요 ㅠㅠㅠㅠㅠ [답글](#comment-253)
5. 비주얼 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’ 왼쪽에는 클래스/구조체/공용 구조체가 있어야 합니다. 왜 오류가 나는지 궁금합니다. [답글](#comment-254)
  1. “1. Dialog에 대응하는 Class만들기”를 수행하지 않으셔서 생기는 문제입니다. [http://deios.kr/409/](http://deios.kr/409/) 참고하셔서 CViewDlg를 만들어 주세요. [답글](#comment-256)

6. 핑백: [모덜리스(Modeless) Dialog로 변환하기 | D's World](https://dworld.deios.kr/421/)

### 댓글 남기기[응답 취소](/420/?t=1784797396#respond)
