C#标准库本身不带有能调用电脑摄像头的库,如果利用windows自身的API来实现的话,着实有些麻烦。Aforge这个第三方库能很好的实现调用、处理的功能。
PS:文末给大家分享了完整的项目源码,各位最好先下载下来,对照着来看
AForge.NET是一个专门为开发者和研究者基于C#框架设计的,这个框架提供了不同的类库和关于类库的资源,还有很多应用程序例子,包括计算机视觉与人工智能,图像处理,神经网络,遗传算法,机器学习,机器人等领域。
操作系统: win10专业版
.Net framework: 3.5
IDE: vs 2019 WinForm
正式开始啦******************
项目名我命名为 Camera_001,你们随意
同理,依次安装下面的几个包:
稍微注意一下:这几个包的作者都是AForge.Net
安装好包之后,会在工具箱发现自动多了一些控件。vs不愧为宇宙最强IDE!
# 4、开始编程!在新添加进来的控件中找到VideoSourcePlayer控件,拖进窗体中,调整好尺寸。命名我就按默认的吧(videoSourcePlayer1),你们随意!
这个控件的作用是:显示从摄像头中获取的图像
#### 2)添加下面的控件在comboBox控件中添加两个项:
摄像头1
摄像头2
两个button控件。把它们的Enabled属性都设置为false,因为一开始没有选择摄像头,不能拍摄更不能保存。
pictureBox用于显示拍摄得到的图片
viderDevices变量用于保存电脑中所有的摄像设备
private void Form1_Load(object sender, EventArgs e) { //先检测电脑所有的摄像头 videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice); MessageBox.Show("检测到了" + videoDevices.Count.ToString() + "个摄像头!"); }双击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;//开启“拍摄功能” }这个时候可以运行一下噢!!!!运行看一下效果吧。
到这,会有两个问题:
关闭窗口时程序不会停止。这是因为你选择的摄像头并未关闭释放切换到一个不存在的摄像头时,之前的摄像头依然在使用。所以,在代码的下面编写一个方法(函数):
// 关闭并释放摄像头 public void ShutCamera() { if (videoSourcePlayer1.VideoSource != null) { videoSourcePlayer1.SignalToStop(); videoSourcePlayer1.WaitForStop(); videoSourcePlayer1.VideoSource = null; } }在窗体的Formclosing事件中调用一次,在comboBox的事件中调用一次
双击button1拍摄按钮,加入下面的代码:
private void button1_Click(object sender, EventArgs e) { img = videoSourcePlayer1.GetCurrentVideoFrame();//拍摄 pictureBox1.Image = img; button2.Enabled = true;//开启“保存”功能 }运行一下,发现拍摄之后,图片显示的是什么鬼!
不要慌,问题不大。把pictureBox控件的SizeMode属性设置为Zoom,很重要!!!再运行一下看看。
双击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是一个很强大的库,能实现很多功能。比如选择不同的分辨率,实现录像功能等等等等。剩下的就交给各位慢慢探索吧!!!
Github地址
百度网盘地_提取码:byxr
