MFC에서 VFW를 이용한 웹캠영상받기MFC에서 VFW를 이용한 웹캠영상받기

Posted at 2008. 5. 13. 02:46 | Posted in Team Project

OpenCV를 이용하지않고 MFC를 사용한 웹캠영상받기이다.

VFW는 Video For Window의 약자로서 윈도우에서 비디오 장치를 연결하여 출력 하게끔 해주는 라이브러리다.

또 리눅스에서도 연결 하게 해주는 VFL(Video For Linux) 가 있다.

아래 내용을 펴보면 VFW라이브러리를 이용한 비디오 캡쳐방법을 확인 할 수 있다.


우선 이 라이브러리를 사용하기 위해 라이브러리 링크를 걸어야 하는데 링크를 거는 화면은 다음과 같다. 


사용자 삽입 이미지

위의 그림에서 유심히 봐야 할것은 vfw헤더 파일 인클루드와 vfw32.lib 파일을 추가 시키는 것이다.

그리고 웹캠연결을 위한 소스는 다음과 같다.

void CCamTestView::initCam()
{
      BITMAPINFO BmInfo;
      m_HCam=capCreateCaptureWindow("Capture Window",WS_CHILD | WS_VISIBLE,
      20,20,320,240,this->m_hWnd , NULL);
 
      if(capDriverConnect(m_HCam,0)==false)
      {
             return ;
      }
      capGetVideoFormat(m_HCam, &BmInfo, sizeof(BITMAPINFO));
      if(BmInfo.bmiHeader.biBitCount!=24)
      {
            BmInfo.bmiHeader.biBitCount=24;
            BmInfo.bmiHeader.biCompression=0;
            BmInfo.bmiHeader.biSizeImage=BmInfo.bmiHeader.biWidth*BmInfo.bmiHeader.biHeight*3;
            capSetVideoFormat(m_HCam,&BmInfo, sizeof(BITMAPINFO));
      }
 
      capPreviewRate(m_HCam, 10);
      capOverlay(m_HCam, false);
      capPreview(m_HCam, true);
}

위의소스는 웹캠연결만을 위한 소스 이며 실제로 위의 소스만 가지고는 웹캠으로 들어 오는 영상을 가지고
영상 처리를 하기에는 부적합하다.
위의 방식에다 콜벡함수에 영상 데이터를 넘겨 주는 방식이 있는데, 그 방식을 사용하면 쉽게 영상의
실제 데이터를 실시간으로 획득 할 수 있으며 쉽게 영상을 처리 할 수 있게 된다.

위에 VFW라이브러리 함수에도 설명되어있지만 위 소스에 나온 함수를 다시한번 살펴보면 다음과 같다.

===================================================================
HWND capCreateCaptureWindow(name, style, x, y, width, height, hWnd, id);
- 이 함수는 캡쳐 윈도우를 만든다.
매개 변수는 순서대로 윈도우 이름, 스타일, 윈도우 좌측 상단 좌표, 캡쳐윈도우 크기, 부모 윈도우 핸들값, 윈도우 식별 번호 를 입력을 하면 된다.
캡쳐 윈도우가 정상적으로 생성되면 캡쳐 윈도우 핸들이 반환 되고 그렇지 않다면 NULL이 반환 된다.
 
BOOL capDriverConnect(hWnd, index);
- 이 함수는 캡쳐윈도우를 드라이버에 연결을 한다.
매개 변수는 순서대로 윈도우 핸들, 캡쳐 드라이버 번호를 나타낸다.
성공하면 TRUE를 그렇지 않다면 FALSE를 반환한다.
 
DWORD capSetVideoFormat(hWnd, format, format_size);
- 이 함수는 캡쳐된 비디오 데이터 형식을 설정한다. 데이터 형식이 캡쳐 장치에서 지원 가능하면
TRUE, 그렇지 않다면 FALSE값을 반환한다
매개 변수는 순서대로 윈도우 핸들, 비디오 데이터 구조(BITMAPINFO 구조체), 구조체의 크기를 입력하면 된다.
capGetVideoFormat함수는 설정이 아니라 설정된 값을 가져 오는 함수라 생각하면 된다.
 
BOOL capPreviewRate(hWnd, rate);
- 이 함수는 프레임 재생 속도를 설정 한다.
매개 변수는 순서대로 윈도우 핸들, rate는 ms의 단위의 시간으로 설정한다.
예를 들어 66으로 설정하면 0.066초마다 프레임을 캡쳐해서 보여준다. 1초에 15개의 프레임을 보여 준다는 것이다.
 
BOOL capOverlay(hWnd, f);
- 이 함수는 비디오 오버레이를 사용 할것인지 아닌지를 설정한다. 설정 성공시 TRUE, 그렇지 않을경우 FALSE를 반환한다.
매개변수는 순서대로 윈도우 핸들, 설정시-true 미설정시 -false
비디오 오버레이를 사용하면 CPU자원이 요구 되지 않아 효과적이라고 한다.
 
BOOL capPreview(hWnd, f);
- 이 함수는 미리보기 모드를 동작 시킬 것인지 아닌지를 설정한다. 설정을 하게 되면 영상 프레임이 시스템의 메모리로 전달되어 GDI함수를 사용하여 캠처 윈도우에 영상을 출력하게 된다.
매개 변수는 순서대로 윈도우 핸들, 설정시 -true, 미설정시 -false
===================================================================

※첨부파일로 OpenCV홈페이지의 관련게시물에서 받은 소스파일을 올리니 참고하기바람.

 

[출처] VFW 라이브러리 설명|작성자 마인드온
[출처] MFC에서 VFW를 이용한 웹캠 연동 (간단!)|작성자 봉봉월드


위의 내용이 복잡하다면 플래시로 만든 동영상 강의도 있다. (다보진않았다 -_-;;)
아래 주소로 가서 동영상을 본다면 좀더 쉽게 구현할수 있을것이다.

보러가기

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기