[转] c# 中使用opencv进行视频捕获
简介这个项目是关于如何从网络摄像头或者视频文件(*.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
|
准备 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 步: 设置环境变量:
在用户和系统变量中设置如下的三个路径.
第 3 步: 配置 Visual Studio 2010:
|
leoxu
|
捕获视频捕获视频功能,捕获视频有两种方式,一种是从摄像机捕获,第二种是从视频文件捕获。接下来的部分,代码会向你展示如果从摄像机捕获视屏. 在这一节中, 捕获, FRAME PER SECOND 设置为 30 FPS, 视频文件捕获的高和宽分别设置为 240, 320 . 然后video_seek 被初始化为零 '0', 这个视频搜寻控制会在视频限制的低位和高位之间搜索视频. 下面的语句在应用程序中最有用. 它有点像多线程. 当应用程序进入到空闲状态,"ProcessFrame" 就会一直调用直到视频帧结束或者直到帧不为 'null'.
在从视频文件捕获的代码中,我们需要总帧数来设置视频搜寻控制的上限. FOURCC 被用来找到多媒体的编码解码器名称. |
leoxu
|
从摄像机捕获的代码
#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(); |
函数在按帧率划分的特定时间休眠.
|
1
|
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进行视频捕获的更多相关文章
- C# 利用 OpenCV 进行视频捕获 (笔记)
原文:C# 利用 OpenCV 进行视频捕获 (笔记) 简介 这个项目是关于如何从网络摄像头或者视频文件(*.AVI)中捕获视频的,这个项目是用C#和OPENCV编写的. 这将有助于那些喜欢C#和Op ...
- 基于Python & Opencv 图像-视频-处理算法
Alg1:图像数据格式之间相互转换.png to .jpg(其他的请举一反三) import cv2 import glob def png2jpg(): images = glob.glob('*. ...
- 【计算机视觉】OpenCV读取视频获取时间戳等信息(PS:经测试并不是时间戳,与FFMPEG时间戳不一样)
OpenCV中通过VideoCaptrue类对视频进行读取操作以及调用摄像头,下面是该类的API. 1.VideoCapture类的构造函数: C++: VideoCapture::VideoCapt ...
- OpenCV学习笔记(2)——如何用OpenCV处理视频
如何用OpenCV处理视频 读取视频文件,显示视频,保存视频文件 从摄像头获取并显示视频 1.用摄像头捕获视频 为了获取视频,需要创建一个VideoCapature对象.其参数可以是设备的索引号,也可 ...
- OpenCV的视频读取
现在找一个能拍摄视频的设备真是太容易了.结果大家都用视频来代替以前的序列图像.视频可能由两种形式得到,一个是像网络摄像头那样实时视频流,或者由其他设备产生的压缩编码后的视频文件.幸运的是,OpenCV ...
- OpenCV读写视频文件解析(二)
OpenCV读写视频文件解析(二) VideoCapture::set 设置视频捕获中的属性. C++:bool VideoCapture::set(int propId, double value) ...
- OpenCV读写视频文件解析
OpenCV读写视频文件解析 一.视频读写类 视频处理的是运动图像,而不是静止图像.视频资源可以是一个专用摄像机.网络摄像头.视频文件或图像文件序列. 在 OpenCV 中,VideoCapture ...
- 在MacOS和iOS系统中使用OpenCV
在MacOS和iOS系统中使用OpenCV 前言 OpenCV 是一个开源的跨平台计算机视觉库,实现了图像处理和计算机视觉方面的很多通用算法. 最近试着在 MacOS 和 iOS 上使用 OpenCV ...
- 使用opencv显示视频的方法
下面对使用opencv显示视频做一个简单的记录.当然,网上这方面的资料已经数不胜数了,我只是将其简单记录,总结一下. 在opencv中显示视频主要有: (1)从本地读取视频和调用摄像头读取视频 (2) ...
随机推荐
- 1163 - Bank Robbery
1163 - Bank Robbery In one very cold morning, Mark decides to rob a bank. But while trying hacking ...
- bootstrap组件---进度条
<div class="progress"> <div class="progress-bar progress-bar-success" r ...
- SharePoint 生产环境文件归档
前言 最近,用户提出数据库大小太大,所以,希望把文件归档.至于归档,该怎么做呢? 正文 我们提出的解决方案,占用数据库最主要的就是各种文档,那就按照时间为限制,超过一年的文档全部备份,由用户的IT自行 ...
- JVM类加载器是否可以加载自定义的String
前言 曾经有一次,面试官问到类加载机制,相信大多数小伙伴都可以答上来双亲委派机制,也都知道JVM出于安全性的考虑,全限定类名相同的String是不能被加载的.但是如果加载了,会出现什么样的结果呢?异常 ...
- win10上使用linux命令
(1)可以用windows自带的powershell,但是 ll,vim等命令不能使用 (2)Windows更新==>针对开发人员==>开启开发人员模式,然后在控制面板==>程序与功 ...
- SAP S4HANA如何取到采购订单ITEM里的'条件'选项卡里的条件类型值?
SAP S4HANA如何取到采购订单ITEM里的'条件'选项卡里的条件类型值? 最近在准备一个采购订单行项目的增强的function spec.其中有一段逻辑是取到采购订单行项目条件里某个指定的条件类 ...
- codeforces 995C
题意:从L到R 找有几个x,使x=a^p(a>0,p>1) 题解: 一开始把所有符合的次方都存到vector,然后MLE 可以看到1e6^3=1e18,所以可以将二次方单独来求,其他次方存 ...
- 一个最简单的Dockfile实践
一:一个Dockerfile文件 FROM bash COPY . /usr/jinliang/ WORKDIR /usr/jinliang/ CMD [ "sh", " ...
- .NetCore学习笔记:四、AutoMapper对象映射
什么是AutoMapper?AutoMapper是一个简单的小型库,用于解决一个看似复杂的问题 - 摆脱将一个对象映射到另一个对象的代码.这种类型的代码是相当沉闷和无聊的写,所以为什么不发明一个工具来 ...
- Bash脚本编程学习笔记07:循环结构体
本篇中涉及到算术运算,使用了$[]这种我未在官方手册中见到的用法,但是确实可用的,在此前的博文<Bash脚本编程学习笔记03:算术运算>中我有说明不要使用,不过自己忘记了.大家还是尽量使用 ...






