:: ADVANCE ::

[MFC] Dialog based MFC 기본 영상처리 window 만들기 본문

Image Processing/Windows Programming

[MFC] Dialog based MFC 기본 영상처리 window 만들기

KSJ14 2015. 12. 18. 03:51
반응형

[MFC] Dialog based MFC 기본 영상처리 window 만들기


visual studio 2015 기준



Windows Programming을 배우지도 않았고 집중해서 공부해 보지 않았지만


openCV를 이용하지 않은 영상처리를 하기 위해


vfw 라이브러리를 이용한 간단한 dialog 기반의 mfc 프로젝트를 만들어 보았다.


이 설정은

mfc 기능이나 제공되는 기본 code를 최대한 수정하지 않고 추가 되는 소스 (웹캠 연결을 위한)는 최소한으로 하였다.





프로젝트 이름은 ImageProcessBase라고 하였다.


생성되는 기본 파일은

 - ImageProcessBase.cpp

 - ImagePrecessBaseDlg.cpp

 - stdafx.cpp

이 세가지 이다. (헤더파일은 따로 있다)




먼저 ImageProcessBaseDlg.h 에 vfw 라이브러리를 추가하자.

웹캠의 프레임이 들어올 때 마다 불릴 콜백함수도 선언해 놓자.


그리고 CImageProcessBaseDlg 클래스의 마지막에 destroy 함수와 핸들도 추가하자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#pragma comment(lib, "vfw32.lib")
 
#include "vfw.h"
#include "afxwin.h"
 
#define    _DEF_WEBCAM        1000
 
LRESULT CALLBACK CallbackOnFrame(HWND hWnd, LPVIDEOHDR lpVHdr);
 
 
// class CImageProcessBaseDlg : public CDialogEx  안에
 
    void OnDestroy();
 
public:
    afx_msg void OnBnClickedOk();
 
    HWND m_Cap;
    CStatic m_stDisplay;

cs





ImageProcessBase.cpp 는 건들지 않고

ImageProcessBaseDlg.cpp 에만 웹캠을 연결하는 코드를 추가하였다.


BOOL CImageProcessBaseDlg::OnInitDialog()   안에 TODO 주석처리 된 부분 밑에 이 코드를 추가한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
RECT m_Rect = { 00640480 };     // 생성하고 싶은 사이즈를 RECT 변수에 초기화. 
                                      //  여기서는 1024x768로 설정하였다.
    AdjustWindowRect(&m_Rect, WS_OVERLAPPEDWINDOW, FALSE);
    int width = m_Rect.right - m_Rect.left;
    int height = m_Rect.bottom - m_Rect.top;
    this->SetWindowPos(NULL, 00, width, height, SWP_NOSIZE);
 
    // 윈도우 생성
    m_Cap = capCreateCaptureWindow(TEXT("Image Test"), WS_CHILD 
                                     | WS_VISIBLE, 00640480this->m_hWnd, NULL);
 
    // 콜백함수 지정
    if (capSetCallbackOnFrame(m_Cap, CallbackOnFrame) == FALSE) {
        return FALSE;
    }
 
    // 카메라 드라이버와 연결
    if (capDriverConnect(m_Cap, 0== FALSE) {
        return FALSE;
    }
 
    capPreviewRate(m_Cap, 33);    // 초당 프레임 지정
    capOverlay(m_Cap, false);
    capPreview(m_Cap, true);        // 미리보기 기능 설정
 
    if (BmInfo.bmiHeader.biBitCount != 24) {
 
        BmInfo.bmiHeader.biBitCount = 24;
        BmInfo.bmiHeader.biCompression = 0;
        BmInfo.bmiHeader.biSizeImage = BmInfo.bmiHeader.biWidth * 
                                       BmInfo.bmiHeader.biHeight * 3;
 
        capGetVideoFormat(m_Cap, &BmInfo, sizeof(BITMAPINFO));
    }

cs



이는 vfw 라이브러리의 웹캠 연결을 위한 코드이다.


bmInfo 변수는 위에 전역변수로 선언해 두었다.


1
2
BITMAPINFO BmInfo;
LPBYTE pImgBuffer;
cs



다음은 추가되는 OnDestroy 함수와 콜백함수이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void CImageProcessBaseDlg::OnDestroy()
{
    CDialog::OnDestroy();
 
    capDriverDisconnect(m_Cap);
 
    if (pImgBuffer != NULL) {
        delete[] pImgBuffer;
    }
}
 
LRESULT CALLBACK CallbackOnFrame(HWND hWnd, LPVIDEOHDR lpVHdr)
{
    /* 
    영상 데이터는 
    lpVHdr->lpData 에 1차원 배열로 저장되어 있다.
    여기에 영상처리 코드를 넣으면 된다.
    
    */
 
    return (LRESULT)true;
}
 

cs



( 참고로 Window programming 환경에서 console 창을 띄우고 싶다면 )


1
2
3
// win32 program에서 console창을 띄우기 위한 방법
// printf를 사용하기 위해 stdio.h를 include
#pragma comment(linker, "/entry:WinMainCRTStartup /subsystem:console")
cs



전체 파일들이다.



ImageProcessBase.cpp


ImageProcessBase.h


ImageProcessBaseDlg.cpp


ImageProcessBaseDlg.h


반응형

'Image Processing > Windows Programming' 카테고리의 다른 글

[error] LINK2005 이미 정의되어 있습니다.  (0) 2015.12.18
[DC] DC (Device Context)  (0) 2015.12.17
[CALLBACK] CALLBACK Function  (0) 2015.12.17
[LRESULT] LRESULT & CALLBACK  (0) 2015.12.17
Comments