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
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 步: 设置环境变量: 在用户和系统变量中设置如下的三个路径.
第 3 步: 配置 Visual Studio 2010:
|
![]() leoxu
0人顶 顶 翻译的不错哦! |
捕获视频捕获视频功能,捕获视频有两种方式,一种是从摄像机捕获,第二种是从视频文件捕获。接下来的部分,代码会向你展示如果从摄像机捕获视屏. 在这一节中, 捕获, FRAME PER SECOND 设置为 30 FPS, 视频文件捕获的高和宽分别设置为 240, 320 . 然后video_seek 下面的语句在应用程序中最有用. 它有点像多线程. 当应用程序进入到空闲状态,"ProcessFrame" 就会一直调用直到视频帧结束或者直到帧不为 'null'.
在从视频文件捕获的代码中,我们需要总帧数来设置视频搜寻控制的上限. FOURCC 被用来找到多媒体的编码解码器名称. |
![]() leoxu
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(); |
函数在按帧率划分的特定时间休眠.
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进行视频捕获
简介 这个项目是关于如何从网络摄像头或者视频文件(*.AVI)中捕获视频的,这个项目是用C#和OPENCV编写的. 这将有助于那些喜欢C#和OpenCV环境的人.这个程序完全基于Visual Stud ...
- 利用opencv实现视频捕捉功能
import cv2 as cv import numpy as np def video_demo(): capture = cv.VideoCapture(0) #打开摄像头,参数0代表设备ID( ...
- OpenCV学习笔记(2)——如何用OpenCV处理视频
如何用OpenCV处理视频 读取视频文件,显示视频,保存视频文件 从摄像头获取并显示视频 1.用摄像头捕获视频 为了获取视频,需要创建一个VideoCapature对象.其参数可以是设备的索引号,也可 ...
- python+opencv选出视频中一帧再利用鼠标回调实现图像上画矩形框
最近因为要实现模板匹配,需要在视频中选中一个目标,然后框出(即作为模板),对其利用模板匹配的方法进行检测.于是需要首先选出视频中的一帧,但是在利用摄像头读视频的过程中我唯一能想到的方法就是: 1.在视 ...
- 使用OpenCV通过摄像头捕获实时视频并探测人脸
在Opencv初接触,图片的基本操作这篇手记中,我介绍了一些图片的基本操作,视频可以看作是一帧一帧的图片,因此图片操作其实是视频操作的基础,这篇手记就来讲讲OpenCV中的视频操作,并实现一个用笔记本 ...
- OpenCV之Python学习笔记
OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书< ...
- opencv保存视频
利用opencv提供的方法,从摄像头获取视频,并保存为.avi格式文件. win8.1,opencv248,vs2013下测试 #include<opencv\cv.h> #include ...
- 基于Python & Opencv 图像-视频-处理算法
Alg1:图像数据格式之间相互转换.png to .jpg(其他的请举一反三) import cv2 import glob def png2jpg(): images = glob.glob('*. ...
- opencv+python视频实时质心显示
利用opencv+python实现以下功能: 1)获取实时视频,分解帧频: 2)将视频做二值化处理: 3) 将视频做滤波处理(去除噪点,获取准确轮廓个数): 4)识别图像轮廓: 5)计算质心: 6)描 ...
随机推荐
- 最好用的中文速查表(Bash,Gdb,VIM,Nano)
最好用的中文速查表(Cheatsheet) 当年学习 Linux 时就是靠着一张常用命令小卡片,敲啥命令忘记了,经常拿起来看看,后来知道这玩意儿叫做速查表(Cheatsheet),于是开始有意识收集和 ...
- erlang判断模块导出函数问题
erlang本身提供一个接口,可以用来检查模块是否有导出函数,这个接口是erlang:function_exported/3,但是很多时候这个接口无法正常使用. 下面重现一下这个问题: 1> e ...
- NOIP 模拟 box - 费用流 / 匈牙利
题目大意: 给出n(\(\le 200\))个盒子,第i个盒子长\(x_i\),宽\(y_i\),一个盒子可以放入长宽都大于等于它的盒子里,并且每个盒子里只能放入一个盒子(可以嵌套),嵌套的盒子的占地 ...
- 【codeforces 782A】Andryusha and Socks
[题目链接]:http://codeforces.com/contest/782/problem/A [题意] 如果手套没有成一双,那么其中的一只就会被放在桌子上; 问你桌子上手套的只数最多的时候有几 ...
- 【p093】细胞分裂
Time Limit: 1 second Memory Limit: 128 MB [问题描述] Hanks博士是BT(Bio-Tech,生物技术)领域的知名专家.现在,他正在为一个细胞实验做准备工作 ...
- 【t059】序列
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 生活中,大多数事物都是有序的,因为顺序的美是最令人陶醉的.所以现在RCDH看了不顺的东西就头痛.所以他 ...
- WPF 渲染原理
原文:WPF 渲染原理 在 WPF 最主要的就是渲染,因为 WPF 是一个界面框架.想用一篇博客就能告诉大家完整的 WPF 渲染原理是不可能的.本文告诉大家 WPF 从开发者告诉如何画图像到在屏幕显示 ...
- 详尽分析世纪之战:360VS腾讯是两个阶层的抗争
很不错的一篇文字 分析的也很透彻 [转自中国移动http://labs.chinamobile.com/] 来源:搜狐IT 作者:吃熊掌的鱼 2010-11-01 10:11:51 [ 13967阅 ...
- numpy 辨异(二) —— np.identity()/np.eye()
import numpy as np; 两者在创建单位矩阵上,并无区别,两者的区别主要在接口上: np.identity(n, dtype=None):只能获取方阵,也即标准意义的单位阵: np.ey ...
- 关于ExpandableListView的一个小例子
喜欢显示好友QQ那样的列表,可以展开,可以收起,在android中,以往用的比较多的是listview,虽然可以实现列表的展示,但在某些情况下,我们还是希望用到可以分组并实现收缩的列表,那就要用到an ...