先说背景。最近在用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;
}

EmguCV从位图(Bitmap)加载Image<Gray,byte>速度慢的问题的更多相关文章

  1. 【Android】Bitmap加载图片错误 java.lang.OutOfMemoryError: bitmap size exceeds VM budget

    今天测试程序的时候出现下面的错误日志信息,程序当场挂掉 07-09 14:11:25.434: W/System.err(4890): java.lang.OutOfMemoryError: bitm ...

  2. 浅谈Android下的Bitmap之大Bitmap加载

    引言 我们常常提到的“Android程序优化”,通常指的是性能和内存的优化,即:更快的响应速度,更低的内存占用.Android程序的性能和内存问题,大部分都和图片紧密相关,而图片的加载在很多情况下很用 ...

  3. 后台执行Bitmap加载

    如果加载图片时,使用的图片数据源不是来自于内存,而是来自硬盘或网络时,一般不会再UI线程执行图片加载操作. 图片的加载速度取决于很多方面(往往具有不可预测性),比如:硬盘或者网络的读写速度.图片大小. ...

  4. html img加载不同大小图像速度

    最近要想法提高网页的性能,在查看图片加载时,产生了试验的想法.一直以来都没有太去深究,还是挖掘一下的好. 很简单的试验,<img>加载两个图像,一个2.3MB,5000*5000,一个22 ...

  5. 图片_ _优化Bitmap加载图片1

    ===========  1   视图显示大量图片时的内存问题 setBackgroundResource 回去res 资源文件里面找适配手机当前屏幕的文件,所以消耗高,etBackgroundDra ...

  6. bitmap 加载的时候出现OOM,nullpointer

    1.OOM :对图片进行压缩,效果还不错:http://182.92.150.15:9876/static/server/topic_user/8068/201506/e5b37fec-0919-11 ...

  7. C# WPF 从网络加载图片到byte[]数组中 Stream转byte[]代码

    折腾一中午 因为NetworkStream不支持Length属性 private byte[] GetImageFromResponse(WebResponse response) { using ( ...

  8. android报错及解决1--Bitmap加载时,报bitmap size exceeds VM budget

    报错描述: 用Bitmap加载图片资源时,报错java.lang.OutOfMemoryError: bitmap size exceeds VM budget 原因分析: android系统限制,只 ...

  9. Android艺术——Bitmap高效加载和缓存(1)

    通过Bitmap我们可以设计一个ImageLoader,实现应该具有的功能是: 图片的同步加载:图片的异步加载:图片的压缩:内存缓存:磁盘缓存:网络获取: 1.加载 首先提到加载:BitmapFact ...

随机推荐

  1. 十六、matplotlib统计图

    '''Matplotlib 是一个Python的 2D绘图库.通过 Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,错误图,散点图等.通过学习Matplotli ...

  2. 在excel中评估模型性能

    一直在用的结果, 从代码中整理出来. 评分卡模型的结果一般在excel中即可计算完成. 下面是在number中计算评分卡模型的性能(KS/AUC), 表格中百分数省略%

  3. axios 等待同步请求用法及多请求并发

    axios等待同步请求 直接上代码 首先在函数中返回一个Promise对象,在调用函数使用同步函数,调用目标函数使用await等待即可 参考http://www.cnblogs.com/cckui/p ...

  4. Python笔记_第四篇_高阶编程_进程、线程、协程_1.进程

    1. 多任务原理: 现代操作系统,像win,max os x,linux,unix等都支持多任务. * 什么叫做多任务? 操作系统可以同时运行多个任务. * 单核CPU实现多任务原理? 操作系统轮流让 ...

  5. excel 导出长数据 变成科学计数 解决办法

    加 “\t”

  6. 解析java实体类

    对java实体类的众多理解: A .就是属性类,通常定义在model层里面 B. 一般的实体类对应一个数据表,其中的属性对应数据表中的字段. 好处: 1.对对象实体的封装,体现OO思想. 2.属性可以 ...

  7. 【MySQL参数】-innodb_additional_mem_pool_size

    原博客:https://yq.aliyun.com/articles/32384

  8. 正确返回Unicode码点大于0xFFFF的字符串长度

    如下: function codePointLength(text){ var result = text.match(/[\s\S]/gu); return result? result.lengt ...

  9. springboot+mybatis+通用mapper+多数据源(转载)

    1.数据库准备 数据库表我们在springboot-mybatis数据之外,新建数据库springboot-mybatis2: springboot-mybatis数据库中有t_class表: spr ...

  10. JQuery 点击子控件事件,不会触发父控件的事件

     $('.order-delete').on('tap', function (e) {                  console.log('删除1');                  c ...