打赏

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

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

AForge.Video;

AForge.Video.DirectShow;

AForge.Video.FFMPEG;

还需要添加引用,aforge.dll,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 @ 2017-01-16 15:55  Bear.Tirisfal  阅读(811)  评论(0编辑  收藏  举报