멀티미디어 지식공작소 | '라이브러리' 태그의 글 목록
멀티미디어 지식공작소 위치로그  |  태그  |  미디어로그  |  방명록
icon 라이브러리 에 해당하는 글1 개
2008.02.03   [펌] [VisualC++] vfw 라이브러리의 비디오 캡쳐 관련 함수


icon [펌] [VisualC++] vfw 라이브러리의 비디오 캡쳐 관련 함수
프로그램 기술/C/C++/MFC | 2008. 2. 3. 17:53
출처 블로그 > 작은 내 안에 더 큰 세상을 꿈꾸며
원본 http://blog.naver.com/winiwiny/60019924938

VFW 라이브러리를 사용한 비디오 캡쳐 방법을 살펴보자. 비디오 캡쳐를 위해서는 먼저 캡쳐 윈도우를 생성하고 이 윈도우와 캡쳐 드라이버를 연결해야 한다. 그리고 캡쳐된 비디오 프레임을 캡쳐 윈도우에 보여주기 위해서는 한 프레임이 캡쳐 될 때마다 특정 함수를 호출하도록 한 다음에 호출된 함수에서 그 프레임을 화면에 출력한다. 이러한 작업을 수행하기 위해서는 VFW 라이브러리 중에서 다음과 같은 함수들을 사용해야 한다.


capGetDriverDescription()

CapCreateCaptureWindow()

capDriverConnect()

capPreviewRate()

capSetVideoFormat()

capDriverDisconnect()

capSetCallbackOnFrame()


capGetDriverDescription()함수

BOOLcapGetDriverDescription(index, name, name_size, version, version_size);

이 함수는 캡쳐 드라이버의 이름 및 버전 정보를 검색한다. 첫 번째 매개변수인 index는 검색하고자 하는 드라이버의 번호를 나타내는데, 0부터 9까지의 값을 가질 수 있다.

즉, 한 컴퓨터에서 9대의 캡쳐 장치가 사용될 수 있다고 가정하고 있다. 검색하고자 하는 번호의 드라이버가 존재하면 이 함수는 name에 드라이버의 이름을 저장하고 version에 드라이버 버전을 저장한 다음에 함수 결과값으로 TURE 값을 반환한다.


capCreateCaptureWindow()함수

H중 capCreateCaptureWindow(name, style, x, y, width, height, hWnd, id);

이 함수는 캐쳐 윈도우를 생성한다. name 에는 윈도우위 이름을 지정한다. style 윈도우위 스타일을 지정한다. (x,y)에는 캡쳐 윈도우의 좌측 상단의 좌표를 지정한다. width height에는 캡쳐 윈도우의 크기를 지정한다. hWnd에는 부모윈도우의 핸들값을 입력한다. id에는 윈도우의 식별 번호를 입력한다. 캡쳐 윈도우가 정상ㄷㅈ거으로 생성되면 캡쳐 우니도우의 핸들의 함수 결과값으로 반환되고 그렇지 않으면 NULL값이 반환된다.


capoDriverConnect()함수

capDriverConnect(hWnd, index);

이 함수는 캡쳐 윈도우를 캡쳐 드라이버에 연결한다. hWnd는 캡쳐 윈도우의 핸들을 나타내고 index는 캡쳐 드라이버의 번호를 나타낸다. 이 함수는 캡쳐 장치가 정상적으로 작동하여 연결이 성공되면 TURE 값을 반환하고 그렇지 않으면 FALSE 값을 반환한다.


capPreviewRate()함수

capPreviewRate(hWnd, rate);

이 함수는 미리보기 (preview)모드에서의 프레임 재생 속도를 설정한다. 여기에서 미리보기란 카메라에서 입력도니 비디오를 파일에 저장하는 것이 아니라 화면에 보여준다는 것을 의미한다. hWnd는 캡쳐 윈도우의 핸들 값으로 설정하고 rate는 밀리초(ms) 단 위의 시간으로 설정한다. 예를 들어, rate 값을 66으로 설정하면 0.066초마다 새로운 비디오 프레임을 캡쳐해서 디스플레이 하게 도니다. 이와 같은 속도로 재생을 하면 1초에 15개의 비디오 프레임이 드스플레이된다.


carSetVideFormat()함수

carSetVideoFormat(hWnd, videoFormat, videoFormat_size);

이 함수는 캡쳐된 비디오 데이터 형식을 설정한다. 사용자가 원하는 비디오 데이터형식이 캡쳐 장치에서 지원이 되면 이 함수는 TRUE 값을 반환하고 그렇지 않으면 FALSE 값을 반환하므로 반드시 이 함수의 결과값이 TRUE 인지 검사한 다음에 다음단계로 넘어가야 한다.

