C#标准库本身不带有能调用电脑摄像头的库,如果利用windows自身的API来实现的话,着实有些麻烦。Aforge这个第三方库能很好的实现调用、处理的功能。
PS:文末给大家分享了完整的项目源码,各位最好先下载下来,对照着来看
1、先看一下效果

2、Aforge介绍
AForge.NET是一个专门为开发者和研究者基于C#框架设计的,这个框架提供了不同的类库和关于类库的资源,还有很多应用程序例子,包括计算机视觉与人工智能,图像处理,神经网络,遗传算法,机器学习,机器人等领域。
3、我使用的开发环境
操作系统: win10专业版
.Net framework: 3.5
IDE: vs 2019 WinForm
正式开始啦******************
1、新建winform项目
项目名我命名为 Camera_001,你们随意
2、安装AForge
1)右击项目名:
2)打开“管理NuGet程序包”:

3)按下面的操作进行安装:

同理,依次安装下面的几个包:

稍微注意一下:这几个包的作者都是AForge.Net
3、检查
安装好包之后,会在工具箱发现自动多了一些控件。vs不愧为宇宙最强IDE!

1)首先,
在新添加进来的控件中找到VideoSourcePlayer控件,拖进窗体中,调整好尺寸。命名我就按默认的吧(videoSourcePlayer1),你们随意!
这个控件的作用是:显示从摄像头中获取的图像

在comboBox控件中添加两个项:
摄像头1
摄像头2
两个button控件。把它们的Enabled属性都设置为false,因为一开始没有选择摄像头,不能拍摄更不能保存。
pictureBox用于显示拍摄得到的图片

3)添加using要使用的库
using AForge;
using AForge.Controls;
using AForge.Video;
using AForge.Video.DirectShow;
4)声明下面的变量,先不赋值。
FilterInfoCollection videoDevices;//摄像头设备集合
VideoCaptureDevice videoSource;//捕获设备源
Bitmap img;//处理图片
5)在窗体的Load事件中添加下面的代码
viderDevices变量用于保存电脑中所有的摄像设备
private void Form1_Load(object sender, EventArgs e)
{
//先检测电脑所有的摄像头
videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
MessageBox.Show("检测到了" + videoDevices.Count.ToString() + "个摄像头!");
}
6)选择摄像头
双击comboBox控件,在生成的事件中写下面的代码
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (comboBox1.Text == "摄像头1" && videoDevices.Count > 0)
videoSource = new VideoCaptureDevice(videoDevices[0].MonikerString);
else if (comboBox1.Text == "摄像头2" && videoDevices.Count > 1)
videoSource = new VideoCaptureDevice(videoDevices[1].MonikerString);
else
{
MessageBox.Show("选择的摄像头不存在!!!");
return;
}
videoSourcePlayer1.VideoSource = videoSource;
videoSourcePlayer1.Start();
button1.Enabled = true;//开启“拍摄功能”
}
这个时候可以运行一下噢!!!!运行看一下效果吧。
7)关闭并释放摄像头
到这,会有两个问题:
- 关闭窗口时程序不会停止。这是因为你选择的摄像头并未关闭释放
- 切换到一个不存在的摄像头时,之前的摄像头依然在使用。
所以,在代码的下面编写一个方法(函数):
// 关闭并释放摄像头
public void ShutCamera()
{
if (videoSourcePlayer1.VideoSource != null)
{
videoSourcePlayer1.SignalToStop();
videoSourcePlayer1.WaitForStop();
videoSourcePlayer1.VideoSource = null;
}
}
在窗体的Formclosing事件中调用一次,在comboBox的事件中调用一次
8)开始拍摄
双击button1拍摄按钮,加入下面的代码:
private void button1_Click(object sender, EventArgs e)
{
img = videoSourcePlayer1.GetCurrentVideoFrame();//拍摄
pictureBox1.Image = img;
button2.Enabled = true;//开启“保存”功能
}
运行一下,发现拍摄之后,图片显示的是什么鬼!
不要慌,问题不大。把pictureBox控件的SizeMode属性设置为Zoom,很重要!!!再运行一下看看。
9)保存
双击button2保存按钮,加入下面的代码:
//"保存"按钮click事件
private void button2_Click(object sender, EventArgs e)
{
try
{
//以当前时间为文件名,保存为jpg格式
//图片路径在程序bin目录下的Debug下
TimeSpan tss = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
long a = Convert.ToInt64(tss.TotalMilliseconds) / 1000; //以秒为单位
img.Save(string.Format("{0}.jpg", a.ToString()));
MessageBox.Show("保存成功!");
button2.Enabled = false;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
好了,有问题可以留言哈!!!
大功告成!!!
其实远没有结束,AForge是一个很强大的库,能实现很多功能。比如选择不同的分辨率,实现录像功能等等等等。剩下的就交给各位慢慢探索吧!!!
[附:完整的项目源码下载]
链接:https://pan.baidu.com/s/1BqrJ_hTzG7SgGZOw7P-6aw
提取码:hek6
复制这段内容后打开百度网盘手机App,操作更方便哦–来自百度网盘超级会员V3的分享