原文: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年前

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:

  1. 创建一个新的 Windows Application 项目,命名为‘Two Layer’.

  2. 选择引用, 右键点击添加引用.

  3. 选择 Browse 选项卡, 找到“C:\Emgu\emgucv-windows-universal-gpu2.4.9.1847\bin”, 选择“Emgu.CV.dll”,”Emgu.CV.UI.dll”,”Emgu.Util.dll” 三个文件, 并点击ok.

  4. 引用就会在Solution Explorer中出现.

leoxu

翻译于 2年前

0人顶

 翻译的不错哦!

捕获视频

捕获视频功能,捕获视频有两种方式,一种是从摄像机捕获,第二种是从视频文件捕获。接下来的部分,代码会向你展示如果从摄像机捕获视屏.

在这一节中, 捕获, FRAME PER SECOND 设置为 30 FPS, 视频文件捕获的高和宽分别设置为 240, 320 . 然后video_seek
被初始化为零 '0', 这个视频搜寻控制会在视频限制的低位和高位之间搜索视频.

下面的语句在应用程序中最有用. 它有点像多线程. 当应用程序进入到空闲状态,"ProcessFrame" 就会一直调用直到视频帧结束或者直到帧不为 'null'.


1
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();

函数在按帧率划分的特定时间休眠.

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 进行视频捕获 (笔记)的更多相关文章

  1. [转] c# 中使用opencv进行视频捕获

    简介 这个项目是关于如何从网络摄像头或者视频文件(*.AVI)中捕获视频的,这个项目是用C#和OPENCV编写的. 这将有助于那些喜欢C#和OpenCV环境的人.这个程序完全基于Visual Stud ...

  2. 利用opencv实现视频捕捉功能

    import cv2 as cv import numpy as np def video_demo(): capture = cv.VideoCapture(0) #打开摄像头,参数0代表设备ID( ...

  3. OpenCV学习笔记(2)——如何用OpenCV处理视频

    如何用OpenCV处理视频 读取视频文件,显示视频,保存视频文件 从摄像头获取并显示视频 1.用摄像头捕获视频 为了获取视频,需要创建一个VideoCapature对象.其参数可以是设备的索引号,也可 ...

  4. python+opencv选出视频中一帧再利用鼠标回调实现图像上画矩形框

    最近因为要实现模板匹配,需要在视频中选中一个目标,然后框出(即作为模板),对其利用模板匹配的方法进行检测.于是需要首先选出视频中的一帧,但是在利用摄像头读视频的过程中我唯一能想到的方法就是: 1.在视 ...

  5. 使用OpenCV通过摄像头捕获实时视频并探测人脸

    在Opencv初接触,图片的基本操作这篇手记中,我介绍了一些图片的基本操作,视频可以看作是一帧一帧的图片,因此图片操作其实是视频操作的基础,这篇手记就来讲讲OpenCV中的视频操作,并实现一个用笔记本 ...

  6. OpenCV之Python学习笔记

    OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书< ...

  7. opencv保存视频

    利用opencv提供的方法,从摄像头获取视频,并保存为.avi格式文件. win8.1,opencv248,vs2013下测试 #include<opencv\cv.h> #include ...

  8. 基于Python & Opencv 图像-视频-处理算法

    Alg1:图像数据格式之间相互转换.png to .jpg(其他的请举一反三) import cv2 import glob def png2jpg(): images = glob.glob('*. ...

  9. opencv+python视频实时质心显示

    利用opencv+python实现以下功能: 1)获取实时视频,分解帧频: 2)将视频做二值化处理: 3) 将视频做滤波处理(去除噪点,获取准确轮廓个数): 4)识别图像轮廓: 5)计算质心: 6)描 ...

随机推荐

  1. CSDN站点CODE配置记录

    为了出门写代码方便.决定还是开个项目.因此才有了这次经历. 原来有在windows下用过git,只是使用方法跟svn一样.尽管曾经也在souceforge或者git上看一些代码,可是对操作一直没有了解 ...

  2. iOS中js与objective-c的简单交互

    1.首先是objective-c调用js中的代码,可以用UIWebview中的一个方法 stringByEvaluatingJavaScriptFromString:后面接的是js中的方法名.这个函数 ...

  3. try catch finally中的return

    try catch 中finally语句总是可以执行的,不管try中是否含有return语句 public class TestReturn { public static void main(Str ...

  4. 电子商务系统的设计与实现(七):前后端系统UI设计的一些思考

    对于大部分开发者来说,写界面是最烦人的事.我想,开发者最初诞生,以及我们在大学学习的时候,更加侧重的是程序设计和逻辑思维,而不是界面.界面更象是艺术,艺术和程序设计是两回事. 我个人还是想成为全栈式开 ...

  5. 英文构词法 —— ant、ent 后缀

    1. -ant:--人 accountant:会计, account(ac+count):计数,账户: assistant:助手: assist:帮助 descendant:后裔: descend:下 ...

  6. C# 控制台使用 UAC 权限

    原文:C# 控制台使用 UAC 权限 本文告诉大家如何在 C# 控制台项目使用 UAC 权限.这个方法在 WPF 和 控制台都是可以使用. 右击项目,点击添加文件,找到程序清单 在 WPF 使用 UA ...

  7. JSP和Servlet学习笔记1 - 访问配置

    1. 访问 WebContent 目录下的 JSP 文件 在 WebContent 目录下的文件可以直接在浏览器中访问.新建一个 test.jsp 文件 <%@ page language=&q ...

  8. EasyUI入门:怎样引入及简单使用

    或许,仅仅有当做比較大的项目的时候,才会发现封装好的东西会为程序员们带来多少方便.合作开发的时候更应该强调复用,才干更加发挥团队的优势. 今天使用了一些EasyUI,发现非常wonderful! 比方 ...

  9. WPF 通过位处理合并图片

    原文:WPF 通过位处理合并图片 本文告诉大家,在使用 WPF 合并两张图片的处理,可以使用像素之间的与或和异或的方式,对三个颜色的通道进行处理. 先给大家看一下软件的界面 这就是通过将左边的两张图片 ...

  10. 我已经写了DAL层的代码生成器

    (1)创建您自己的解决方案 文件夹结构如以下: (2)编写代码: (要使用数据库 建议创建随意数据库就可以) 创建配置文件App.config代码例如以下: <?xml version=&quo ...