hWnd는 캡쳐 윈도우의 핸들 값으로 설정한다. videoFormat은 설정하고자 하는 비디오 데이터 형식을 나타내는데, 비디오 데이터의 각 프레임에 대한 비트맵 형식을 BITMAPINFO 구조로 기술한다. BITMAPINFO 구조는 다음과 같다.

typedef struct tagBITMAPINFO{

BITMAPINFOHEADER bmiHeader;

RGBQUAD bmiColrs[1];

} BITMAPINFO;

BITMAPINFO는 BITMAPINFOHEADER와 RGBQUAD로 구성되는데, 여기에서는 다음과 같이 정의되는 BITMAPINFOHEADER 구조체의 값만 사용하면 된다.


pBmiInfo->bmiHeader.biSize = 40; //BITMAPINFOHEADER 구조체의 크기

pBmiInfo->bmiHeader.biHeight = 480;//영상의 가로크기

pBmiInfo->bmiHeader.biWidth = 640;//영상의 세로크기(양수:좌측 하단이 원점

                                                     음수:좌측 상단이 원점)

pBmiInfo->bmiHeader.biPlanes = 1;//목표 장치의 플레인 수(1로 설정해야함)

pBmiInfo->bmiHeader.biBitCount = (short) 24;//각 픽셀의 비트수

pBmiInfo->bmiHeader.biCompression = 0;//압축 방법(bi_rgb 또는 0:무압축 비트맵)

pBmiInfo->bmiHeader.biSizeImage =0;//비트맵 영상 크기(무압축인 경우 0으로 설정)

pBmiInfo->bmiHeader.biClrImportant = 0;// 비트맵 디스플레이에 사용되는 컬러수

pBmiInfo->bmiHeader.biClrUsed = 0;// 사용된 컬러의 수

pBmiInfo->bmiHeader.biXPelsPerMeter = 10000;//수평 해상도 (미터당 픽셀수)

pBmiInfo->bmiHeader.biYPelsPerMeter = 10000;//수직 해상도 (미터당 픽셀 수)

}BITMAPINFOHEADER;

비디오 캡쳐를 위해서는 다음과 같이 BITMAPINFOHEADER 구조체에서 biSize,biWidth, biHeight, biPlanes, biBitCount 값을 설정하고 나머지 값을은 0으로 설정하면된다.


BITMAPINFO bmi;

memset(&bmi.bmiHeader, 0, sizeof(bmiHeader));

pBmiInfo->bmiHeader.biSize = sizeof(bmi.bmiHeader);

pBmiInfo->bmiHeader.biWidth = 640;//영상의 세로크기(양수:좌측 하단이 원점

pBmiInfo->bmiHeader.biHeight = 480;//영상의 가로크기

pBmiInfo->bmiHeader.biPlanes = 1;//목표 장치의 플레인 수(1로 설정해야함)

pBmiInfo->bmiHeader.biBitCount =  24;//각 픽셀의 비트수


capDriverDisconnect()함수;

capDriverDisconnect(hWnd);

이 함수는 carDriverConnect() 함수에 의하여 연결한 캡쳐 윈도우와 캡쳐 장치를 분리하는 함수이다. hWnd에는 분리하고자 하는 캡쳐 윈도우의 핸들 값을 설정한다.


capSetCallbackOnFrame()함수

BOOL capSetCallbackOnFrame(hWnd, func);

VFW 라이브러리에서는 캡쳐된 비디오 프레임을 화면에 보여주는 작업을 callback함수를 사용해서 처리하도록 하고 있다. capSetCallbackOnFrame()함수는 캡쳐 장치로부터 비디오 프레임이 캡쳐되었을때에 이를 화면에 보여주기 위해서 호출되는 callback 함수를 설정한다. hWnd는 캡쳐 윈도우의 핸들 값으로 설정하고 func는 호출될 함수 이름으로 설정한다.  


arrow 트랙백 | 댓글



[PREV] [1] [NEXT]
관리자  |   글쓰기
BLOG main image
- 블로그를 처음 만들면서
분류 전체보기 (142)
기술동향 뉴스 (51)
신조어 사전 (1)
기술용어집 (5)
영상처리 기술 (29)
IT 사용정보 (7)
프로그램 기술 (23)
학술정보 (1)
생활정보 (9)
낙서장 (13)
나의 이야기 (0)
About Me (0)
Total :
Today :
Yesterday :
rss
위치로그 : 태그 : 방명록 : 관리자
multimedia's Blog is powered by Daum / Designed by plyfly.net