利用 AForge.NET如何两路摄像头的保存图片,我只能保存一路

~王者归来~ 主任工程师  2014-01-15 11:05:01
AForge.NET 是用C#写的一个关于计算机视觉和人工智能领域的框架。它包括图像处理、神经网络、遗传算法和机器学习等。

我利用它搞的程序现在能同时显示两路摄像头视频,但只能保存一路视频的图像,有用过AForge.NET的吗?请问
如何正确保存图像.如果不设flag标志,它会一直保存起来不停.

using System;
using 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;

//

namespace Camera
{
public partial class Form1 : Form
{
private int flag = 1;
private int flag2=1;

private VideoCaptureDevice videoSource1;
private VideoCaptureDevice videoSource2;

private FilterInfoCollection videoDevices;



//修改构造函数
public Form1()
{
InitializeComponent();
//让委托变量等于"设置标签的文本"的方法
}

public delegate void setLabelTextDelegate(); //定义一个委托

private setLabelTextDelegate BrowsLable; //定义这个委托的一个变量


private void ChengText()
{
this.label1.Text = "两路摄像头驱动成功!";

}



private void ThreadMethod()
{
this.label1.Invoke(BrowsLable); //括号里面是上面定义的委托变量

}


private void Form1_Load(object sender, EventArgs e)
{

//新建立一个线程

System.Threading.Thread setLabelTextThread = new System.Threading.Thread(new System.Threading.ThreadStart(ThreadMethod));


this.BrowsLable = this.ChengText; //让委托变量等于"设置标签的文本"的方法

setLabelTextThread.Start();



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("摄像头没有连接!");
videoDevices = null;
}

//连接摄像头1
CameraConn1();

//连接摄像头2
CameraConn2();


}

private void toolStripButton1_Click(object sender, EventArgs e)
{
CameraConn1();
}



private void CameraConn1()
{
videoSource1 = new VideoCaptureDevice(videoDevices[0].MonikerString);
videoSource1.DesiredFrameSize = new Size(320, 240);
videoSource1.DesiredFrameRate = 15;

videPlayer.VideoSource = videoSource1;
videPlayer.Start();

}


private void CameraConn2()
{
videoSource2 = new VideoCaptureDevice(videoDevices[1].MonikerString);
videoSource2.DesiredFrameSize = new Size(320, 240);
videoSource2.DesiredFrameRate = 15;

videPlayer1.VideoSource = videoSource2;
videPlayer1.Start();
}


//停止摄像头
private void toolStripButton2_Click(object sender, EventArgs e)
{
videPlayer.SignalToStop();
videPlayer.WaitForStop();
videPlayer1.SignalToStop();
videPlayer1.WaitForStop();
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
toolStripButton2_Click(null, null);
}



private void video_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
if (flag ==1)
{
Bitmap bitmap = (Bitmap)eventArgs.Frame.Clone();


try
{
lock (this)
{
string path = "c:\\" + DateTime.Now.ToString("MMddhhmmss") + ".bmp";
bitmap.Save(path, System.Drawing.Imaging.ImageFormat.Bmp);
bitmap.Save(path, System.Drawing.Imaging.ImageFormat.Bmp);
flag = 0;

}
}
catch (Exception ex)
{
MessageBox.Show("保存图像失败!\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}


}

}



private void video_NewFrame2(object sender, NewFrameEventArgs eventArgs)
{
if (flag2 == 1)
{
Bitmap bitmap = (Bitmap)eventArgs.Frame.Clone();

try
{
lock (this)
{
string path="c:\\" + DateTime.Now.ToString("MMddhhmmss")+".bmp";
bitmap.Save(path, System.Drawing.Imaging.ImageFormat.Bmp);
flag2= 0;

}
}
catch (Exception ex)
{
MessageBox.Show("保存图像失败!\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}


}

}



private void button1_Click(object sender, Form1 eventArgs)
{

}


//保存图片
private void button1_Click(object sender, EventArgs e)
{

while (flag == 1)
{
videoSource1.NewFrame += new NewFrameEventHandler(video_NewFrame);

}


while (flag2 == 1)
{

videoSource2.NewFrame += new NewFrameEventHandler(video_NewFrame2);
}


label1.Text = "拍照成功,完成时间:" + DateTime.Now.ToString("yyyyMMddhhmmss");
}



private void button2_Click(object sender, EventArgs e)
{
videoSource1.Stop();
}

private void button3_Click(object sender, EventArgs e)
{
videoSource1.Start();
}




// New frame received by the player //在视频上写文字
private void videoSourcePlayer_NewFrame(object sender, ref Bitmap image)
{
DateTime now = DateTime.Now;
Graphics g = Graphics.FromImage(image);

// paint current time
SolidBrush brush = new SolidBrush(Color.Red);
g.DrawString(now.ToString(), this.Font, brush, new PointF(5, 5));


brush.Dispose();

g.Dispose();
}



// New frame received by the player //在视频上写文字
private void videoSourcePlayer_NewFrame2(object sender, ref Bitmap image)
{
DateTime now = DateTime.Now;
Graphics g = Graphics.FromImage(image);

// paint current time
SolidBrush brush = new SolidBrush(Color.Red);
g.DrawString(now.ToString(), this.Font, brush, new PointF(5, 5));

brush.Dispose();

g.Dispose();
}



}
}
...全文
417 点赞 收藏 9
写回复
9 条回复
baidu_31302759 2016年04月11日
引用 8 楼 baidu_31302759 的回复:
我记得Aforge有自己的获取方式吧 var myVideoSourcePlayer = VideoSourcePlayer.GetCurrentVideoFrame(); myVideoSourcePlayer .save(path); 大概就是这个意思,还有就是存的时候名字绝对不能相同,会被覆盖的
VideoSourcePlayer myVideoSourcePlayer= new VideoSourcePlayer();
回复 点赞
baidu_31302759 2016年04月11日
我记得Aforge有自己的获取方式吧 var myVideoSourcePlayer = VideoSourcePlayer.GetCurrentVideoFrame(); myVideoSourcePlayer .save(path); 大概就是这个意思,还有就是存的时候名字绝对不能相同,会被覆盖的
回复 点赞
ching126 2015年11月27日
两路一个卡顿我还真没遇到过,我项目中公用一个视频源VideoSource引用测试过,两个显示窗,没有卡顿,两个摄像头,应该分开视频源引用,个引用各的,应该说是不会卡顿的,估计是你那个地方没写对或者代码异常了
回复 点赞
xiamojinnian 2015年09月11日
引用 5 楼 chenhongwu666 的回复:
你这个拍照的方法不能这么写 private void button1_Click(object sender, EventArgs e) { while (flag == 1) { videoSource1.NewFrame += new NewFrameEventHandler(video_NewFrame); } while (flag2 == 1) { videoSource2.NewFrame += new NewFrameEventHandler(video_NewFrame2); } label1.Text = "拍照成功,完成时间:" + DateTime.Now.ToString("yyyyMMddhhmmss"); } 因为你是用的VideoSourcePlayer控件所以直接使用控件属性获取每一针图像就是拍照了,然后你将获取到的图片保存 Bitmap bmp = VideoSourcePlayer1.GetCurrentVideoFrame();
请问有没有遇到过同时显示两个摄像头,有一个卡顿的现象?
回复 点赞
ching126 2015年06月26日
你这个拍照的方法不能这么写 private void button1_Click(object sender, EventArgs e) { while (flag == 1) { videoSource1.NewFrame += new NewFrameEventHandler(video_NewFrame); } while (flag2 == 1) { videoSource2.NewFrame += new NewFrameEventHandler(video_NewFrame2); } label1.Text = "拍照成功,完成时间:" + DateTime.Now.ToString("yyyyMMddhhmmss"); } 因为你是用的VideoSourcePlayer控件所以直接使用控件属性获取每一针图像就是拍照了,然后你将获取到的图片保存 Bitmap bmp = VideoSourcePlayer1.GetCurrentVideoFrame();
回复 点赞
ching126 2015年06月26日
你需要创建一个private FilterInfoCollection videoDevices;两个private VideoCaptureDevice videoSource;不然的话两个公用一个引用,这样子不好控制,你的另一路不显示问题我遇到过,那个是视频源的问题,不知此问题楼主解决了木有
回复 点赞
comcyd 2014年12月11日
帮顶。。。这个类很好用,我最近也用过,不过你的那个问题应该不是问题
回复 点赞
w_xxxbbb 2014年12月11日

private void Photograph_Click(object sender, EventArgs e)
        {
            Flag = 0;
            videoSourcePlayer.NewFrame += new NewFrameEventHandler(video_NewFrame);
        }
        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;
            }
        }    
我的代码,怎么提示错误:无法将类型“AForge.Video.NewFrameEventHandler”隐式转换为“AForge.Controls.VideoSourcePlayer.NewFrameHandler” 请教
回复 点赞
杰D 2014年08月12日
string path="c:\\" + DateTime.Now.ToString("MMddhhmmss")+".bmp"; 改為 string path="c:\\" + DateTime.Now.ToString("MMddhhmmssfff")+".bmp"; 即可。
回复 点赞
发动态
发帖子
C#
创建于2007-09-28

8.5w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告