一、Emgucv录制视频

  Emgucv中的Capture类可以完成视频文件的读取,利用EmguCV播放视频的原理是:将视频看作图片,用capture获取抓取通道,通过不断的调用{frame =
capture.QueryFrame();imageBox1.Image = frame;}语句实现图像的实时显示。

  录制视频时用到了VideoWriter()这个函数,它有两种构造方法,分别为VideoWriter(string fileName, int compressionCode, int fps, int width, int height, bool isColor)和VideoWriter(string fileName, int fps, int width, int height, bool isColor),其中:

  fileName:文件的保存路径;

  compressionCode:视频的编码方式;

  fps:录制视频的帧率;

  width:视频的宽度;

  height:视频的高度;

  isColor:是否是彩色;

最后调用WriteFrame()方法录制视频

  首先我们要做的第一步就是打开电脑自带的摄像头,其代码为:

 private Capture capture;
private void btnStart_Click(object sender, EventArgs e)
{
capture = new Capture();
Application.Idle += new EventHandler(processfram);
}
private void processfram(object sender, EventArgs arg)
{
frame = capture.QueryFrame();
imageBox1.Image = frame;
}

  接下来再录制视频,其关键代码为:

 vw = new VideoWriter("E:\\1.avi", CvInvoke.CV_FOURCC('M', 'J', 'P', 'G'), ,(int)CvInvoke.cvGetCaptureProperty(capture, Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_WIDTH), (int)CvInvoke.cvGetCaptureProperty(capture, Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_HEIGHT), true);
Application.Idle += new EventHandler(processfram);

  其完整代码为:

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Emgu.CV;
using Emgu.CV.Structure; namespace test
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private Capture capture;
Image<Bgr, Byte> frame;
VideoWriter vw;
bool flag = false;
private void btnStart_Click(object sender, EventArgs e)
{
btnRecord.Enabled = true;
capture = new Capture();
Application.Idle += new EventHandler(processfram);
}
private void processfram(object sender, EventArgs arg)
{
frame = capture.QueryFrame();
imageBox1.Image = frame;
if(flag)
vw.WriteFrame(frame);
} private void btnRecord_Click(object sender, EventArgs e)
{
if (btnRecord.Text == "录制")
{
if (MessageBox.Show("开始录制吗?", "Information", MessageBoxButtons.OKCancel, MessageBoxIcon.Information) == DialogResult.OK)
{
flag = true;
vw = new VideoWriter("E:\\1.avi", CvInvoke.CV_FOURCC('M', 'J', 'P', 'G'), ,(int)CvInvoke.cvGetCaptureProperty(capture, Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_WIDTH), (int)CvInvoke.cvGetCaptureProperty(capture, Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_HEIGHT), true);
Application.Idle += new EventHandler(processfram);
btnRecord.Text = "暂停";
}
}
else
{
if (MessageBox.Show("停止录制吗?", "Information", MessageBoxButtons.OKCancel, MessageBoxIcon.Information) == DialogResult.OK)
{
flag = false;
Application.Idle -= new EventHandler(processfram);
vw.Dispose();
btnRecord.Text = "录制";
}
}
}
}
}

二、Aforge录制视频(在上一篇博客的基础上,所以在此之前先看完上一篇博客)

  Aforge录制视频调用的是AVIWriter()函数,所以在此之前先要引入AForge.Video.VFW.dll程序集,其具体步骤如下:

  (1)先new一个AVIWriter对象,如AVIWriter writer = new AVIWriter("wmv3"),此代表的是录制的事avi格式的视频,但是必须先要装个插件,下载地址http://blog.csdn.net/wletv/article/details/9188417,唯一的缺点就是不能64位的系统下运行;如果不加“wmv3”则没有这个问题,可是录制几秒就有一两百兆了,十分的不可取(如果谁有更好的解决办法请及时告诉我哦:));

  (2)接着调用其Open方法,如writer.Open(string fileName, int width, int height),其中fileName为路径,width为宽度,height为高度;

  (3)写入视频文件,调用AddFrame方法;

完整代码为:

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AForge.Video.DirectShow;
using AForge.Video;
using System.Diagnostics;
using AForge.Video.VFW; namespace Aforge调用摄像头
{
public partial class Form1 : Form
{
private FilterInfoCollection videoDevices;
private VideoCaptureDevice videoSource;
AVIWriter writer = new AVIWriter();
private Bitmap bitmap,img;
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
try
{
videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);//枚举所有的视频输入设备
if (videoDevices.Count == )
throw new ApplicationException();
foreach (FilterInfo device in videoDevices)
{
cbCapture.Items.Add(device.Name);//把所有的视频设备添加到下拉框中
}
cbCapture.SelectedIndex = ;
videoSource = new VideoCaptureDevice(videoDevices[cbCapture.SelectedIndex].MonikerString);//摄像头的名称
videoSource.DesiredFrameSize = new Size(, );//设置大小
videoSource.DesiredFrameRate = ;//设置帧率
videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame);
videoSource.Start();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void btnStart_Click(object sender, EventArgs e)
{
videoSource.Stop();
videoSource = new VideoCaptureDevice(videoDevices[cbCapture.SelectedIndex].MonikerString);//摄像头的名称
videoSource.DesiredFrameSize = new Size(, );//设置大小
videoSource.DesiredFrameRate = ;//设置帧率
videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame);
videoSource.Start();
}
private void video_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
bitmap = (Bitmap)eventArgs.Frame.Clone();
pictureBox1.Image = bitmap;
} private void btnConfig_Click(object sender, EventArgs e)
{
if ((videoSource != null) && (videoSource is VideoCaptureDevice))
{
try
{
((VideoCaptureDevice)videoSource).DisplayPropertyPage(this.Handle);
}
catch (NotSupportedException ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
} private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
Process p = Process.GetCurrentProcess();
if (p.HasExited == false)
{
p.Kill();
}
}
private void btnRecord_Click(object sender, EventArgs e)
{
if (btnRecord.Text == "录制")
{
if (MessageBox.Show("Start Recording?", "Information", MessageBoxButtons.OKCancel, MessageBoxIcon.Information) == DialogResult.OK)
{
writer = new AVIWriter("wmv3");
writer.Open("E:\\1.avi", bitmap.Width, bitmap.Height);
videoSource.NewFrame += new NewFrameEventHandler(video_NewFrames);
btnRecord.Text = "停止";
}
}
else
{
if (MessageBox.Show("Stop Recording?", "Information", MessageBoxButtons.OKCancel, MessageBoxIcon.Information) == DialogResult.OK)
{
writer.Dispose();//不dispose掉会报错,不能是close
btnRecord.Text = "录制";
}
}
}
private void video_NewFrames(object sender, NewFrameEventArgs eventArgs)
{
img = (Bitmap)eventArgs.Frame.Clone();
writer.AddFrame(img);
}
}
}

