使用directshow代替opencv的vfw的源代码

摄像头显示OpenCV或DirectShow 摄像头显示OpenCV或DirectShow     对于OpenCV和DirectShow应该是没有哪个比哪个强,而是他们各有各的用处,如DirectShow用于视频采集容易些,而OpenCV用于图像处理容易些。我觉得现在通常是两者相结合的,单独使用的话都会有些缺点,可以去OpenCV中文网站上,那里有很多两者结合使用的例子。     为什么用DirectShow?在视频采集方面,Direc 阅读详情

本文提供了使用directshow代替opencv的vfw 的源代码,与转化为iplimage格式的算法.
实验中发现opencv的cvCaptureFromCAM 使用的是vfw,采用消息机制,速度较慢,测试发现fps只有 9-12左右,太慢了.  发现经过使用directshow后速度提升到60帧/s.在opencv group上了解到这是一个普遍问题,也许有人做过转换,却没有完整的例子与代码.在此贴出.对希望提高opencv视频分析速度的有所帮助.

http://hardy.gigcities.com/Directshow_Opencv.rar 下载代码

用法如下:
static ARFrameGrabber frameGrabber;
IplImage ds_frame;
frameGrabber.Init(0, true);
frameGrabber.SetFlippedImage(true);
for(;;)
    {
       IplImage *frame =0;
 frameGrabber.GrabByteFrame();
 BYTE *myBuffer = frameGrabber.GetByteBuffer();

 int width = frameGrabber.GetWidth();
 int height = frameGrabber.GetHeight();  
 int stride  = (width * sizeof( RGBTRIPLE ) + 3) & -4;

 cvInitImageHeader( &ds_frame, cvSize(width, height), 8, 3,IPL_ORIGIN_BL, 4 );
 ds_frame.widthStep = stride;   
 cvSetData( &ds_frame, myBuffer, stride ); 
 frame = &ds_frame;

        /* 视频分析部分 */
     
   }

以下是directshow源文件,加入工程可用.


// ARFrameGrabber.h: interface for the ARFrameGrabber class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_ARFRAMEGRABBER_H__C5553937_4BAB_4FEF_B4A6_1693AB0C99E3__INCLUDED_)
#define AFX_ARFRAMEGRABBER_H__C5553937_4BAB_4FEF_B4A6_1693AB0C99E3__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

//#include <AR/config.h>

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <dshow.h>
//#include <streams.h>
#include <atlbase.h>
#include <qedit.h>

class SmartString
{
public:
 SmartString():str(NULL) {}

 SmartString(char* pStr):str(NULL)
 {
  if (pStr)
  {
   int size = int(strlen(pStr));
   str = new char[size+1];
   strcpy(str, pStr);
  }
 }

 SmartString(SmartString& sStr)
 {
  SetString(sStr.GetBuffer());
 }

 ~SmartString()
 {
  if (str)
   delete[] str;
 }

 SmartString& operator =(char* pStr)
 {
  SetString(pStr);
  return *this;
 }

 SmartString& operator =(SmartString& sStr)
 {
  SetString(sStr.GetBuffer());
  return *this;
 }

 char* GetBuffer() {return str;}

protected:
 void SetString(char *pStr)
 {
  if (str)
   delete[] str;

  if (!pStr)
  {
   str = NULL;
  }
  else
  {
   int size = int(strlen(pStr));
   str = new char[size + 1];
   strcpy(str, pStr);
  }

 }


 char* str;
};

class DeviceInfo
{
public:
 DeviceInfo():next(NULL), deviceId(-1)
 {
 }
 ~DeviceInfo()
 {
  if (next)
   delete next;
 }


 SmartString friendlyName;
 int   deviceId; 
 DeviceInfo* next;
};


class  ARFrameGrabber 
{
public:
 ARFrameGrabber();
 virtual ~ARFrameGrabber();

 void Init(int deviceId, bool displayProperties = true);
 void BindFilter(int deviceId, IBaseFilter **pFilter);
 void GrabFrame(long* size, long** pBuffer);
 void GrabFrame();
 void Grab32BitFrame();
 void GrabByteFrame();
 void SetCrossBar();
 


