2

我正在使用 dshownet(第一次)和 C#。我有一个样本来获取网络摄像头输入并将其显示在表单上。我现在需要使用鼠标在视频流顶部绘制一个矩形。(目的是从那里开始跟踪盒子里的东西)。

听说有一种东西叫VMR。所以我去了 dshownet 样本并浏览了它们。我没有找到任何使用鼠标在视频流上叠加形状的示例。这里有人建议使用colorkey。另一个人说要使用 GDI+ 和鼠标处理。我试图编译 DXLogo 示例,但收到此错误:


错误 1 ​​无法创建抽象类或接口“System.Drawing.Image”的实例 C:\Documents and Settings\TLNA\Desktop\Final Year Project\Libraries\DirectShow library 2\DirectShowSamples-2010-February\Samples\Capture\ DxLogo\Capture.cs 128 32 DxLogo-2008


对于代码部分:


   if (fileName.Length > 0)
           {
               m_Bitmap = new Image(fileName); // error happened here

               Rectangle r = new Rectangle(0, 0, m_Bitmap.Width, m_Bitmap.Height);
               m_bmdLogo = m_Bitmap.LockBits(r, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
           }

我知道我必须通过 Bitmap9 接口。但我真的不知道从哪里开始。我应该阅读 Directshow API 文档吗?

顺便说一句,我还有一本书为数字视频和电视编程 Microsoft Directshow。我开始阅读那本书并在几页后停止,因为代码主要是 C++。我应该继续读这本书吗?如何在 C# 中完成某些提到的任务?

关于如何在视频上绘图的任何建议。一些有用的链接(教程)会有所帮助。

非常感谢

4

1 回答 1

1

我不确定为什么 DirectShow 示例无法编译,但您可以更改问题行:

m_Bitmap = new Image(fileName);

对此:

m_Bitmap = new Bitmap(fileName);

并让它工作。

你实际上在这里面临一个相当困难的问题。DirectShow 通过每秒多次(取决于帧速率)将一系列静止帧绘制到设备上下文(如 PictureBox 或 Form,甚至屏幕)来呈现视频。您(作为程序员)也可以(轻松地)将图形直接渲染到相同的设备上下文中。

但是,为了使您绘制的框出现在正在运行的视频之上,您的代码需要在 DirectShow 绘制视频的每一帧之后立即绘制矩形;否则,下一帧将消除您的矩形。DirectShow 对象可能具有某种您可以处理的帧渲染事件,然后在事件处理程序中您只需重新绘制框(基于初始和当前鼠标坐标,您可以从 MouseDown 和 MouseMove 事件中获取任何内容控制你正在绘制)。

更新: 当我在玩 DirectShow.NET 时,我刚刚查看了我的代码,看起来有一个事件 ( DsEvCode.Repaint) 可以挂钩并用来绘制你的框。

我还没有查看您正在使用的代码示例,但是请进行搜索,看看您是否可以OnGraphNotify()在您的代码中找到一个方法,您应该能够添加如下内容:

if (code == DsEvCode.Repaint)
{
    // draw the box here
}

据推测,这个事件是在视频的每一帧渲染后触发的,所以如果你每次在这里重绘你的盒子,它就会看起来好像盒子是持久的。

于 2010-06-25T03:49:17.543 回答