zoukankan      html  css  js  c++  java
  • 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:videoimages"; //图像文件路径
    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, "提示");
        }
    }

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

    当你遇到挫折和困难时,千万记住永远永远永远不要放弃
  • 相关阅读:
    把数组排成最小的数
    整数中1出现的次数
    连续子数组的最大和
    快速排序
    penCV入门
    OpenCV视频操作
    linux下导入oracle数据表
    js工作备注
    oracle创建默认表空间---重要
    oracle的导入导出
  • 原文地址:https://www.cnblogs.com/ching2009/p/4168000.html
Copyright © 2011-2022 走看看