【问题标题】:C# capturing image from webcamC# 从网络摄像头捕获图像
【发布时间】:2013-01-18 15:06:36
【问题描述】:

过去两天我一直在寻找一种使用 C# 从网络摄像头捕获图像的方法。我是 C# 的新手,我不想使用外部第三方库,所以我找到了两种不错的方法,但似乎都返回几乎相同的错误。我无法让其中任何一个工作,所以如果你能帮助我让其中一个运行或帮助我找到替代方案,那就太好了。

所以我发现的第一种方法是使用 Windows WIA。我找到了以下代码:

CommonDialogClass dialog = new CommonDialogClass();
Device camera = dialog.ShowSelectDevice(WiaDeviceType.CameraDeviceType, true, false);
        // take the photo 
Item item = camera.ExecuteCommand(CommandID.wiaCommandTakePicture);
ImageFile image = (ImageFile)item.Transfer(FormatID.wiaFormatJPEG);
        // filename and saving 
image.SaveFile("Test.jpg");

这段代码似乎正是我正在寻找的,但我无法让它运行,因为我在第二行收到以下错误:

Exception from HRESULT: 0x80210015

我发现的第二种方法是使用带有以下示例的 Avicap32.dll:

http://www.timvw.be/wp-content/code/csharp/testavicap32.zip

但我正在使用此代码:

Image image = ((CaptureDevice)cboDevices.SelectedItem).Capture();
image.Save(@"c:\capture.png", ImageFormat.Png);

以下异常: 空引用异常: 对象引用未设置为对象的实例。

我认为这两种解决方案都导致了问题,因为它们找不到我的相机,但我可以在 Skype 中使用我的相机而没有任何问题。

【问题讨论】:

    标签: c# image file webcam capture


    【解决方案1】:

    我尝试了多种方法,对我来说最简单的方法是 Emgu.cv(nuget package)。

            VideoCapture capture = new VideoCapture(); //create a camera capture
            Bitmap image = capture.QueryFrame().Bitmap; //take a picture
    

    就是这样 (从 API 版本 3.3.0 开始)

    旧 API 方法

            Capture capture = new Capture(); //create a camera captue
            Bitmap image = capture.QueryFrame().Bitmap; //take a picture
    

    【讨论】:

    • 试过了,但现在应该是 VideoCapture 而不是 Capture。
    • 我同意,说实话这个问题的标题应该重组得更具体。问题的主体要求采用没有 3rd 方库的方法。但这个问题是唯一与 c# 网络摄像头图像捕获有关的问题。
    • @Termatinator 此时它只是一个位图,因此您可以将其视为任何图像。这是一个如何做的链接。 stackoverflow.com/questions/12909905/saving-image-to-file
    • 别忘了配置 capture 和 image。
    • 同时获取包 Emgu.CV.Bitmap 并使用 capture.QueryFrame().ToBitmap;
    【解决方案2】:
    • WIA 用于静止图像,它是一种“用于扫描仪的 API”; 0x80210015WIA_S_NO_DEVICE_AVAILABLE
    • AVICAP32 API 名称是“Video for Windows”,它确实已被弃用且已过时,它可能会奏效(兼容性仍然存在),但很有可能它将无处可去

    与网络摄像头配合使用的 API 是:

    • 直接显示
    • 媒体基金会

    两者都是本机 API,您可能很难直接从 C# 代码接口它们,但是使用 DirectShow.NET(尤其是)和 Media Foundation.NET,您有托管代码的包装器。您可以在此处找到有关使用 DirectShow.NET 的更多信息:

    【讨论】:

    • 答案来自 2-3 年前。从那以后,核心库有进步吗?
    • @AnonymousType 这个答案已经有效了大约 10 年,如果不是更长的话,那就是这已经非常稳定了。最近的更新大多与 UWP 开发有关:Windows.Media.Capture 和朋友们。这些新东西主要是对提到的媒体基础的更高级别的包装,并带有与 UWP 世界的接口。 Capture photos and video with the Windows built-in camera UI
    • 谢谢@Roman R。我读到了。最终选择了 OpenCV
    【解决方案3】:

    我推荐Aforge.net framework

    它能够实现示例项目中使用的videoCaptureDevice classSnapshot Maker example,以快速创建图像捕获对话框。它比 DirectShow Library-How to capture image using directshow library without showing the webcam live images on the PictureBox or Panel 但它很稳定,并且是从支持的设备设置视频和图像分辨率的简单方法。

    我遇到的唯一问题是 VideoCaptureDevice.SimulateTrigger() 使用 bacjground 线程从视频源创建图像并在事件中返回图像。如果将返回的图像放在 UI 线程上的 winform 控件上,需要委托方法以防止跨线程问题。

    从 Aforge.net 源代码SVN link 获取 Snapshot Maker 项目的源代码。

    【讨论】:

    • 我也成功使用了它们,但是它们在静止图像上的可比性似乎相当低,我只在 7 台经过测试的相机中运行了 2 台,我的猜测是现代相机不会打扰单独的抓图功能,随便抓个视频帧,aforge好几年没更新了
    猜你喜欢
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    相关资源
    最近更新 更多