一、新建一个Windows窗体应用程序,在Form1窗体上添加一个PictureBox控件、一个ComboBox控件,命名为PictureBox1、cbCapture,还有两个Button控件,Text分别为切换和摄像头属性,Name分别为btnStart和btnConfig,其界面如下:
二、在该项目下的“引用”处右击选择“添加引用”,添加 AForge.Video.dll 和 AForge.Video.DirectShow.dll 两个程序集
三、双击两个Button按钮以及触发窗体的Load和Closing事件,代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using AForge.Video.DirectShow;10 using AForge.Video;11 using System.Diagnostics;12 13 namespace Aforge调用摄像头14 {15 public partial class Form1 : Form16 {17 public Form1()18 {19 InitializeComponent();20 }21 22 private void Form1_Load(object sender, EventArgs e)23 {24 try25 {26 videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);//枚举所有的视频输入设备27 if (videoDevices.Count == 0)28 throw new ApplicationException();29 foreach (FilterInfo device in videoDevices)30 {31 cbCapture.Items.Add(device.Name);//把所有的视频设备添加到下拉框中32 }33 cbCapture.SelectedIndex = 0;34 videoSource = new VideoCaptureDevice(videoDevices[cbCapture.SelectedIndex].MonikerString);//摄像头的名称35 videoSource.DesiredFrameSize = new Size(500, 300);//设置大小36 videoSource.DesiredFrameRate = 1;//设置帧率37 videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame);38 videoSource.Start();39 }40 catch (Exception ex)41 {42 MessageBox.Show(ex.Message);43 }44 }45 private FilterInfoCollection videoDevices;46 private VideoCaptureDevice videoSource;47 private void btnStart_Click(object sender, EventArgs e)48 {49 videoSource.Stop();50 videoSource = new VideoCaptureDevice(videoDevices[cbCapture.SelectedIndex].MonikerString);//摄像头的名称51 videoSource.DesiredFrameSize = new Size(500, 300);//设置大小52 videoSource.DesiredFrameRate = 1;//设置帧率53 videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame); 54 videoSource.Start();55 }56 private void video_NewFrame(object sender, NewFrameEventArgs eventArgs)57 {58 Bitmap bitmap = (Bitmap)eventArgs.Frame.Clone();59 pictureBox1.Image = bitmap;60 }61 62 private void btnConfig_Click(object sender, EventArgs e)63 {64 if ((videoSource != null) && (videoSource is VideoCaptureDevice))65 {66 try67 {68 ((VideoCaptureDevice)videoSource).DisplayPropertyPage(this.Handle);69 }70 catch (NotSupportedException ex)71 {72 MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);73 }74 }75 }76 77 private void Form1_FormClosing(object sender, FormClosingEventArgs e)78 {79 Process p = Process.GetCurrentProcess();80 if (p.HasExited == false)81 {82 p.Kill();83 }84 } 85 }86 }
注意:如果在关闭窗体是不把这个进程给结束掉,那么下次再次调用的时候就会出现程序正在运行中的错误或者在窗体加载时不能调用处摄像头;此外,摄像头必须是无驱的
四、效果图