AForge.net 使用之录像拍照功能实现

最近使用aforge.net拍照录像功能实现

记录一下以便以后好学习,哈哈,直接上代码

连接摄像头设备,这里需要引入

AForge.Video;

AForge.Video.DirectShow;

AForge.Video.FFMPEG;

还需要添加引用,aforge.dll,aforge.video,aforge.control,

在工具箱中还需要添加AForge.Control,然后找到VideoSourcePlayer这个控件添加到界面上

然后定义变量

private FilterInfoCollection videoDevices;
private VideoCaptureDevice videoSource;

private bool stopREC = true;
private bool createNewFile = true;

private string videoFileFullPath = string.Empty; //视频文件全路径
private string imageFileFullPath = string.Empty; //图像文件全路径
private string videoPath = @"E:\video\"; //视频文件路径
private string imagePath = @"E:\video\images\"; //图像文件路径
private string videoFileName = string.Empty; //视频文件名
private string imageFileName = string.Empty; //图像文件名
private string drawDate = string.Empty;
private VideoFileWriter videoWriter = null;

public delegate void MyInvoke(); //定义一个委托方法

string g_s_AutoSavePath = AppDomain.CurrentDomain.BaseDirectory + "Capture\\";
object objLock = new object(); //定义一个对象的锁
int frameRate = 20; //默认帧率
private Stopwatch stopWatch = null;
IVideoSource iVideoSource = null;

private void InitUI()
{
    //连接//开启摄像头
    videoDevices = vh.GetDevices();
    if (videoDevices != null && videoDevices.Count > 0)
    {
        videoSource = vh.VideoConnect();
    }
    videoSourcePlayer1.VideoSource = videoSource;
    videoSourcePlayer1.Start();
}

开始录像

 private void btnStartVideotape_Click(object sender, EventArgs e)
 {
     //开始录像
     if (btnStartVideotape.Text == "开始录像")
     {
         stopREC = false;
         frameRate = Convert.ToInt32(txtFrameRate.Text.Trim());
         btnStartVideotape.Text = "停止录像";
     }
     else if (btnStartVideotape.Text == "停止录像")
     {
         stopREC = true;
         btnStartVideotape.Text = "开始录像";
     }
 }

添加aforge.net的一个VideoSourcePlayer控件之后找到NewFrame事件,代码如下:

下面是控件的一个事件,是真正录像的代码

private void videoSourcePlayer1_NewFrame(object sender, ref Bitmap image)
        {
            //录像
            Graphics g = Graphics.FromImage(image);
            SolidBrush drawBrush = new SolidBrush(Color.Yellow);

            Font drawFont = new Font("Arial", 6, FontStyle.Bold, GraphicsUnit.Millimeter);
            int xPos = image.Width - (image.Width - 15);
            int yPos = 10;
            //写到屏幕上的时间
            drawDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

            g.DrawString(drawDate, drawFont, drawBrush, xPos, yPos);
            if (!Directory.Exists(videoPath))
                Directory.CreateDirectory(videoPath);

            //创建文件路径
            //fileFullPath = path + fileName;

            if (stopREC)
            {
                stopREC = true;
                createNewFile = true;  //这里要设置为true表示要创建新文件
                if (videoWriter != null)
                    videoWriter.Close();
            }
            else
            {
                //开始录像
                if (createNewFile)
                {
                    videoFileName = DateTime.Now.ToString("yyyy.MM.dd HH.mm.ss") + ".avi";
                    videoFileFullPath = videoPath + videoFileName;
                    createNewFile = false;
                    if (videoWriter != null)
                    {
                        videoWriter.Close();
                        videoWriter.Dispose();
                    }
                    videoWriter = new VideoFileWriter();
                    //这里必须是全路径,否则会默认保存到程序运行根据录下了
                    videoWriter.Open(videoFileFullPath, image.Width, image.Height, frameRate, VideoCodec.MPEG4);
                    videoWriter.WriteVideoFrame(image);
                }
                else
                {
                    videoWriter.WriteVideoFrame(image);
                }
            }
        }

拍照代码

/// <summary>
/// 手动拍照或抓图
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnCapture_Click(object sender, EventArgs e)
{
    try
    {
        int number=0;
        number++;
        string fileImageName = g_s_RequestNo + "-" + number + ".bmp";
        string fileCapturePath = g_s_AutoSavePath + g_s_RequestNo + "\\";
        if (!Directory.Exists(fileCapturePath))
            Directory.CreateDirectory(fileCapturePath);

        //抓到图保存到指定路径
        Bitmap bmp = null;
        bmp = videoSourcePlayer1.GetCurrentVideoFrame();
        if (bmp == null)
        {
            MessageBox.Show("捕获图像失败!", "提示");
            return;
        }
        
        bmp.Save(fileCapturePath + fileImageName, ImageFormat.Bmp);
            
    }
    catch (Exception ex)
    {
        MessageBox.Show("捕获图像失败!" + ex.Message, "提示");
    }
}

最基本的工作就完成了,如果要更加完美的话还需要细化,优化等等,就先记录到此,以便记录自己的点点滴滴的进步

 

posted @ 2014-12-16 20:36  ching126  阅读(5804)  评论(3编辑  收藏  举报
一个小小的平凡的事情坚持10年,回头看看,你会收获惊喜;坚持20年,回头看看,你的命运已经发生质的蜕变;坚持30年甚至更多年,回头看看,你的人生已经发生惊天动地的变化。