C# 利用 OpenCV 进行视频捕获 (笔记)
来源:互联网 发布:淘宝嘉年华活动时间 编辑:程序博客网 时间:2024/06/06 00:33
简介
这个项目是关于如何从网络摄像头或者视频文件(*.AVI)中捕获视频的,这个项目是用C#和OPENCV编写的。
这将有助于那些喜欢C#和OpenCV环境的人。这个程序完全基于Visual Studio 2010 version C#.NET环境。这个程序展示了怎样用C#.NET环境的Visual Studio 2010 IDE编写OpenCV,这个程序是一个怎样用Visual Studio 2010,C#.NET创建程序的例子。
在这篇文章中,我解释了怎样配置Visual Studio 2010,一种配置计算机环境变量EmguCV2.4.9以便运行OpenCV程序的步骤。
EmguCV:让我们开始工作吧。。。
EmguCV 是一个跨平台的运行OpenCV图形库的壳。它允许从.NET语言例如C#,VB,VC++中调用OpenCV函数,这个壳可以用Mono编译,在Windows,Linux,Mac OS X,iPhone,iPad 和Android 设备中运行。
EmguCV是用C#编写的。可以在Mono中编译,所以它可以在任何Mono支持的平台上运行,包括 Linux, Mac and Android。
pou
翻译于 2年前
2人顶
顶 翻译的不错哦!
准备 Visual Studio 2010
第 1 步: 安装 EmguCV 2.4.9
下载 EmguCV 2.4.9 版本. 将它安装在 c:\ 磁盘 位置, 不要改变路径, 使用默认的路径“C:\Emgu\emgucv-windows-universal-gpu2.4.9.1847”.
安装路径 – “C:\Emgu\emgucv-windows-universal-gpu2.4.9.1847”.
所有的框框都选上,全包安装.
第 2 步: 设置环境变量:
在用户和系统变量中设置如下的三个路径.
C:\Emgu\emgucv-windows-universal-gpu 2.4.9.1847\bin;
C:\Emgu\emgucv-windows-universal-gpu 2.4.9.1847\bin\x64;
C:\Emgu\emgucv-windows-universal-gpu 2.4.9.1847\bin\x86;
第 3 步: 配置 Visual Studio 2010:
创建一个新的 Windows Application 项目,命名为‘Two Layer’.
选择引用, 右键点击添加引用.
选择 Browse 选项卡, 找到“C:\Emgu\emgucv-windows-universal-gpu2.4.9.1847\bin”, 选择“Emgu.CV.dll”,”Emgu.CV.UI.dll”,”Emgu.Util.dll” 三个文件, 并点击ok.
引用就会在Solution Explorer中出现.
leoxu
翻译于 2年前
0人顶
顶 翻译的不错哦!
捕获视频
捕获视频功能,捕获视频有两种方式,一种是从摄像机捕获,第二种是从视频文件捕获。接下来的部分,代码会向你展示如果从摄像机捕获视屏.
在这一节中, 捕获, FRAME PER SECOND 设置为 30 FPS, 视频文件捕获的高和宽分别设置为 240, 320 . 然后video_seek被初始化为零 '0', 这个视频搜寻控制会在视频限制的低位和高位之间搜索视频.
下面的语句在应用程序中最有用. 它有点像多线程. 当应用程序进入到空闲状态,"ProcessFrame" 就会一直调用直到视频帧结束或者直到帧不为 'null'.
Application.Idle += ProcessFrame;
在从视频文件捕获的代码中,我们需要总帧数来设置视频搜寻控制的上限. FOURCC 被用来找到多媒体的编码解码器名称.
leoxu
翻译于 2年前
0人顶
顶 翻译的不错哦!
从摄像机捕获的代码
#region cameracapture
if
(comboBox1.Text ==
"Capture From Camera"
)
{
try
{
_capture =
null
;
_capture =
new
Capture(0);
_capture.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FPS, 30);
_capture.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_HEIGHT, 240);
_capture.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_WIDTH, 320);
Time_Label.Text =
"Time: "
;
Codec_lbl.Text =
"Codec: "
;
Frame_lbl.Text =
"Frame: "
;
webcam_frm_cnt = 0;
cam = 1;
Video_seek.Value = 0;
Application.Idle += ProcessFrame;
button1.Text =
"Stop"
;
comboBox1.Enabled =
false
;
}
catch
(NullReferenceException excpt)
{
MessageBox.Show(excpt.Message);
}
}
#endregion cameracapture
从视频文件捕获的代码
#region filecapture
if
(comboBox1.Text ==
"Capture From File"
)
{
openFileDialog1.Filter =
"MP4|*.mp4"
;
openFileDialog1.FileName =
""
;
if
(openFileDialog1.ShowDialog() == DialogResult.OK)
{
try
{
_capture =
null
;
_capture =
new
Capture(openFileDialog1.FileName);
_capture.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_HEIGHT, 240);
_capture.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_WIDTH, 320);
FrameRate = _capture.GetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FPS);
TotalFrames = _capture.GetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_COUNT);
codec_double = _capture.GetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FOURCC);
string
s =
new
string
(System.Text.Encoding.UTF8.GetString
(BitConverter.GetBytes(Convert.ToUInt32(codec_double))).ToCharArray());
Codec_lbl.Text =
"Codec: "
+ s;
cam = 0;
Video_seek.Minimum = 0;
Video_seek.Maximum = (
int
)TotalFrames - 1;
Application.Idle += ProcessFrame;
button1.Text =
"Stop"
;
comboBox1.Enabled =
false
;
}
catch
(NullReferenceException excpt)
{
MessageBox.Show(excpt.Message);
}
}
}
#endregion filecapture
处理图像
下面的函数用来处理帧. 帧处理可以提取出一些详细信息,如帧的编号,时间轴,总的帧数等. 这个函数展示了图片盒子中的图像序列. 帧可以被转换成字节数组. 这个字节数据可以被转换成每一帧的16进制值. 然后那些十六进制值被存到数组中做进一步的处理. 从设备或者视频文件捕获的视频中提取当前帧.
frame = _capture.QueryFrame();
帧被转换成 bitmap 并被赋值给图片盒子用于展示 .
pictureBox1.Image = frame.ToBitmap();
函数在按帧率划分的特定时间休眠.
Thread.Sleep((
int
)(1000.0 / FrameRate));
帧被转换成字节数组. 这个字节数据被转换成每一帧的16进制值. 然后那些十六进制值被存到数组中做进一步的处理.
private
void
ProcessFrame(
object
sender, EventArgs arg)
{
try
{
Framesno = _capture.GetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_POS_FRAMES);
frame = _capture.QueryFrame();
if
(frame !=
null
)
{
pictureBox1.Image = frame.ToBitmap();
if
(cam == 0)
{
Video_seek.Value = (
int
)(Framesno);
double
time_index = _capture.GetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_POS_MSEC);
Time_Label.Text =
"Time: "
+ TimeSpan.FromMilliseconds(time_index).ToString().Substring(0, 8);
double
framenumber = _capture.GetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_POS_FRAMES);
Frame_lbl.Text =
"Frame: "
+ framenumber.ToString();
Thread.Sleep((
int
)(1000.0 / FrameRate));
}
if
(cam == 1)
{
Frame_lbl.Text =
"Frame: "
+ (webcam_frm_cnt++).ToString();
}
}
}
catch
(Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
}
释放数据
这个方法用来释放数据. 它同时也释放了捕获变量所需要的一些资源.
private
void
ReleaseData()
{
if
(_capture !=
null
)
_capture.Dispose();
}
- C# 利用 OpenCV 进行视频捕获 (笔记)
- 利用opencv进行usb相机的视频捕获
- 利用opencv进行usb相机的视频捕获
- OpenCV学习笔记(9)利用MFC的Picture控件显示图像+播放视频和捕获摄像头画面
- OpenCV学习笔记(9)利用MFC的Picture控件显示图像+播放视频和捕获摄像头画面
- OpenCV学习笔记(9)利用MFC的Picture控件显示图像+播放视频和捕获摄像头画面
- OpenCV学习笔记(9)利用MFC的Picture控件显示图像+播放视频和捕获摄像头画面
- OpenCV学习笔记 利用MFC的Picture控件显示图像+播放视频和捕获摄像头画面 .
- OpenCV学习笔记 利用MFC的Picture控件显示图像+播放视频和捕获摄像头画面
- openCV-Python笔记二:视频捕获
- OpenCv学习笔记——OpenCV捕获视频
- OpenCV捕获视频
- OpenCV捕获视频
- opencv学习笔记(九)捕获摄像头的视频并保存成avi格式
- ios--OpenCV--视频捕获Camera
- OpenCV捕获视频和摄像头
- Atitit java opencv 捕获视频
- 视频捕获笔记
- struts2 中使用request.getInputStream() 获取POST数据
- Windows下git安装及使用技巧
- match()方法及exec()方法
- 正则表达式(括号)、[中括号]、{大括号}的区别小结
- sp<>强指针类的用法
- C# 利用 OpenCV 进行视频捕获 (笔记)
- 管理产品文档prd的终极解决方案,再也不用头疼prd的更新和查看了!
- CPU占用率分析
- hdu 5154 Harry and Magical Computer(拓扑排序)
- style,getComputedStyle,currentStyle,defaultView,getPropertyValue
- Material Design学习之 Button(详细分析,传说中的水滴动画)
- Dom4(重定向,文本框自增,判断按键)
- 常见指针错误
- css网站