
首先用到AForge类库下载地址
然后引用AForge,AForge.Controls(这个是控件,可以添加到工具箱中),AForge.Imaging,AForge.Video,AForge.Video.DirectShow
然后直接上代码
[csharp] view plain copy print?
private FilterInfoCollection videoDevices
private VideoCaptureDevice videoSource
public int selectedDeviceIndex = 0
private FilterInfoCollection videoDevicesprivate VideoCaptureDevice videoSource
public int selectedDeviceIndex = 0
下面是获取设备
[csharp] view plain copy print?
public FilterInfoCollection GetDevices()
{
try
{
//枚举所有视频输入设备
videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice)
if (videoDevices.Count != 0)
{
LogClass.WriteFile("已找到视频设备.")
return videoDevices
}
else
return null
}
catch (Exception ex)
{
LogClass.WriteFile("error:没有找到视频设备!具体原因:" + ex.Message)
return null
}
}
public FilterInfoCollection GetDevices(){
try
{
//枚举所有视频输入设备
videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice)
if (videoDevices.Count != 0)
{
LogClass.WriteFile("已找到视频设备.")
return videoDevices
}
else
return null
}
catch (Exception ex)
{
LogClass.WriteFile("error:没有找到视频设备!具体原因:" + ex.Message)
return null
}
}
选择设备,然后连接摄像头
[csharp] view plain copy print?
<p> /// <summary>
/// 连接视频摄像头
/// </summary>
/// <param name="deviceIndex"></param>
/// <param name="resolutionIndex"></param>
/// <returns></returns>
public VideoCaptureDevice VideoConnect(int deviceIndex = 0, int resolutionIndex = 0)
{
if (videoDevices.Count <= 0)
return null
selectedDeviceIndex = deviceIndex
videoSource = new VideoCaptureDevice(videoDevices[deviceIndex].MonikerString)</p><p> return videoSource
}</p>
<p> /// <summary>/// 连接视频摄像头
/// </summary>
/// <param name="deviceIndex"></param>
/// <param name="resolutionIndex"></param>
/// <returns></returns>
public VideoCaptureDevice VideoConnect(int deviceIndex = 0, int resolutionIndex = 0)
{
if (videoDevices.Count <= 0)
return null
selectedDeviceIndex = deviceIndex
videoSource = new VideoCaptureDevice(videoDevices[deviceIndex].MonikerString)</p><p> return videoSource
}</p>
[csharp] view plain copy print?
//抓图,拍照,单帧
public void GrabBitmap(string path)
{
if (videoSource == null)
return
g_Path = path
videoSource.NewFrame += new NewFrameEventHandler(videoSource_NewFrame)
}
//抓图,拍照,单帧public void GrabBitmap(string path)
{
if (videoSource == null)
return
g_Path = path
videoSource.NewFrame += new NewFrameEventHandler(videoSource_NewFrame)
}
[csharp] view plain copy print?
void videoSource_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
{
Bitmap bmp = (Bitmap)eventArgs.Frame.Clone()
string fullPath = path + "temp\\"
if (!Directory.Exists(fullPath))
Directory.CreateDirectory(fullPath)
string img = fullPath + DateTime.Now.ToString("yyyyMMdd hhmmss") + ".bmp"
bmp.Save(img)
void videoSource_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs){
Bitmap bmp = (Bitmap)eventArgs.Frame.Clone()
string fullPath = path + "temp\\"
if (!Directory.Exists(fullPath))
Directory.CreateDirectory(fullPath)
string img = fullPath + DateTime.Now.ToString("yyyyMMdd hhmmss") + ".bmp"
bmp.Save(img)
[csharp] view plain copy print?
//如果这里不写这个,一会儿会不停的拍照,
videoSource.NewFrame -= new NewFrameEventHandler(videoSource_NewFrame)
}
//如果这里不写这个,一会儿会不停的拍照,videoSource.NewFrame -= new NewFrameEventHandler(videoSource_NewFrame)
}
这样就完成了 *** 作摄像头的工作
但是发现一个问题,如果要拍照得到的照片先要处理在保存,这里就有问题了,所以需要在界面前台中添加控件,医用AForge.Controls,然后添加到工具箱,然后将VideoSourcePlayer控件拖到窗体中,想要得到单张图像处理:
Bitmap bmp = videoSourcePlayer1.GetCurrentFrame()
这样就可以拿来处理了,AForge类库是非常的强大,这里只是冰山一角,文章不足之处还请大家多多指正,欢迎提出宝贵意见和建议。谢谢。。。
AForge.video依赖于AForge (core library) 2.2.5。
你需要同时引用Aforge核心库,才能使用Aforge.video。
我上传到附件里,你下载引用它。
//看了下你的代码,错误的原因就是连接的时候重新定义了一个对象。稍改下就好。 using Systemusing System.Collections.Generic
using System.ComponentModel
using System.Data
using System.Drawing
using System.Drawing.Imaging
using System.Text
using System.Windows.Forms
using System.Threading
using AForge
using AForge.Video
using AForge.Video.DirectShow
using AForge.Imaging
using AForge.Imaging.Filters
using System.IO
namespace Camera
{
public partial class Form1 : Form
{
private FilterInfoCollection videoDevices
public VideoCaptureDevice videoSource
private int flag = 1
private string dirc = System.AppDomain.CurrentDomain.BaseDirectory + "JPG" //截图保存的目录
public Form1()
{
InitializeComponent()
}
private void Form1_Load(object sender, EventArgs e)
{
if (!Directory.Exists(dirc))
Directory.CreateDirectory(dirc)
try
{
// 枚举所有视频输入设备
videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice)
if (videoDevices.Count == 0)
throw new ApplicationException()
foreach (FilterInfo device in videoDevices)
{
tscbxCameras.Items.Add(device.Name)
}
tscbxCameras.SelectedIndex = 0
}
catch (ApplicationException)
{
tscbxCameras.Items.Add("No local capture devices")
videoDevices = null
}
}
private void toolStripButton1_Click(object sender, EventArgs e)
{
CameraConn()
}
private void CameraConn()
{ //你这里重新定义了一个对象,所以出错
videoSource = new VideoCaptureDevice(videoDevices[tscbxCameras.SelectedIndex].MonikerString)
videoSource.DesiredFrameSize = new Size(320, 240)
videoSource.DesiredFrameRate = 1
videPlayer.VideoSource = videoSource
videPlayer.Start()
}
private void toolStripButton2_Click(object sender, EventArgs e)
{
videPlayer.SignalToStop()
videPlayer.WaitForStop()
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
toolStripButton2_Click(null, null)
}
private void toolStripButton3_Click(object sender, EventArgs e)
{
//不懂截图,但还是给你简单完善了下
flag = 0
if (videoSource == null)
{
MessageBox.Show("请先连接摄像头")
}
else if (!videoSource.IsRunning)
{
MessageBox.Show("摄像头已经关闭,请重新打开")
}
else
{
videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame)
}
}
private void video_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
Bitmap bitmap = (Bitmap)eventArgs.Frame.Clone()
if (flag == 0)
{
string img = dirc + "/" + DateTime.Now.ToString("yyyyMMddhhmmss") + ".jpg"
bitmap.Save(img)
flag = 1
}
}
}
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)