zoukankan      html  css  js  c++  java
  • DirectShow VS2013 控制台下捕捉摄像头而且显示

    须要lib库文件 strmiids.lib,下载地址:http://download.csdn.net/detail/dopamy_busymonkey/8872687

    放在解决方式中项目的根文件夹中直接使用(也能够放在VS的安装文件夹中的库文件夹中,可是为了方便之后查找。还是放在项目文件夹中)。

    新建控制台项目。加入依赖项 strmiids.lib,在项目的解决方式资源管理器中。项目右键,属性中加入:



    接下来加入cpp文件,源代码例如以下:

    #include "windows.h"  
    #include "TCHAR.h"  
    #include <dshow.h>
    
    LRESULT CALLBACK WindowProc(
    	HWND hwnd,
    	UINT uMsg,
    	WPARAM wParam,
    	LPARAM lParam
    	);
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	IGraphBuilder *pGraph = NULL;
    	ICaptureGraphBuilder2 *pBuilder = NULL;
    	ICreateDevEnum *pSysDevEnum;
    	IEnumMoniker *pEnumCat;
    	IBaseFilter *pBaseFilter;
    	IMoniker *pMoniker;
    	IVideoWindow *pWindow;
    	IMediaControl *pControl = NULL;
    	IMediaEvent   *pEvent = NULL;
    	HRESULT hr = CoInitialize(NULL);
    	long pWidth;
    	long pHeight;
    
    	HINSTANCE hInstance;
    	hInstance = GetModuleHandle(NULL);
    	WNDCLASS Draw;
    	Draw.cbClsExtra = 0;
    	Draw.cbWndExtra = 0;
    	Draw.hCursor = LoadCursor(hInstance, IDC_ARROW);;
    	Draw.hIcon = LoadIcon(hInstance, IDI_APPLICATION);;
    	Draw.lpszMenuName = NULL;
    	Draw.style = CS_HREDRAW | CS_VREDRAW;
    	Draw.hbrBackground = (HBRUSH)COLOR_WINDOW;
    	Draw.lpfnWndProc = WindowProc;
    	Draw.lpszClassName = _T("DDraw");
    	Draw.hInstance = hInstance;
    
    
    	RegisterClass(&Draw);
    
    	HWND hwnd = CreateWindow(
    		_T("DDraw"),           //上面注冊的类名,要全然一致    
    		L"绘制",  //窗体标题文字    
    		WS_OVERLAPPEDWINDOW, //窗体外观样式    
    		38,             //窗体相对于父级的X坐标    
    		20,             //窗体相对于父级的Y坐标    
    		480,                //窗体的宽度    
    		250,                //窗体的高度    
    		NULL,               //没有父窗体,为NULL    
    		NULL,               //没有菜单,为NULL    
    		hInstance,          //当前应用程序的实例句柄    
    		NULL);              //没有附加数据,为NULL    
    
    	// 显示窗体    
    	ShowWindow(hwnd, SW_SHOW);
    
    	// 更新窗体    
    	UpdateWindow(hwnd);
    
    	if (FAILED(hr))
    	{
    		printf("ERROR - Could not initialize COM library");
    		return -1;
    	}
    
    	hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL,
    		CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void**)&pBuilder);
    
    	if (SUCCEEDED(hr))
    	{
    		hr = CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&pGraph);
    		if (SUCCEEDED(hr))
    		{
    			hr = pBuilder->SetFiltergraph(pGraph);
    		}
    	}
    
    
    	hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
    		IID_ICreateDevEnum, reinterpret_cast<void **>(&pSysDevEnum));
    	hr = pSysDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnumCat, 0);
    
    
    	if (pEnumCat->Next(1, &pMoniker, NULL) == S_OK)
    	{
    		hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pBaseFilter);
    		if (SUCCEEDED(hr))
    		{
    			hr = pGraph->AddFilter(pBaseFilter, L"Capture Filter");
    			hr = pBuilder->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pBaseFilter, NULL, NULL);
    			hr = pGraph->QueryInterface(IID_IVideoWindow, (void**)&pWindow);
    			hr = pGraph->QueryInterface(IID_IMediaControl, (void**)&pControl);
    			pControl->Run();
    			pWindow->put_Owner((OAHWND)hwnd);
    			pWindow->put_WindowStyle(WS_CHILD);
    			pWindow->get_Width(&pWidth);
    			pWindow->get_Height(&pHeight);
    			pWindow->SetWindowPosition(0, 0, pWidth, pHeight);
    		}
    	}
    
    
    	// 消息循环    
    	MSG msg;
    	while (GetMessage(&msg, NULL, 0, 0))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    
    	pMoniker->Release();
    	pControl->Release();
    	pGraph->Release();
    	CoUninitialize();
    }
    
    // 消息处理函数的实现  
    LRESULT CALLBACK WindowProc(
    	_In_  HWND hwnd,
    	_In_  UINT uMsg,
    	_In_  WPARAM wParam,
    	_In_  LPARAM lParam
    	)
    {
    	switch (uMsg)
    	{
    	case WM_DESTROY:
    	{
    					   PostQuitMessage(0);
    					   return 0;
    	}
    	}
    	return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }


  • 相关阅读:
    vue--常用指令
    vue--npm的使用
    DRF--认证和权限
    DRF--路由组件和版本控制
    nginx--代理和负载均衡
    DRF--重写views
    DRF--ModelSerializer和时间格式化
    DRF--验证器
    DRF--序列化
    DRF--介绍和安装
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5304587.html
Copyright © 2011-2022 走看看