【问题标题】:Webcam usage in C#C# 中的网络摄像头使用
【发布时间】:2010-09-19 00:10:28
【问题描述】:

我正在用 C# 编写一个程序来连接网络摄像头并使用它进行一些图像处理。 我有一个使用 win32 api (avicap32.dll) 连接到网络摄像头并向其发送消息以将其发送到剪贴板的工作应用程序。问题是,虽然可以从绘画中访问,但从程序中读取它会导致空指针。

这是我用来连接网络摄像头的代码:

mCapHwnd = capCreateCaptureWindowA("WebCap", 0, 0, 0, 320, 240, 1024, 0);

SendMessage(mCapHwnd, WM_CAP_CONNECT, 0, 0);
SendMessage(mCapHwnd, WM_CAP_SET_PREVIEW, 0, 0);

这就是我用来将图像复制到剪贴板的方法:

SendMessage(mCapHwnd, WM_CAP_GET_FRAME, 0, 0);

SendMessage(mCapHwnd, WM_CAP_COPY, 0, 0);
tempObj = Clipboard.GetDataObject();
tempImg = (System.Drawing.Bitmap)tempObj.GetData(System.Windows.Forms.DataFormats.Bitmap);

我已经从代码中删除了一些错误检查以使其更短。

提前致谢:)

【问题讨论】:

    标签: c# clipboard webcam


    【解决方案1】:

    我最近开始在这个领域做一些业余爱好。

    我们决定使用 OpenCV 库和 opencvdotnet 包装器。它支持从网络摄像头捕获帧:

    using (var cv = new OpenCVDotNet.CVCapture(0))
    {
        var image = cv.CreateCompatibleImage();
        // ...
        cv.Release();
    }
    

    如果您要进行图像处理,OpenCV 的图像处理算法已封装在 OpenCVDotNet.Algs 程序集中。

    如果您决定走这条路,请务必安装 OpenCV 1.0 版(如果您使用的是 64 位 Vista,请将其安装到“c:\program files\opencv”,或者“mklink OpenCV 'c:\program files (x86)\OpenCV`" 从正确的目录,否则 opencvdotnet 将无法安装)。

    【讨论】:

    • 谢谢!我走了这条路,在诅咒微软一些神秘错误之后,我安装了 Visual C++ 2005 Express,现在它工作得很好:) 为什么可再发行包不起作用是任何人的猜测......
    • OpenCV.NET 不再被积极维护,如果你对 OpenCV.NET 不满意,请尝试 Emgu CV
    【解决方案2】:

    实际上有两种方法可以将相机数据导入您的应用程序,DirectShow 和 WIA。 Microsoft 建议您使用WIA,WIA 的界面相当简单,可以让您大开眼界。我根据不久前的工作创建并发布了一个开源 WIA desktop library

    现在,在某些情况下,WIA 的问题在于它过于简单。例如,如果您想调整相机属性(如帧速率、分辨率等),那么 WIA 就会失败。 Microsoft 弃用了 DirectShow,但他们确实没有给我们任何具有其所有功能的替代品,而且我发现它在所有现有平台上继续正常工作(它非常根深蒂固,所以我无法想象支持会消失很快)。

    有一个很好的DirectShow library over at SourceForge。唯一的“问题”是它非常复杂,这源于 DShow 一开始就非常复杂和令人困惑的事实。包装器可以做很多不容易解决的事情,但它们确实为许多常见用例提供了示例,例如显示视频或捕获帧。如果您想添加叠加层或插入其他过滤器,它可以做到,但请注意,这并不简单。

    【讨论】:

    • 实际上,DirectShow 现在是 Windows Vista 和 7 的首选方式,而且它还远未弃用,最新的 Windows 版本中仍在添加新功能。
    【解决方案3】:

    看看这篇文章: http://www.codeproject.com/KB/miscctrl/webcam_c_sharp.aspx

    这比安装和使用 OpenCVNetWrapper 简单多了。

    【讨论】:

      【解决方案4】:

      您是否尝试过 Clipboard.GetImage()?您还可以尝试各种 Clipboard.Contains*() 方法来查看数据存储在剪贴板中的格式。

      【讨论】:

      • 我试过了。它还返回 null
      【解决方案5】:

      OpenCV 捕获、EMGU 捕获和我尝试过的所有其他捕获库
      所有人都有相同的问题:您不能以编程方式高于 640x480
      (无需打开windows视频源窗口)。

      我建议使用这个(确实有效):
      https://github.com/ofTheo/videoInput

      【讨论】:

        【解决方案6】:

        How to get web cam images in C#? 中也有人问过这个问题,您可能会发现以下内容很有用(对于垃圾邮件很抱歉,但这确实有助于回答问题):

        我刚刚发布了我的 Windows 应用程序 CamTimer 的完整源代码(用 .NET/C# 编写)。在https://github.com/johanssonrobotics/CamTimerhttps://github.com/johanssonrobotics/CamTimer下载/查看完整代码(带有工作网络摄像头示例)

        编码愉快!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-01
          • 2011-02-10
          相关资源
          最近更新 更多