---
title: "Visual Studio 2010에서 OpenCV MFC 프로젝트 만들기"
id: "653"
type: "post"
slug: "400"
published_at: "2010-12-29T17:05:36+00:00"
modified_at: "2025-12-12T04:28:11+00:00"
url: "https://dworld.deios.kr/400/"
markdown_url: "https://dworld.deios.kr/400.md"
excerpt: "이번에는 Visual Studio 2010에서 OpenCV 2.1 라이브러리를 활용하여 MFC프로젝트를 만들고, 이미지를 불러와서 화면에 출력해보겠습니다. 먼저 제 환경은 다음과 같고, DLL파일은 path환경변수에 설정되어 있습니다. DLL : “D:\\lib\\bin” Header : “D:\\lib\\include” Library : “D:\\lib\\lib” Source : “D:\\lib\\src” VS2010에서 [파일] → [새로만들기] →..."
taxonomy_category:
  - "Study"
taxonomy_post_tag:
  - "MFC"
  - "OpenCV 2.1"
  - "vs 2010"
---

이번에는 Visual Studio 2010에서 OpenCV 2.1 라이브러리를 활용하여 MFC프로젝트를 만들고, 이미지를 불러와서 화면에 출력해보겠습니다.

먼저 제 환경은 다음과 같고, DLL파일은 path환경변수에 설정되어 있습니다.

DLL : “D:\lib\bin”

Header : “D:\lib\include”

Library : “D:\lib\lib”

Source : “D:\lib\src”

VS2010에서 [파일] → [새로만들기] → [프로젝트]를 선택합니다.

너무나도 당연하게 ‘Visual C++ MFC 응용 프로그램’을 선택해 주어야겠죠?

MFC 응용 프로그램 마법사입니다. “다음”을 가뿐하게 눌러 줍니다.

“탭 문서”의 체크를 해제해 주고, “프로젝트 스타일”을 “MFC 표준”으로 지정해 줍니다.

역시 다음을 사정없이 클릭해 줍니다.

이번에도 그냥 다음

에… 또 다음이네요…

이번에도 별거 없습니다. 이것저것 바꾸셔도 되고요…

이번에도 그냥 지나가시면 됩니다. 저는 기분나쁜 ActiveX 컨트롤러를 체크 해제 합니다. 사실 별 상관 없습니다.

스크롤을 써먹기 위해서는 ‘View 클래스’의 기본 클래스를 “CScrollView”로 지정합니다.

이제 OpenCV를 사용하기 위한 설정을 해줘야 겠죠? 프로젝트 속성을 엽니다.

Debug와 Release모두 VC++ 디렉터리를 지정해 줍니다.

