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);
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-18 06:56:52

DirectShow VS2013 控制台下捕捉摄像头并且显示的相关文章

Directshow中的视频捕捉(转)感觉这个非常全,但真的不知道出处了...

本篇文档主要描述关于用Directshow进行视频开发的一些技术主要包括下面内容 1关于视频捕捉(About Video Capture in Dshow) 2选择一个视频捕捉设备(Select capture device) 3预览视频(Previewing Video) 4如何捕捉视频流并保存到文件(Capture video to File) 5将设备从系统中移走时的事件通知(Device remove Notify) 6如何控制Capture Graph(Controlling Capt

C# 基于Directshow.Net lib库 USB摄像头使用DirectShow.NET获取摄像头视频流

https://blog.csdn.net/u010118312/article/details/91766787 https://download.csdn.net/download/u010118312/11238555 https://github.com/wanglong/DirectShow.NET-Webcam-Barcode-Reader 开源社区提供了DirectShow的.NET版本,为C#开发者提供了便利.这里分享下如何用DirectShow.NET API来启动摄像头,以及

windows 控制台下运行cl命令

前提:确保已经安装vc6或者vs系列 我们可以再命令行直接编译c++程序 在windows操作系统中,打开命令行,输入cl,若系统提示 'cl' 不是内部或外部命令,也不是可运行的程序或批处理文件. 则说明VS没有安装或者环境变量设置不正确,可以按照如下步骤设置:1. 确保已经安装VS,并在控制台 中键入set    检查是否有类似如下格式的环境变量VSXXCOMNTOOLS VS90COMNTOOLS=D:\Program Files\Microsoft Visual Studio 9.0\C

在OSSIM控制台下退到了$提示符下没有权限怎么办?

在OSSIM控制台下退到了 $ 提示符下没有权限怎么办? 首次进入控制台输入root密码 进入到系统配置菜单 如果选"Exit"退出菜单,则进入到$提示符下,可用的命令有限.sudo也用不了. 这如何怎么解决? 方法: $exit 在菜单中选择 (3) Jailbreak System 操作视频: http://edu.51cto.com/lesson/id-93553.html

asp.net mvc后台操作之读写xml控制首页动态页面开关显示

一.背景 在asp.net mvc项目里,用户需要开拓几个活动版面,并以侧栏的方式呈现在首页右侧,几个活动时间不一致,为避免浏览者在活动未开放之时进入未开放的服务页面.因此不仅需要在活动代码中加入限制功能,也需要在前台取消不合时宜的页面的展示.后台效果图: 二.问题分析 要想控制页面开关显示,就得有存储开关信息的介质,将在后台产生的操作记录下来,并在浏览者加载首页之时能读取操作记录并达到控制页面开关的目的.因此,考虑两种介质储存开关记录信息,一是用数据库mysql,二是用xml.考虑到这对数据库

Java Lab(1)控制台下的人物PK

一.前言 有这样一个念头很久了,从最早对编程感兴趣就是因为想实现一个类似于街霸.拳皇之类的程序.一路走过来,发现作为一个主业和编程毫无关系的人想学编程,真的是很费心很吃力,而在应用无比泛滥的今天,对于一个非编程工作的人,对我自己,在学习过程中也难免因为一个目标的难以实现而转去另外一个目标,更致命的是转换另外一种方法,另外一种学习语言.有限的时间,有限的精力,不断增长的年龄,都让自己觉得离每一次的目标越来越远.我很清楚自己的缺点:懒于坚持.这点很难改善,需要时间加之以形成习惯.从目标来说,更理想的

eclipse控制台下实现jdbc简单的增删改查测试

1.现在MySQL中创建一个表 2.首先创建一个类 //导入的包 import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet; public class DBTil { } 3.然后实例化各个对象 1 //username和password是连接数据库的用户名和密码 2 private static String usern

CSS控制段落首字母放大显示

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title>石家庄伸缩门</title><

CSS控制图片缩放或者部分显示

1 <!doctype html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>CSS控制图片缩放或者部分显示</title> 6 </head> 7 8 <body> 9 <!--图片自动缩放显示:通过设置图片宽来实现--> 10 11 12 <!--第一种:设置图片的宽为屏幕宽度的百分比,实现图片跟随屏幕大小自