以下是一个简单的C#程序,可以调用电脑摄像头:

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

namespace CameraApp
{
    public partial class Form1 : Form
    {
        private CaptureDevice captureDevice;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // 初始化摄像头设备
            captureDevice = new CaptureDevice();
            captureDevice.FrameSize = new Size(320, 240);
            captureDevice.NewFrame += CaptureDevice_NewFrame;

            // 开始预览
            captureDevice.StartPreview();
        }

        private void CaptureDevice_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            // 显示预览画面
            pictureBox1.Image = eventArgs.Frame;
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            // 停止预览并释放资源
            captureDevice.StopPreview();
            captureDevice.Dispose();
        }
    }
}

该程序使用了一个名为CaptureDevice的自定义类,用于调用摄像头设备,并在窗体上显示摄像头预览画面。以下是CaptureDevice类的代码:

using System;
using System.Drawing;
using System.Threading.Tasks;
using AForge.Video;
using AForge.Video.DirectShow;

namespace CameraApp
{
    public class CaptureDevice : IDisposable
    {
        private VideoCaptureDevice videoCaptureDevice;
        private Task videoTask;
        private bool isDisposed = false;

        public CaptureDevice()
        {
            // 查找第一个可用的摄像头设备
            FilterInfoCollection videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            if (videoDevices.Count > 0)
            {
                videoCaptureDevice = new VideoCaptureDevice(videoDevices[0].MonikerString);
            }
            else
            {
                throw new Exception("No video capture devices found.");
            }
        }

        public Size FrameSize { get; set; }

        public event EventHandler<NewFrameEventArgs> NewFrame;

        public void StartPreview()
        {
            if (videoTask == null)
            {
                // 开始捕获视频帧
                videoCaptureDevice.NewFrame += VideoCaptureDevice_NewFrame;
                videoCaptureDevice.Start();

                // 启动一个后台任务用于显示预览画面
                videoTask = Task.Run(() =>
                {
                    while (!isDisposed)
                    {
                        if (NewFrame != null)
                        {
                            // 获取当前视频帧并触发NewFrame事件
                            Bitmap frame = videoCaptureDevice?.GetCurrentVideoFrame();
                            if (frame != null)
                            {
                                NewFrame(this, new NewFrameEventArgs(frame));
                                frame.Dispose();
                            }
                        }
                    }
                });
            }
        }

        public void StopPreview()
        {
            if (videoTask != null)
            {
                // 停止捕获视频帧
                videoCaptureDevice.SignalToStop();
                videoCaptureDevice.WaitForStop();

                // 停止后台任务
                isDisposed = true;
                videoTask.Wait();
                videoTask = null;
            }
        }

        private void VideoCaptureDevice_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            // 设置视频帧大小
            if (FrameSize != Size.Empty && eventArgs.Frame.Size != FrameSize)
            {
                eventArgs.Frame = new Bitmap(eventArgs.Frame, FrameSize);
            }
        }

        public void Dispose()
        {
            if (!isDisposed)
            {
                StopPreview();

                videoCaptureDevice?.Dispose();
                videoCaptureDevice = null;

                isDisposed = true;
            }
        }
    }
}

该类使用了AForge.VideoAForge.Video.DirectShow命名空间中的类,可以通过NuGet包管理器或手动下载添加到项目中。CaptureDevice类提供了StartPreviewStopPreview方法用于开始和停止摄像头预览,以及NewFrame事件用于获取每一帧视频画面。在StartPreview方法中,它启动了一个后台任务用于不断获取视频帧并触发NewFrame事件。如果需要调整视频帧大小,可以在FrameSize属性中设置。在Dispose方法中,它释放了摄像头设备和后台任务的资源。

以上代码只是一个简单的示例,可以根据需要进行修改和优化

用C#写一个调用电脑摄像头的程序

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

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