先说背景。最近在用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. 吴裕雄--天生自然 PHP开发学习:条件语句

    <?php $t=date("H"); if ($t<"20") { echo "Have a good day!"; } ?& ...

  2. Linux下idea由于缺少相关权限导致的tomcat ERROR

    昨天一天都在倒腾两个系统,也是醉了. 不过还好,系统修好了,在ubuntu下重新安装idea后,出现了这个错误: Intellij Idea Tmocat Error running Tomcat: ...

  3. PPT制作不加班的十个小窍门

    五个一键: 情景一: 上司:小万,什么字体啊这是,全部换成微软雅黑. 一键替换字体: 单击任意文本框——开始菜单栏——替换(下拉三角)——替换字体——替换为——替换.   情景二: 上司:小万,“咖啡 ...

  4. java反射使用详细例子

    1. 概念 反射,一种计算机处理方式.是程序可以访问.检测和修改它本身状态或行为的一种能力. 2. 反射机制的作用 通过反机制访问java类的属性,方法,构造方法等: 3.反射机制中的类 (1) ja ...

  5. saturates|meteoric|enclose|marooned|predators|Pioneer community|salinization|condenser|embodied

    saturates渗透 meteoric蒸汽 enclose包围 Pioneer community 先锋群落 Climax community顶级群落 cumulative积累 Rebound 回弹 ...

  6. JavaEE--分布式与集群

    参考:https://www.zhihu.com/question/20004877 集群是个物理形态,分布式是个工作方式. 只要是一堆机器,就可以叫集群,他们是不是一起协作着干活,这个谁也不知道:一 ...

  7. liunx常用命令笔记

    安装软件教程 linux安装java:https://www.cnblogs.com/lamp01/p/8932740.html linux安装mysql:https://www.cnblogs.co ...

  8. CodeForces 263E Rhombus

    洛谷题目页面传送门 & CodeForces题目页面传送门 给定一个$n$行$m$列的矩阵,第$i$行$j$列为$a_{i,j}$,以及一个常数$s\in\left[1,\left\lceil ...

  9. LeetCode——919.完全二叉树插入器

    完全二叉树是每一层(除最后一层外)都是完全填充(即,结点数达到最大)的,并且所有的结点都尽可能地集中在左侧. 设计一个用完全二叉树初始化的数据结构 CBTInserter,它支持以下几种操作: CBT ...

  10. C#匿名委托,匿名函数,lambda表达式

    一.类型.变量.实例之间的关系. 类型>变量>实例 类型可以创建变量,实体类可以创建实例,实例可以存储在变量里. 二.委托使用过程: 1.定义委托(写好签名): 2.创建委托变量: 3.给 ...