一、调用摄像头的基本概念
在使用C#调用摄像头时需要使用到的主要类是Camera
类和VideoCapture
类。Camera
类是一个高级的视频捕获类,支持指定分辨率和桢速,同时还能够实时预览;VideoCapture
类是OpenCV中一个封装了视频捕获设备和视频文件的类,基本上支持大部分的视频捕获需求。
二、调用摄像头的准备工作
在调用摄像头之前,需要进行以下准备工作:
- 安装视频捕获设备的驱动程序,例如常见的USB摄像头和笔记本自带的摄像头都需要进行安装驱动程序;
- 安装OpenCV库,在C#中使用OpenCV调用摄像头需要将OpenCV库配置到项目中;
- 设置项目的引用,在Visual Studio中先添加引用,然后再添加以下命名空间:
using OpenCV.Net;
using OpenCV.Net.Native;
using System;
using System.Threading;
using System.Windows.Forms;
三、调用摄像头的具体实现
1、使用Camera
类调用摄像头
使用Camera
类调用摄像头,需要进行以下步骤:
- 设置视频捕获设备的编号。如果只有一个设备,可以设置为0;
- 设置视频分辨率和桢速;
- 初始化
Camera
类; - 在Windows Form的
Paint
事件中设置预览尺寸和位置; - 在Windows Form的
Paint
事件中调用Camera
类的Show
函数即可实现预览。 以下是示例代码:
using OpenCvSharp;
private Camera _cam;
private Thread _thread;
private void Form1_Load(object sender, EventArgs e)
{
_cam = new Camera();
_cam.Device = 0;
_cam.Width = 640;
_cam.Height = 480;
_cam.Fps = 30;
_cam.Start();
_thread = new Thread(() =>
{
while (_cam.IsRunning)
{
var mat = _cam.QueryFrame();
if (mat != null)
{
var bmp = mat.ToBitmap();
Invoke(new Action(() =>
{
pictureBox1.Image = bmp;
pictureBox1.Refresh();
}));
}
Thread.Sleep(10);
}
});
_thread.IsBackground = true;
_thread.Start();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (_cam?.IsRunning ?? false)
{
_cam.Stop();
_thread.Join();
}
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
if (_cam?.IsRunning ?? false)
{
var src = _cam.QueryFrame();
if (src != null)
{
float dx = (float)Width / src.Width;
float dy = (float)Height / src.Height;
e.Graphics.DrawImage(src.ToBitmap(), 0, 0, Width, Height);
}
}
}
2、使用VideoCapture
类调用摄像头
使用VideoCapture
类调用摄像头,可以调用参数为设备编号的构造函数,也可以调用参数为文件路径的构造函数。以下是示例代码:
using OpenCvSharp;
var cap = new VideoCapture(0);
if (!cap.IsOpened())
{
MessageBox.Show("摄像头打开失败!");
return;
}
Mat frame = new Mat();
while (true)
{
cap.Read(frame);
if (frame.Empty()) break;
Cv2.ImShow("Camera", frame);
Cv2.WaitKey(1);
}
cap.Release();
Cv2.DestroyAllWindows();
四、小结
C#调用摄像头的方式有很多种,使用Camera
类和VideoCapture
类都可以轻松实现。但在实际应用中需要根据自己的需求选择合适的方式并调整相应的参数。