问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

CCaptureVideo类是什么类,我的VC中怎么没有啊 :-(

发布网友 发布时间:2022-05-06 04:24

我来回答

1个回答

热心网友 时间:2022-06-29 15:11

Visual C++编程实现摄像头视频捕捉2007-01-25 22:45摘要 :本文主要讲述用Directshow进行视频捕捉(捕捉静态图像)的编程思路,并提供针对摄像头编程的一个视频捕捉类CcaptureVideo和一个示例。

前言

DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起发布。DirectShow为多媒 体流的捕捉和回放提供了强有力的支持。用DirectShow开发应用程序,我们可以很方便地从支持WDM驱动模型的采集卡上捕获数据,并且进行相应的后 期处理乃至存储到文件中。

DirectShow是基于COM的,为了编写DirectShow应用程序,需要了解COM客户程序编写的基础知识。DirectShow提供了大量的接口,但在编程中发现还是不够方便,如果能构建一个视频捕捉类把常用的一些动作封装起来,那么就更方便了。

编程思路

为了更加容易建立视频捕捉应用程序,DirectShow提供了一个叫做Capture Graph Builder的对象,Capture Graph Builder提供IcaptureGraphBuilder2接口,该接口可以建立和控制Capture Graph。

建立视频捕捉程序,必须首先获取并初始化IcaptureGraphBuilder2接口,然后选择一个适当的视频捕捉设备。选择好设备后, 为该设备创建Capture filter,然后调用AddFilter把Capture filter添加到Filter Graph。

如果仅仅希望用摄像头来进行实时监控的话,只需要在上面的基础上调用ICaptureGraphBuilder2::RenderStream就可以了:

ICaptureGraphBuilder2 *pBuild; // Capture Graph Builder
//省略初始化部分代码
IBaseFilter *pCap; // Video capture filter.
//省略初始化和添加到Filter Graph部分代码
pBuild-> RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap, NULL, NULL);
DirectShow提供了一个捕捉静态图像的方法:使用Sample Grabber filter。依次按照以下三个步骤就可以了:

第一步, 定义一个类实现Sample Grabber的回调接口IsampleGrabberCB:

class CSampleGrabberCB : public ISampleGrabberCB
{
//在后面提供的类中具体完成
}
CSampleGrabberCB mCB;
第二步、调用RenderStream依次把Still pin、Sample Grabber和系统默认Renderer Filter连接起来。

第三步、配置Sample Grabber以捕获数据。

视频捕捉类CCaptureVideo的具体实现

