既然是身为程序员,我就觉得我应该对我的电脑有着一定的控制力,这控制力的表现就比如我想每天记录我的样子,以后做对比。刚好笔记本上面就自带了一个摄像头,我就想通过调用摄像头,实现拍照的功能。然后我就开始了百度的路程。。。
首先是需要
这些dll文件,然后导入命名空间
using AForge;
using AForge.Video;
using AForge.Video.DirectShow;
using AForge.Imaging;
using AForge.Imaging.Filters;
不过上面这些命名空间有些并没有用到,好像就用到了两个
using AForge.Video;
using AForge.Video.DirectShow;
之后,写一个方法用来查找电脑上的摄像头
首先定义两个全局变量
private FilterInfoCollection videoDevices;//摄像头的设备
private VideoCaptureDevice videoSource;//摄像头的视频
之后查找摄像头
/// <summary>
/// 获取摄像机设备
/// </summary>
/// <returns></returns>
void FindDevices()
{
try
{
videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
if (videoDevices.Count!=0)
{
foreach (FilterInfo device in videoDevices)
{
cbb_Camera.Items.Add(device.Name);//将电脑上的摄像头的名字遍历输出到combobox中
}
if (cbb_Camera.Items.Count>1)
{
cbb_Camera.SelectedIndex = 1;
}
else
{
cbb_Camera.SelectedIndex = 0;//索引值设置为第一个
}
}
else
{
}
}
catch (Exception ex)
{
tb_state.Text += ex.Message+"\n";
}
}
然后打开摄像头
/// <summary>
/// 打开摄像头
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_OpenCamera_Click(object sender, EventArgs e)
{
if (videPlayer.IsRunning)
{
return;
}
videoSource = new VideoCaptureDevice(videoDevices[cbb_Camera.SelectedIndex].MonikerString);//获取到下拉框中选择的索引值所对应的相机设备
videPlayer.VideoSource = videoSource;//将摄像机画面设置videPlayer控件上
videPlayer.Start();
}
这里面打开摄像头需要将图像显示到一个VideoPlayer的控件上,该控件是由AForge.Controls.VideoSourcePlayer提供的
然后是拍照的方法
/// <summary>
/// 照相
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_CameraCapture_Click(object sender, EventArgs e)
{
if (videoDevices.Count>0&&videoSource!=null)//如果摄像机设备的数量大于0并且视频源不为空
{
videoSource.NewFrame += new NewFrameEventHandler(videoSource_NewFrame);//拍照事件
}
}