 long  GetBufferSize() {return bufferSize;}
 long* GetBuffer() {return pBuffer;}
 BYTE* GetByteBuffer() {return pBYTEbuffer;}
 
 void SetFlippedImage(bool flag) {flipImage = flag;}

 void DisplayProperties();
 void EnumDevices(DeviceInfo *head);
    int GetWidth();
    int GetHeight();

VC++、DirectShow与OpenCV结合实现摄像头视频捕捉 控件是Windows应用程序中不可或缺的元素,它们提供了与用户交互的界面。在VC++中使用控件需要创建它们,并将其添加到对话框或窗口中。常用控件包括按钮、编辑框、列表框等。开发者还可以根据需要自定义控件,以提供更丰富的用户界面和更好的用户体验。以上,我们概览了VC++和Windows应用程序开发的基础知识。在后续章节中,我们将深入了解如何利用DirectShow框架进行视频流处理,以及如何结合OpenCV进行计算机视觉应用开发。通过这些技术的综合应用,我们能够构建功能强大的视频处理和分析系统。 阅读详情

相关推荐

使用directshow代替opencv的vfw 的源代码

directshow源文件, 使用directshow代替opencv的vfw 的源代码,与转化为iplimage格式的算法。

【论文分享】【Agent】ProAgent: Building Proactive Cooperative Agents with Large Language Models

多智能体系统是由多个智能体组成的集合,这些智能体可以是软件程序、机器人、传感器或其他实体,它们各自具备一定的智能和自主性,并通过交互协作来实现单个智能体难以完成的复杂目标。

nanxun___的博客 1121

Abel逆变换及其求解方法

Abel逆变换常应用在轴对称的、光学薄的火焰、羽流或等离子体重建。

weixin_49783507的博客 8365

Mplus—随机截距交叉滞后模型(RI-CLPM)语法

随机截距交叉滞后模型RI-CLPM的Mplus语法。

m0_54401011的博客 2527

Codex登录要手机验证码?Cockpit Tools跳过验证保姆级教程

摘要:OpenAI升级风控后,Codex登录需手机验证,增加批量账号使用成本。CockpitTools(GitHub 8.3k star)可绕过验证,支持多AI编程平台账号管理。操作步骤:1) 获取ChatGPT网页Session数据;2) 通过转换工具生成CPA格式JSON;3) 导入工具启动Codex。注意:仅适用于未绑定手机号的账号,Session会过期,且需防范数据泄露风险。商业账号通常直接提供认证文件。(150字)

5830

【系统分析师】第6章-基础知识:企业信息化(核心总结)

企业信息化是数字化转型的核心,涵盖战略规划、技术应用和实施路径等方面。关键内容包括ERP、CRM、SCM等系统的定义与实施,以及数据仓库、商业智能等技术的应用。备考系统分析师需掌握信息化战略规划方法(如BSP、SDP)、系统建模工具,并能分析解决信息孤岛等问题。论文可围绕ERP实施、数据仓库应用等主题展开。企业信息化面临组织变革、技术选型等挑战,但能显著提升运营效率和竞争力。

数据知道的博客 6931

小卫星多普勒频偏MATLAB代码

多普勒频偏是由于发射机和接收机之间的相对运动而引起的频率变化。对于小卫星,由于其速度和高度的变化,多普勒频偏会变得更加明显。本文将探讨小卫星多普勒频偏的原理、影响因素以及补偿方法。多普勒频偏的原理当发射机和接收机之间存在相对运动时,接收到的信号频率会发生变化。这种频率变化称为多普勒频偏。其原理可以描述如下:设发射机和接收机之间的距离为 d,发射信号的频率为 f0,发射机和接收机的相对速度为 v。则接收到的信号频率 f 为:其中 c 为光速。

qq_59747472的博客 243

基于深度学习DNN LSTM网络的光伏发电量预测 完整代码数据 可直接运行

基于深度学习DNN LSTM网络的光伏发电量预测 完整代码数据 可直接运行

2079

《FPGA接口与协议》专栏的说明与导航

《FPGA接口与协议》专栏的说明与导航(建议阅读)。

孤独的单刀 17万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

上一篇: 大津法 OTSU的算法
下一篇: 利用光流法计算人体运动的速度与方向
hardVB
博客等级 码龄26年 257粉丝 58原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值