// CCaptureVideo视频捕捉类头文件
/////////////////////////////////////////////////////////////////////
#if !defined(AFX_CAPTUREVIDEO_H__F5345AA4_A39F_4B07_B843_3D87C4287AA0__INCLUDED_)
#define AFX_CAPTUREVIDEO_H__F5345AA4_A39F_4B07_B843_3D87C4287AA0__INCLUDED_
/////////////////////////////////////////////////////////////////////
// CaptureVideo.h : header file
/////////////////////////////////////////////////////////////////////
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include
#include
#include
#ifndef SAFE_RELEASE
#define SAFE_RELEASE( x ) \
if ( NULL != x ) \
{ \
x-> Release( ); \
x = NULL; \
}
#endif
class CSampleGrabberCB;
class CCaptureVideo : public CWnd
{
friend class CSampleGrabberCB;
public:
void GrabOneFrame(BOOL bGrab);
HRESULT Init(int iDeviceID,HWND hWnd);
int EnumDevices(HWND hList);
CCaptureVideo();
virtual ~CCaptureVideo();
private:
HWND m_hWnd;
IGraphBuilder *m_pGB;
ICaptureGraphBuilder2* m_pCapture;
IBaseFilter* m_pBF;
IMediaControl* m_pMC;
IVideoWindow* m_pVW;
CComPtr m_pGrabber;
protected:
void FreeMediaType(AM_MEDIA_TYPE& mt);
bool BindFilter(int deviceId, IBaseFilter **pFilter);
void ResizeVideoWindow();
HRESULT SetupVideoWindow();
HRESULT InitCaptureGraphBuilder();
};
#endif // !defined(AFX_CAPTUREVIDEO_H__F5345AA4_A39F_4B07_B843_3D87C4287AA0__INCLUDED_)
//-------------------------------------------------------------------
// CCaptureVideo视频捕捉类实现文件CaptureVideo.cpp
//-------------------------------------------------------------------
// CaptureVideo.cpp: implementation of the CCaptureVideo class.
//
/////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "CaptureVideo.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
BOOL bOneShot=FALSE;//全局变量
class CSampleGrabberCB : public ISampleGrabberCB
{
public:
long lWidth;
long lHeight;
TCHAR m_szFileName[MAX_PATH];// 位图文件名称
CSampleGrabberCB( ){
strcpy(m_szFileName, "c:\\donaldo.bmp");
}
STDMETHODIMP_(ULONG) AddRef() { return 2; }
STDMETHODIMP_(ULONG) Release() { return 1; }
STDMETHODIMP QueryInterface(REFIID riid, void ** ppv){
if( riid == IID_ISampleGrabberCB || riid == IID_IUnknown ){
*ppv = (void *) static_cast 如何使用视频捕捉类CCaptureVideo

构建CCaptureVideo类以后,使用就方便多了,我们在编程中只需要是要下面三个类成员函数就可以实现用摄像头进行视频捕捉:

①int EnumDevices(HWND hList); //hList是下拉列表框的句柄,本函数用于枚举当前系统安装的所有视频捕捉设备

②HRESULT Init(int iDeviceID,HWND hWnd);//iDeviceID是视频捕捉设备序号,hWnd是视频捕捉窗口的句柄

③void GrabOneFrame(BOOL bGrab);//调用GrabOneFrame(true)就可以捕获当前的静态图像并保存到硬盘上

具体示例:用MFC AppWizard(exe)创建一个对话框应用程序,取名为ds,给对话框添加一个下拉列表框(IDC_COMBO1)、两个按钮 (IDC_PHOTO、IDC_HAVEALOOK)和一个Picture控件(ID:IDC_STATIC_SCREEN,Type: Rectangle,Color:Gray)。

1、使用向导添加成员变量

CStatic m_staticScreen; // IDC_STATIC_SCREEN
CComboBox m_ListCtrl; // IDC_COMBO1
CCaptureVideo m_cap;
2、为BOOL CDsDlg::OnInitDialog()添加如下代码:

// TODO: Add extra initialization here
m_cap.EnumDevices (m_ListCtrl);
m_ListCtrl.SetCurSel (0);
3、为确定按钮添加代码如下:

void CDsDlg::OnOK()
{
//只需要四行代码就可以进行视频捕捉了
UpdateData();
HWND hWnd = m_staticScreen.GetSafeHwnd() ;
HRESULT hr = m_cap.Init(m_ListCtrl.GetCurSel (),hWnd);
GetDlgItem(IDOK)-> EnableWindow(FALSE);
}
4、如果希望捕捉静态图像,为照相按钮添加如下代码:

void CDsDlg::OnPhoto()
{
m_cap.GrabOneFrame(true);
}
运行程序时,选定摄像头后只需要按确定就可以了,实际效果如下图所示:

结束语

本文提供的视频捕捉类CcaptureVideo和示例,在Win2K + DirectX9 SDK + VC6 环境下调试通过。注意:编译时需要Strmiids.lib Quartz.lib两个库文件(DirectX9 SDK自带)。

参考资料:http://hi.baidu.com/zhoutianyang/blog/item/1462e150b8b1605c1138c2e5.html

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
蚂蚁泡酒适合哪些人喝 蚂蚁酒的功效与禁忌蚂蚁酒的功效与作用 热血无赖卡怎么办 了解这两方面内容 益生菌孕妇 孕妇能喝益生菌吗 羽毛球双打底线是内线还是外线 为什么泰国两位尊者有不死之身 秦始皇活了多少岁?当了几年皇帝? DELL电脑D630.PP18L2手机。才用了4个多月。多少钱我可以买呢,麻烦谁说... dellpp18l现在买多少钱 求太平间的恶魔全本啊 还有没有好的悬疑小说 非常带劲的推荐! 找一些好看的小说,女频的 怎么查看创业补贴是否通过您好,我是2020年申请的农民工创业补贴,当时名单已经出来了,但是资金不到_百度问一问 《CV大神和小透明》txt下载在线阅读全文,求百度网盘云资源 求《天级神医》全本txt完结小说,谢谢~ 保险丝为什么能保险 就业创业补贴怎么看通过没有 《神级小保安》txt下载在线阅读全文,求百度网盘云资源 保险丝干什么用的 保险丝(熔丝管)熔断时的温度 保险熔丝是属于电力金具一类的吗 保险丝是熔丝吗? 七年级上册英语单词按音标分类 没有绑定QQ的手机号码 怎么改密码 谁能告诉我? 初一英语音标啊 英语书人教版七上音标表(顺序一样 初中译林版英语书上的音标是什么版本的音标? 我的QQ忘记了密保也没有手机绑定怎么样可以改密码。 初一英语音标是什么? 初一上册英语所有音标 privatevarmobileMediavWallpaper2VideosRingtones是什么 求一部很老的欧美电影 有个欧美系列合private的差不多,女的都非常好看,拍的也很精致,名字叫SOLO 什么的 实名认证在哪里看 斗鱼直播上有很多打扮得漂亮的女主播 她们真的打得很好? 做梦梦到我去看妇科病是什么意思? 女主播直播lol 室友乱入抢镜哪个平台 为什么斗鱼女主播的素质比其他直播平台高 梦到性交而妇科病严重有什么意思 梦见死去多年的母亲得了妇科病什么意思? 做梦梦到在添自己的妇科病病例信息都是错的是什么意 没有加工过的蜂蜜有效期是多久呢? 未深加工过的蜂蜜能存放多久 11点山东卫视放的什么电视剧 斯巴达令人瞠目结舌的教子10式 丨“虎妈猫爸”算个啥 南北小年为什么差一天 你看电视会快进吗? 台湾泡菜的做法 虎妈猫爸里的谁是靳东的老婆 台湾泡菜的做法二