Emgucv(二)Emgucv和Aforge录制视频的更多相关文章

  1. 使用AForge录制视频

    使用AForge录制视频,基于Winform开发 (一)首先导入AForge包 需要先导入 using AForge.Video;using AForge.Video.FFMPEG; 两个工具包 (二 ...

  2. Android Camera系列开发 (二)通过Intent录制视频

    Android Camera系列开发 (二)通过Intent录制视频 作者:雨水  2013-8-18 CSDN博客:http://blog.csdn.net/gobitan/ 概述 使用Camera ...

  3. playwright-python 截图、录制视频、录制接口(二)

    截图 fullPage为True时,截取全屏,默认为False clip截取特定部分的图片,{"x": float, "y": float, "wid ...

  4. javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG、javaCV-openCV)

    javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...

  5. 【Android Developers Training】 49. 轻松录制视频

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  6. OpenCV Python 录制视频

    调用摄像头 引入库支持 初始化 调整界面大小 实时显示 录制视频并保存 fourcc问题解决 代码实现 效果展示 总结 学到实用OpenCV调用笔记本电脑的摄像头,并录制视频保存到本地硬盘的时候,出现 ...

  7. I.MX6 FFmpeg 录制视频

    /************************************************************************* * I.MX6 FFmpeg 录制视频 * 说明: ...

  8. Android自定义view之仿微信录制视频按钮

    本文章只写了个类似微信的录制视频的按钮,效果图如下:             一.主要的功能: 1.长按显示进度条,单击事件,录制完成回调 2.最大时间和最小时间控制 3.进度条宽度,颜色设置 二.实 ...

  9. Delphi - 利用DLL编程控制摄像头实现拍照、录制视频

    Delphi利用avicap32.dll编程控制摄像头实现拍照.录制视频 项目需求:平板电脑(Windows系统)一维/二维码扫描功能: 需求分析: 需要扫描一维/二维码时,分两步实现. 第一步,av ...

随机推荐

  1. 单线程任务 Task.Factory.StartNew 封装

    代码: using log4net; using SunCreate.CombatPlatform.Security; using System; using System.Collections.G ...

  2. mybatis的dao向mapper.xml传入多参数

    https://www.cnblogs.com/super-chao/p/7722411.html 如果两种不同类型的参数传入,parameterType可以不写,直接获取#{0},#{1}就可以传入 ...

  3. C#后端接收form-data,创建实体类

    public class Para_list //实体类 { public long ParemeterID { get; set; } public string Name { get; set; ...

  4. javascript中的数据类型和变量

    Number JavaScript不区分整数和浮点数,统一用Number表示,以下都是合法的Number类型: 123; // 整数123 0.456; // 浮点数0.456 1.2345e3; / ...

  5. Mybatis常用知识点总结

    1. #{}和${}的区别是什么? ${}是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换,比如${driver}会被静态替换为com.mysql.jdbc ...

  6. ajax--底层代码

    ajax:Asynchronous JavaScript And XML,异步的js与XML.ajax并不是一种新的编程语言,而是一种使用现有标准的新方法.ajax能够在不重载整个网页的情况下与服务器 ...

  7. 2018春招-今日头条笔试题-第二题(python)

    题目描述:2018春招-今日头条笔试题5题(后附大佬答案-c++版) 解题思路: 利用深度优先搜索 #-*- coding:utf-8 -*- class DFS: ''' num:用于存储最后执行次 ...

  8. Amazon S3 功能介绍

    一 .Amazon S3介绍 Amazon Simple Storage Service (Amazon S3) 是一种对象存储,它具有简单的 Web 服务接口,可用于在 Web 上的任何位置存储和检 ...

  9. phpstorm之自定义代码碎片(tab键自动填充代码)

    打开phpstorm 的设置界面(快捷键ctrl+alt+s) 比如上面的form表单,需要在生成以后自动跳转到“名称”的位置,然后更改,可以如下修改

  10. SpringAOP-基于@AspectJ的简单入门

    一.AOP的基本概念: 连接点(Jointpoint):表示需要在程序中插入横切关注点的扩展点,连接点可能是类初始化.方法执行.方法调用.字段调用或处理异常等等,Spring只支持方法执行连接点,在A ...