Cfile10.uf .140654504D1B679820AACF

Visual Studio 2010에서 OpenCV MFC 프로젝트 만들기

이번에는 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에서 [파일] → [새로만들기] → [프로젝트]를 선택합니다.

Cfile10.uf .140654504D1B679820AACF

 

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

Cfile27.uf .111C8B484D1B67992898EB

 

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

Cfile7.uf .15435A584D1B679919CBE9

 

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

Cfile8.uf .1355CC544D1B6799033D3C

 

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

Cfile22.uf .130E8F4B4D1B679A0C6244

이번에도 그냥 다음

Cfile7.uf .143631594D1B679A246D0D

 

에… 또 다음이네요…

Cfile23.uf .1454CC474D1B679B2F0899

 

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

Cfile7.uf .203C954A4D1B679B1D7E30

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

Cfile10.uf .1731CB494D1B679B10AEE2

 

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

Cfile29.uf .1612A3554D1B679C2887A0

 

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

Cfile24.uf .1546E6574D1B679C2137BB

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

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

 

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

Cfile25.uf .1475F74B4D1B679C26A8D3

 

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

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

 

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

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

Cfile24.uf .152DCD4A4D1B679D368773

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

Cfile9.uf .1772A54D4D1B679E073368

 

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

Cfile29.uf .1430185A4D1B679E32B386

 

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

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

#include 

#include 

#include 

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

Cfile5.uf .2061354F4D1B679F21809A

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

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를 사정없이 클릭해 줍니다.

Cfile1.uf .1673A5474D1B679F0ABF5B

 

 

다음과 같이 코딩합니다.

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를 수정해 보겠습니다.

Cfile5.uf .1432934A4D1B67A0311F1D

 

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

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);

}

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

Cfile2.uf .190FFE554D1B67A02D8834

 

다음과 같이 코딩합니다.

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

        CCommandLineInfo cmdInfo;

        ParseCommandLine(cmdInfo);

 

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

                cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;

        }

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

Cfile3.uf .202B013E4D2602F00DE326

다음과 같이 코딩합니다.

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

 

Cfile29.uf .111CCB484D1B67A127371E

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

Similar Posts

  • 모덜리스(Modeless) Dialog로 변환하기

    이전 시간에 만들었던 모달(Modal) Dialog를 모덜리스(Modeless) Dialog로 변환해 보겠습니다. Modal Dialog는 Dialog가 실행되는 동안 다른 작업을 하지 못하고, Modeless Dialog는 프로그램 실행 흐름을 방해하지 않는다는 것 정도는 알고 계시죠? 자 그럼 이전 시간 “MFC – Cam 영상 출력해보기(http://deios.kr/420)”에 만들었던 View Dialog를 멋지게 바꿔 보겠습니다.   OnCamView함수를 다음과 같이 수정합니다. void CMFC_OpenCVApp::OnCamView() {       // TODO: 여기에 명령…

  • 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…

  • 데이터 종속성과 정규화

    함수종속 어떤 릴레이션 R에서 X와 Y를 의 애트리뷰트 집합의 부분집합이라 하자.  X의 값 각각에 대해 시간에 관계 없이 Y의 값이 오직 하나만 연관되어 있을 때 Y는 X에 함수종속이라 하고 X →Y로 표기한다. 이 때, X를 결정자, Y를 종속자라고 한다. 제 1 정규형(1NF) 어떤 릴레이션 R에 속한 모든 도메인이 원자값만으로 되어 있다면 제 1 정규형이라고 한다. 제 2…

  • AcroEdit에서 C/C++ Compile 하기…

    이제 슬슬 공부나 해볼까하고 마음먹던중;;; 그냥 갑자기 C를 하고 싶어졌습니다… 이제까지 하려고 하려고 해도… 귀찮아서 접어두었던 C 책 한권을 꺼내서;;; 첫장을 펼처보니 “Turbo C++”를 설치하라는 겁니다… 전 착한 학생이기 때문에(~ㅋ) 하라는데로 설치했죠;;; 설치하고 보니 이게 왼걸;;; 구석기시대에서나 볼수있는 인터페이스;;; ㄷㄷ;;; 그래서 부대안에 있을때 사용했던 AcroEdit과 연결하기로 마음먹었습니다… 열심히 컴파일러를 찾아 해매였는데…;;; 이게 왠걸;;; 도처히 못찾겠습니다.;;;…

  • [VS2010]LPCTSTR에서 char*로 형 변환하기

    OpenCV를 가지고 놀고 있는데 이놈이 char *밖에 지원하지 않아서 고생이 많습니다. 소스도 있겠다 확 다 뜯어고쳐버릴까… 라고 생각은 했지만 막상 하려니 엄두가 나질 않네요… 이게 다 실력이 부족해서라는… ㄷㄷㄷ MSDN도 찾아보고 이래저래 해봤지만 파일 경로등 특수문자 or 한글(유니코드)를 포함한 LPCTSTR은 char*형으로 쉽게 변환하지 못했습니다. \는 짤라먹기 일수고 한글은 듣도보도 못한 한자 or 일어로 변환되버렸죠 ㅠㅠ…

  • Cam 영상 출력해보기

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

2 Comments

답글 남기기

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