要在 C# 中调用摄像头并截图,可以使用 DirectShow 库。下面是一个简单的示例代码:

using System;
using System.Drawing;
using System.Windows.Forms;
using DirectShowLib;

namespace WebcamCapture
{
    public partial class MainForm : Form
    {
        private DsDevice[] _webcamDevices;
        private IFilterGraph2 _filterGraph;
        private ISampleGrabber _sampleGrabber;

        public MainForm()
        {
            InitializeComponent();
        }

        private void MainForm_Load(object sender, EventArgs e)
        {
            // 获取所有视频输入设备
            _webcamDevices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);

            // 初始化 Filter Graph 和 Sample Grabber
            _filterGraph = new FilterGraph() as IFilterGraph2;
            _sampleGrabber = new SampleGrabber() as ISampleGrabber;

            // 添加视频输入设备到 Filter Graph
            var sourceFilter = CreateFilter(_webcamDevices[0]);
            _filterGraph.AddFilter(sourceFilter, 'Webcam');

            // 添加 Sample Grabber 到 Filter Graph
            var sampleGrabberFilter = (IBaseFilter)_sampleGrabber;
            _filterGraph.AddFilter(sampleGrabberFilter, 'Sample Grabber');

            // 连接视频输入设备和 Sample Grabber
            var sourcePin = GetPin(sourceFilter, PinDirection.Output);
            var grabberPin = GetPin(sampleGrabberFilter, PinDirection.Input);
            _filterGraph.Connect(sourcePin, grabberPin);

            // 设置 Sample Grabber 的回调函数
            _sampleGrabber.SetCallback(new SampleGrabberCallback());

            // 开始捕获视频
            var mediaControl = (IMediaControl)_filterGraph;
            mediaControl.Run();
        }

        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            // 停止捕获视频
            var mediaControl = (IMediaControl)_filterGraph;
            mediaControl.Stop();

            // 释放资源
            _sampleGrabber.SetCallback(null);
            _sampleGrabber = null;
            _filterGraph = null;
        }

        private IBaseFilter CreateFilter(DsDevice device)
        {
            object filterObject = null;
            Guid videoInputDeviceGuid = typeof(IBaseFilter).GUID;
            device.Mon.BindToObject(null, null, ref videoInputDeviceGuid, out filterObject);
            return (IBaseFilter)filterObject;
        }

        private IPin GetPin(IBaseFilter filter, PinDirection direction)
        {
            IEnumPins enumPins;
            filter.EnumPins(out enumPins);

            IPin[] pins = new IPin[1];
            IntPtr fetched = IntPtr.Zero;
            while (enumPins.Next(1, pins, fetched) == 0)
            {
                PinDirection pinDirection;
                pins[0].QueryDirection(out pinDirection);
                if (pinDirection == direction)
                {
                    return pins[0];
                }
            }

            return null;
        }

        private class SampleGrabberCallback : ISampleGrabberCB
        {
            public int BufferCB(double sampleTime, IntPtr buffer, int bufferLen)
            {
                // 这里可以处理图像数据,例如保存到文件
                var bitmap = new Bitmap(640, 480, bufferLen, System.Drawing.Imaging.PixelFormat.Format24bppRgb, buffer);
                bitmap.Save('screenshot.jpg');

                return 0;
            }

            public int SampleCB(double sampleTime, IMediaSample sample)
            {
                return 0;
            }
        }
    }
}

这个示例代码使用 DirectShow 库来调用摄像头并捕获视频帧。在 MainForm_Load 方法中,它获取所有视频输入设备,然后创建 Filter Graph 和 Sample Grabber,并将视频输入设备和 Sample Grabber 连接在一起。在 SampleGrabberCallbackBufferCB 方法中,它将图像数据保存到文件。

请注意,你需要在项目中引用 DirectShow 库(DirectShowLib)。你可以使用 NuGet 包管理器来安装 DirectShowLib。

C# 使用 DirectShow 库调用摄像头并截图

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

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