자세한 사항은 “[Visual Studio 2010에서 OpenCV 이용하기(http://deios.kr/395)](https://dworld.deios.kr/395)
”를 참고하세요~

[링커] → [입력]의 “추가 종속성”부분에 lib 파일을 기술합니다.

이렇게 하면 OpenCV라이브러리를 사용하기 위한 준비가 끝납니다.

이제 본격적으로 MFC프로젝트에서 OpenCV라이브러리를 사용해 볼까요?

먼저 영상 데이터를 담을 CvvImage클래스의 맴버 변수를 등록해야 합니다.

Doc클래스 위에서 [추가] → [변수 추가]를 눌러 줍니다.

변수 형식은 “CvvImage”로 변수 이름은 “m_CvvImage”로 지정합니다.

헤더 파일도 추가할겸 해당 맴버 변수가 등록되는 헤더 파일을 열어봅시다.

저 부분에 직접 맴버 변수를 등록해도 됩니다.

상단으로 이동하여 다음과 같은 헤더 파일을 include 합니다.

```
#include 

#include 

#include 
```

다음으로 Doc클래스의 OnOpenDocument를 재정의 합니다.

사정없이 클릭해줘야겠죠?

```
BOOL CMFC_OpenCVDoc::OnOpenDocument(LPCTSTR lpszPathName)

{       if (!CDocument::OnOpenDocument(lpszPathName)) return FALSE;

 

        USES_CONVERSION;

        m_CvvImage.Load(W2A(lpszPathName));

 

        return TRUE;

}
```

위와 같이 코딩합니다.

이때, OpenCV는 char*형을 사용하고, VS2010의 Dialog는 LPCTSTR형을 사용하기 때문에 FullFilePathName을 받아오기 위해서 W2A라는 매크로를 사용합니다.

이제 화면에 보여주는 일만 남은 것 같네요. 화면에 보여주는 작업은 3단계를 거칠 예정입니다.

첫 번째로 OnDraw를 재정의하여 화면에 출력해 주는 부분을 추가할 것이고,

두 번째로 OnInitialUpdate를 재정의하여 이미지 사이즈에 View크기를 맞출 것입니다.

마지막으로 InitInstance를 재정의하여 프로그램을 처음 시작하면 나오는 빈 화면을 제거할 것입니다.

먼저 View클래스의 OnDraw를 사정없이 클릭해 줍니다.

다음과 같이 코딩합니다.

```
void CMFC_OpenCVView::OnDraw(CDC* pDC)

{

        CMFCOpenCVTestDoc* pDoc = GetDocument();

        ASSERT_VALID(pDoc);

        if (!pDoc)

                return;

 

        // TODO: 여기에 원시 데이터에 대한 그리기 코드를 추가합니다.

        if(pDoc->m_CvvImage.GetImage()){

                int height = pDoc->m_CvvImage.Height();

                int width = pDoc->m_CvvImage.Width();

                CRect rect = CRect(0,0, width, height);

                pDoc->m_CvvImage.DrawToHDC(pDC->GetSafeHdc(), &rect);

 

                ResizeParentToFit(TRUE);

        }

}
```

이번에는 OnInitialUpdate를 수정해 보겠습니다.

역시 다음과 같이 코딩합니다.

```
void CMFC_OpenCVView::OnInitialUpdate()

{

        CMFC_OpenCVDoc *pDoc = GetDocument();

        ASSERT_VALID(pDoc);

        CScrollView::OnInitialUpdate();

 

        CSize sizeTotal;

        // TODO: 이 뷰의 전체 크기를 계산합니다.

        if(pDoc->m_CvvImage.GetImage()){

                int height = pDoc->m_CvvImage.Height();

                int width = pDoc->m_CvvImage.Width();

                sizeTotal = CSize(width, height);

        }else{

                sizeTotal.cx = sizeTotal.cy = 100;

        }

        SetScrollSizes(MM_TEXT, sizeTotal);

        ResizeParentToFit(TRUE);

}
```

마지막으로 프로그램 처음 실행시 나오는 왠지 기분 나쁜 빈 화면을 제거해 보겠습니다.

다음과 같이 코딩합니다.

```
// 표준 셸 명령, DDE, 파일 열기에 대한 명령줄을 구문 분석합니다.

        CCommandLineInfo cmdInfo;

        ParseCommandLine(cmdInfo);

 

        if(cmdInfo.m_nShellCommand == CCommandLineInfo::FileNew){

                cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;

        }
```

마지막으로 m_CvvImage에 할당된 메모리를 해제하겠습니다.

다음과 같이 코딩합니다.

```
void CMFC_OpenCVDoc::DeleteContents()
{
    // TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
    if(NULL != m_CvvImage.GetImage()) m_CvvImage.~CvvImage();
    CDocument::DeleteContents();
}
```

cfile10.uf.1605983B4D1B69EA179E83.zipcfile26.uf.163086464D260338042BD9.pdf

### 이 글 공유하기:

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

### 이것이 좋아요:

좋아하기로드 중...

### *관련*

### 관련된 글:

1. [OpenCV 파일 저장기능 구현](https://dworld.deios.kr/401/)
2. [OpenCV 파일 저장기능 구현2](https://dworld.deios.kr/402/)
3. [Drag and Drop 지원하기](https://dworld.deios.kr/404/)
4. [RGB 컬러 공간 분리 – 메뉴 기반 구현2](https://dworld.deios.kr/408/)

## Similar Posts

- 메모리가 미래 통신에 있어서 병목 지점이 되는 이유를 설명하고 해결 방안을 제시하시오. 1) 메모리는 코드와 데이터를 함께 저장한다. 표현 계층이 개입한다면 메모리 연산이 증가하게 되어 병목 현상이 발생한다. -> 표현계층을 적게 사용한다.2) 각 계층 이동시 메모리 연산 증가. OSI-7-layer에서 각 계층 이동시 메모리 복사가 빈번하게 일어나게 된다. -> shared memory, page remapping, 계층 통합 처리3)… ### 이 글 공유하기: - [Facebook으로 공유하기 (새 창에서 열림)Facebook](https://dworld.deios.kr/371/?share=facebook) - [X에 공유 (새 창에서 열림)X](https://dworld.deios.kr/371/?share=x) - ### 이것이 좋아요: 좋아하기로드 중...
- [https://dworld.deios.kr/425/](https://dworld.deios.kr/425/) 관련된 글: 고속 네트워크에서의 메모리 병목 현상 Drag and Drop 지원하기 정지영상 캡춰기능 구현 Face Detect ### 이 글 공유하기: - [Facebook으로 공유하기 (새 창에서 열림)Facebook](https://dworld.deios.kr/425/?share=facebook) - [X에 공유 (새 창에서 열림)X](https://dworld.deios.kr/425/?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) - ### 이것이 좋아요: 좋아하기로드 중...
- [https://dworld.deios.kr/408/](https://dworld.deios.kr/408/) 이번에는 지난 시간에 해 봤던 “RGB 컬러 공간 분리 – 메뉴 기반 구현(http://deios.kr/407)”의 새 창으로 여는 부분을 조금 더 일반화 하고, MFC에 적합하게 만들어 보겠습니다. 먼저 새 창으로 이미지를 여는 전역 함수를 작성해 보겠습니다. App Class의 헤더 파일을 열어 가장 마지막에 다음과 같이 추가해 줍니다. void OpenByNewDocument(LPTSTR szTitle, IplImage * image); 이 전역 함수는… ### 이 글 공유하기: - [Facebook으로 공유하기 (새 창에서 열림)Facebook](https://dworld.deios.kr/408/?share=facebook) - [X에 공유 (새 창에서 열림)X](https://dworld.deios.kr/408/?share=x) - ### 이것이 좋아요: 좋아하기로드 중...
- cfile25.uf.20778B3C4F95B37218BD8A.pdf 관련된 글: [VS2010]LPCTSTR에서 char*로 형 변환하기 Cam 영상 출력해보기 HVR-2000 Series 이용하기 Wavelet Transform ### 이 글 공유하기: - [Facebook으로 공유하기 (새 창에서 열림)Facebook](https://dworld.deios.kr/461/?share=facebook) - [X에 공유 (새 창에서 열림)X](https://dworld.deios.kr/461/?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) - ### 이것이 좋아요: 좋아하기로드 중...

## 2 Comments

1. 핑백: [OpenCV 파일 저장기능 구현 | D's World](https://dworld.deios.kr/401/)
2. 핑백: [Cam 영상 출력해보기 | D's World](https://dworld.deios.kr/413/)

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