如何使用鼠标在视频流上的未填充框上绘制

时间:2010-06-25 03:40:51

标签: c# mouse video-streaming directshow.net

我正在使用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文档。

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

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

非常感谢 Tlna

1 个答案:

答案 0 :(得分:1)

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

m_Bitmap = new Image(fileName);

到此:

m_Bitmap = new Bitmap(fileName);

让它发挥作用。

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

但是,为了使您的绘制框显示在正在运行的视频的顶部,您的代码需要在DirectShow绘制视频的每个帧之后立即绘制矩形;否则,下一帧将删除你的矩形。 DirectShow对象可能有一些你可以处理的帧渲染事件,然后在事件处理程序中你只需要重新绘制你的盒子(根据初始和当前鼠标坐标,你可以从MouseDown和MouseMove事件得到什么控制你正在使用。)

更新:我刚看了一下我在使用DirectShow.NET时的代码,看起来有一个事件(DsEvCode.Repaint)可以挂钩进入并用于绘制你的盒子。

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

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

据推测,在渲染视频的每一帧之后会触发此事件,因此如果您每次在此处重新绘制框,就好像该框是持久的一样。