- 追加された行はこの色です。
- 削除された行はこの色です。
今回はVFW(Video For Windows)によるウェブカメラキャプチャを行ってみます
当たり前ですがウェブカメラがないと動きません
個人的にはLogicool製が良いと思います
VFWを使うとキャプチャー以外にもAVIなどの動画処理を行うことができます
動画像処理に興味がある人は試してみるといいでしょう
#include <tchar.h>
#include <windows.h>
#include <vfw.h>
#pragma comment(lib,"vfw32.lib")
// ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
if(msg == WM_DESTROY) PostQuitMessage(0);
return (DefWindowProc(hWnd, msg, wParam, lParam));
}
// キャプチャーコールバック関数
LRESULT CALLBACK capVideoStreamCallback(HWND hWnd,LPVIDEOHDR lpVHdr){
// エンターキーでスナップショット
if(GetAsyncKeyState(VK_RETURN))
capFileSaveDIB(hWnd,"capture.bmp");
// キャプチャー画像ピクセルデータ
//lpVHdr->lpData
return TRUE;
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
const TCHAR* WC_BASIC = _T("Basic"); // ウィンドウクラス名
/********************************************/
/* ウィンドウクラスの定義と登録 */
/********************************************/
// シンプルウィンドウクラス設定
WNDCLASSEX wcex ={sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS, WndProc, 0,0,hInstance,
(HICON)LoadImage(NULL,MAKEINTRESOURCE(IDI_APPLICATION),IMAGE_ICON,0,0,LR_DEFAULTSIZE | LR_SHARED),
(HCURSOR)LoadImage(NULL,MAKEINTRESOURCE(IDC_ARROW),IMAGE_CURSOR,0,0,LR_DEFAULTSIZE | LR_SHARED),
(HBRUSH)GetStockObject(WHITE_BRUSH), NULL, WC_BASIC , NULL};
// シンプルウィンドウクラス登録
RegisterClassEx(&wcex);
/********************************************/
/* ウィンドウの作成 */
/********************************************/
HWND hWnd = CreateWindowEx(
0, //拡張ウィンドウスタイル
WC_BASIC, //ウィンドウクラス名
_T("タイトル"), //タイトルバーにこの名前が表示されます
WS_OVERLAPPEDWINDOW | WS_VISIBLE, //ウィンドウスタイル
CW_USEDEFAULT, //X座標
CW_USEDEFAULT, //Y座標
640, //幅
480, //高さ
NULL, //親ウィンドウのハンドル、親を作るときはNULL
NULL, //メニューハンドルorリソースID
hInstance, //インスタンスハンドル
NULL);
// キャプチャーウィンドウ
HWND hWndCap = capCreateCaptureWindow(
_T("Captrue Window"), // キャプチャウィンドウの名前
WS_CHILD | WS_VISIBLE, // ウィンドウスタイル このパラメータについてはここを見てください。
0, 0, // 表示位置
320, 240, // ウィンドウサイズ
hWnd, // 親のハンドル
NULL);
capDriverConnect( hWndCap, 0 ); // チャンネル1に接続
capPreviewRate( hWndCap, 1 ); // プレビューレートの設定 数字が小さいほど速くキャプチャーします。
capPreview( hWndCap, TRUE ); // プレビューモード
// ビデオフォーマット取得
BITMAPINFO bmpinfo;
capGetVideoFormat(hWndCap,&bmpinfo,sizeof(BITMAPINFO));
// キャプチャーするたびに呼ばれる関数登録
capSetCallbackOnFrame(hWndCap,capVideoStreamCallback);
MSG msg={0};
while (GetMessage(&msg,0,0,0)) DispatchMessage(&msg);
capDriverDisconnect (hWndCap);
return 0;
}