【转】Webcam in C#: AForge.NET
作者是台湾haryoktav。
原文地址:http://haryoktav.wordpress.com/2009/03/21/webcam-in-c-aforgenet/
AForge.NET is another C# framework to do image processing and others. For further information just go to http://www.aforgenet.com/framework/
Here, I want to show you another way to access your webcam using AForge library. I found this library is more complete and so far work for me.
I can select one of webcams attached in my laptop (I plugged another USB Webcam).. and wow, awesome!
Now, download and extract the AForge library from http://www.aforgenet.com/framework/downloads.html, download this project here (using VS2005, don’t forget to change the extension from “.doc’ to “.rar”).. and I hope you will have fun with your webcam.
Also, remember to Add Reference for AForge.Video.dll and AForge.Video.DirectShow.dll into the project.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using AForge.Video; using AForge.Video.DirectShow; namespace cam_aforge1 { public partial class Form1 : Form { private bool DeviceExist = false; private FilterInfoCollection videoDevices; private VideoCaptureDevice videoSource = null; public Form1() { InitializeComponent(); } // get the devices name private void getCamList() { try { videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice); comboBox1.Items.Clear(); if (videoDevices.Count == 0) throw new ApplicationException(); DeviceExist = true; foreach (FilterInfo device in videoDevices) { comboBox1.Items.Add(device.Name); } comboBox1.SelectedIndex = 0; //make dafault to first cam } catch (ApplicationException) { DeviceExist = false; comboBox1.Items.Add("No capture device on your system"); } } //refresh button private void rfsh_Click(object sender, EventArgs e) { getCamList(); } //toggle start and stop button private void start_Click(object sender, EventArgs e) { if (start.Text == "&Start") { if (DeviceExist) { videoSource = new VideoCaptureDevice(videoDevices[comboBox1.SelectedIndex].MonikerString); videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame); CloseVideoSource(); videoSource.DesiredFrameSize = new Size(160, 120); //videoSource.DesiredFrameRate = 10; videoSource.Start(); label2.Text = "Device running..."; start.Text = "&Stop"; timer1.Enabled = true; } else { label2.Text = "Error: No Device selected."; } } else { if (videoSource.IsRunning) { timer1.Enabled = false; CloseVideoSource(); label2.Text = "Device stopped."; start.Text = "&Start"; } } } //eventhandler if new frame is ready private void video_NewFrame(object sender, NewFrameEventArgs eventArgs) { Bitmap img = (Bitmap)eventArgs.Frame.Clone(); //do processing here pictureBox1.Image = img; } //close the device safely private void CloseVideoSource() { if (!(videoSource == null)) if (videoSource.IsRunning) { videoSource.SignalToStop(); videoSource = null; } } //get total received frame at 1 second tick private void timer1_Tick(object sender, EventArgs e) { label2.Text = "Device running... " + videoSource.FramesReceived.ToString() + " FPS"; } //prevent sudden close while device is running private void Form1_FormClosed(object sender, FormClosedEventArgs e) { CloseVideoSource(); } } }