先说背景。最近在用C#+EmguCV(其实就是用P/Invoke封闭了OpecCV,与OpenCVDotNet差不多) 做一个视频的东西。视频是由摄像头采集回来的1f/s,2048X1000大小,其实是由一张张位图(Bitmap)未经压缩制成的avi视频文件,而且图像很不清楚。在GSpot可以看出视频是BI_RGB Raw Bitmap编码,所以我用EmguCV里的Capture(string filename)(即cvCaptureFromFile(string filename))这个函数从文件打不开Capture(几乎所有编码器都装了但还是打不开,如果有人知道怎么打开请赐教,那就没有下文的内容了,非常感谢),于是不得不用其它方法。我的做法是用Windows API函数的AVI File Functions这一系列函数(在AVIFIL32.dll里)打开,然后得到一帧一帧的数据流,最后把它转化成Bitmap。当然,这中间用到了P/Invoke封闭这些函数。

但是可气的是EmguCV里所有的操作都是针对他自己的封闭类型Image<TColor,TDepth>来操作的,由于我的是8位单通道灰度图像即Image<Gray,byte>。办法有:

(一)显然,最简单的办法就是用Image<Gray,byte>(Bitmap bmp)这个构造函数来构造Image<Gray,byte>。但是在运行过程中发现图像加载非常的慢慢,最先还以为是图像预处理比如高斯平滑滤波、腐蚀等造成的,可是当我用Stopwatch查看才发现Image<Gray,byte>(Bitmap bmp)这个构造函数来构造Image<Gray,byte>这个过程就花了6-8秒,这是肯定不能接受的。

(二)在查看了EmguCV的源代码后我又使用了Image.Bitmap函数来直接set位图,但是这一步仍然要花6-8秒。

(三)后来想用不安全代码将位图的数据直接转化成Image<Gray,byte>,我写了半天,仍然没有成功,(要是哪个知道也请告知)

(四)因为后来发现Image<Gray,byte>的构造函数中有从文件中直接加载这一项,试过后发现这一过程很快,于是有了这个方法。

1.从avi中得到位图

2.将位图保存为临时文件,考虑其它因素,文件放在了用户临时文件夹

3.将2中保存的位图文件加载到Image<Gray,byte>中

4.删除位图临时文件

最后运行的结果是:以上四步在0.2-0.3秒左右。顺利到达要求。

 //得到指定帧的位图,这个是自定义函数
_bmpCurrentBMP = _aviFile.GetFrameAsBitmap(index);
try
{
  //用以下方法只用时间0.2s左右
  //保存位图于临时文件夹
   _bmpCurrentBMP.Save(_ImageTempFileName);
  //从文件中加载位图
  _pCurrentImageRGB = new Image<Bgr, byte>(_ImageTempFileName);
  //删除位图
  File.Delete(_ImageTempFileName);
}
catch (IOException ex)
{
  MessageBox.Show(ex.Message);
  return;
}

最新文章

  1. μCos-ii学习笔记1_概述
  2. 用Model-View-ViewModel构建iOS App(转)
  3. 【转】伪静态URLRewrite学习笔记
  4. modelsim仿真xilinx mig ip core相关问题
  5. Oracle学习线路
  6. jquery原型方法map的使用和源码分析
  7. concat、reverse面试题
  8. jQuery 的 live() 方法对 hover 事件的处理
  9. Maven+SpringMVC+Mybatis 开发环境整合
  10. 专用管理连接(DAC)和单用户模式
  11. mysql的left jion:就是left outer join(right join同理)
  12. abc
  13. Word技巧【转载】
  14. (转)以太坊(Ethereum)全零地址(0x000000...)揭秘
  15. spring容器bean的作用域 &amp; spring容器是否是单例的一些问题
  16. Android中startService的使用及Service生命周期
  17. 第10课 struct和union分析
  18. hdu 1054 Strategic Game 经典树形DP
  19. scala(二)
  20. angular4 form表单验证

热门文章

  1. RNA组研究困难
  2. 移植zlib
  3. Creo 2.0 Toolkit 解锁的问题
  4. JNI的第2种写法:本地方法注册
  5. VuePress 中增加用户登录功能
  6. PAT Basic 1034 有理数四则运算(20) [数学问题-分数的四则运算]
  7. flask框架-下
  8. 【按位dp】1出现的次数
  9. c++语法(1)
  10. request请求生命周期