用C#写一个调用电脑摄像头的程序
以下是一个简单的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.Video和AForge.Video.DirectShow命名空间中的类,可以通过NuGet包管理器或手动下载添加到项目中。CaptureDevice类提供了StartPreview和StopPreview方法用于开始和停止摄像头预览,以及NewFrame事件用于获取每一帧视频画面。在StartPreview方法中,它启动了一个后台任务用于不断获取视频帧并触发NewFrame事件。如果需要调整视频帧大小,可以在FrameSize属性中设置。在Dispose方法中,它释放了摄像头设备和后台任务的资源。
以上代码只是一个简单的示例,可以根据需要进行修改和优化
原文地址: https://www.cveoy.top/t/topic/hwKB 著作权归作者所有。请勿转载和采集!