Emgucv(二)Emgucv和Aforge录制视频
一、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录制视频的更多相关文章
- 使用AForge录制视频
使用AForge录制视频,基于Winform开发 (一)首先导入AForge包 需要先导入 using AForge.Video;using AForge.Video.FFMPEG; 两个工具包 (二 ...
- Android Camera系列开发 (二)通过Intent录制视频
Android Camera系列开发 (二)通过Intent录制视频 作者:雨水 2013-8-18 CSDN博客:http://blog.csdn.net/gobitan/ 概述 使用Camera ...
- playwright-python 截图、录制视频、录制接口(二)
截图 fullPage为True时,截取全屏,默认为False clip截取特定部分的图片,{"x": float, "y": float, "wid ...
- javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG、javaCV-openCV)
javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...
- 【Android Developers Training】 49. 轻松录制视频
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- OpenCV Python 录制视频
调用摄像头 引入库支持 初始化 调整界面大小 实时显示 录制视频并保存 fourcc问题解决 代码实现 效果展示 总结 学到实用OpenCV调用笔记本电脑的摄像头,并录制视频保存到本地硬盘的时候,出现 ...
- I.MX6 FFmpeg 录制视频
/************************************************************************* * I.MX6 FFmpeg 录制视频 * 说明: ...
- Android自定义view之仿微信录制视频按钮
本文章只写了个类似微信的录制视频的按钮,效果图如下: 一.主要的功能: 1.长按显示进度条,单击事件,录制完成回调 2.最大时间和最小时间控制 3.进度条宽度,颜色设置 二.实 ...
- Delphi - 利用DLL编程控制摄像头实现拍照、录制视频
Delphi利用avicap32.dll编程控制摄像头实现拍照.录制视频 项目需求:平板电脑(Windows系统)一维/二维码扫描功能: 需求分析: 需要扫描一维/二维码时,分两步实现. 第一步,av ...
随机推荐
- 【cocos2d-x 手游研发小技巧(7)图片资源加密,Lua文件加密】
游戏开发中常遇到资源保护的问题. 目前游戏开发中常加密的文件类型有:图片,Lua文件,音频等文件,而其实加密也是一把双刃剑. 需要安全那就得耗费一定的资源去实现它.目前网上也有用TexturePack ...
- java对象的结构
[Java对象解析]不得不了解的对象头 一个Java对象到底占用多大内存? JVM源码分析之java对象头实现 java对象在内存中的结构(转帖) 一个Java对象到底占多大内存? 在Hotspot ...
- D04——C语言基础学PYTHON
C语言基础学习PYTHON——基础学习D04 20180810内容纲要: 1 内置函数 2 装饰器 3 生成器 4 迭代器 5 软件目录结构规范 6 小结 1 内置函数 内置函数方法详 ...
- 【LeetCode】 617. 合并二叉树
题目 给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠. 你需要将他们合并为一个新的二叉树.合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否 ...
- js02--对象、函数、switch、for、异常、表单验证
现在我们接着来继续学习有关js的一些基础. 1.undefined与null undefined:当变量声明但尚未赋值时,它的类型就是undefined null:表示一个不存在的对象,它 ...
- 【Azure】Publish Error of "%(TargetOSFamily.Identity)" that evaluates to "" instead of a number
在向Azure部署程序的时候,出现如下错误: A numeric comparison was attempted on "%(TargetOSFamily.Identity)" ...
- syslog之一:Linux syslog日志系统详解
目录: <syslog之一:Linux syslog日志系统详解> <syslog之二:syslog协议及rsyslog服务全解析> <syslog之三:建立Window ...
- AsyncTask、HandlerThread、IntentService和线程池
AsyncTask AsyncTask 是一种轻量级的异步任务类,可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程用于更新UI. 可以直接继承AsyncTask,在类中实现异步操作, ...
- Eclipse+jboss5 无法启动
在使用Eclipse luna 配置Jboss5 时,配置成功,但无法在eclipse 控制台上启动. log: Deployment "AttachmentStore" is i ...
- docker学习(2)--基础命令
转载请注明源出处:http://www.cnblogs.com/lighten/p/6875355.html 1.基本命令 搭建好docker环境之后,使用docker help命令查看docker的 ...