要在 C# 中使用 DirectShow 调用摄像头并进行截图,可以按照以下步骤进行:

  1. 首先,需要安装 DirectShow 库。可以从 Microsoft 的官方网站上下载并安装 DirectX SDK (https://www.microsoft.com/en-us/download/details.aspx?id=6812)。

  2. 在项目中添加对 DirectShow 的引用。在 Visual Studio 中,右键单击项目,选择“添加引用”,然后选择“COM”选项卡,找到并选择“DirectShowLib”组件。

  3. 创建一个 DirectShow 设备对象并选择摄像头。可以使用 DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice) 方法获取所有可用的视频输入设备列表,并选择其中一个摄像头。

    DsDevice[] videoDevices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);
    if (videoDevices.Length == 0)
    {
        Console.WriteLine('No video input devices found.');
        return;
    }
    
    // 选择第一个摄像头
    DsDevice videoDevice = videoDevices[0];
    
  4. 创建一个 FilterGraph 对象并将设备添加到图形中。

    FilterGraph filterGraph = new FilterGraph();
    IBaseFilter captureFilter = videoDevice.BindToObject(null, null, typeof(IBaseFilter).GUID) as IBaseFilter;
    filterGraph.AddFilter(captureFilter, 'Capture Filter');
    
  5. 创建 SampleGrabber 对象用于捕获图像。

    ISampleGrabber sampleGrabber = new SampleGrabber() as ISampleGrabber;
    filterGraph.AddFilter(sampleGrabber as IBaseFilter, 'Sample Grabber');
    
  6. 配置 SampleGrabber 对象以便捕获图像。

    AMMediaType mediaType = new AMMediaType();
    mediaType.majorType = MediaType.Video;
    mediaType.subType = MediaSubType.RGB24;
    mediaType.formatType = FormatType.VideoInfo;
    sampleGrabber.SetMediaType(mediaType);
    
  7. 连接 FilterGraph 中的滤镜。

    filterGraph.ConnectDirect(GetPin(captureFilter, 'Capture'), GetPin(sampleGrabber as IBaseFilter, 'Input'), null);
    
  8. 启动 FilterGraph。

    IMediaControl mediaControl = filterGraph as IMediaControl;
    mediaControl.Run();
    
  9. 在 SampleGrabber 的回调函数中获取图像数据。

    SampleGrabberCallback callback = new SampleGrabberCallback();
    sampleGrabber.SetCallback(callback, 1);
    
    public class SampleGrabberCallback : ISampleGrabberCB
    {
        public int BufferCB(double SampleTime, IntPtr pBuffer, int BufferLen)
        {
            // 从缓冲区获取图像数据
            byte[] imageData = new byte[BufferLen];
            Marshal.Copy(pBuffer, imageData, 0, BufferLen);
    
            // 保存图像数据为图片
            Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format24bppRgb);
            BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.WriteOnly, bitmap.PixelFormat);
            Marshal.Copy(imageData, 0, bmpData.Scan0, BufferLen);
            bitmap.UnlockBits(bmpData);
            bitmap.Save('screenshot.bmp');
    
            return 0;
        }
    
        // 省略其他接口方法的实现
    }
    
  10. 最后,停止 FilterGraph 并释放资源。

    mediaControl.Stop();
    filterGraph.RemoveAllFilters();
    Marshal.ReleaseComObject(sampleGrabber);
    Marshal.ReleaseComObject(captureFilter);
    Marshal.ReleaseComObject(filterGraph);
    

请注意,以上代码只是一个简单的示例,可能还需要进行一些错误处理和其他的配置。完整的代码示例可以在 DirectShowLib 库的示例项目中找到 (https://github.com/rdp/directshow-net)。

C# 使用 DirectShow 捕获摄像头图像并保存为图片

原文地址: https://www.cveoy.top/t/topic/qqOK 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录