先说背景。最近在用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. ZOJ 1276 DP

    给出一系列的1x2的矩阵,要你求出矩阵以什么样的次序相乘才使得相乘次数最少,.(不用排序,只要决定该矩阵是和前面相乘比较好,还是后面). 今天仔细想了一下,跟之前做的DP题目做了下对比,你比如说猴子堆 ...

  2. idea使用eclipse风格

    说明,只是代码编辑区采用eclipse风格,其他用的是idea的IntelliJ(白色风格) 1.下载文件 2.配置

  3. 可塑性|Exosomes

    五流解释 肿瘤发源于不同组织如果不从各种组织出发,则不能有正确的解决方法. Hallmarks of cancer LncRNAs操作流 Exosomes ,它的基本故事是平衡流,但是具体内涵是操作流 ...

  4. Java--HashMap排序

    package connection; import java.util.Collections; import java.util.Comparator; import java.util.Hash ...

  5. Dynamics CRM - 如何通过 C# Plugin 给 Contact的 主键(FullName)赋值

    Contact 是 CRM 默认带有的 Entity,主键是 <FullName>,根据开发需求,与主键相关的字段都被设置成隐藏,包括了<Full Name>,<Firs ...

  6. 更改php.ini配置

    vi /etc/php.ini #编辑修改 @ini_set('memory_limit',        '64M');                                      / ...

  7. Java - 记录String中intern()方法的学习与理解

    intern()方法:把堆中的引用丢入常量池中,然后返回这个引用.当常量池中已经存在这个引用,就直接返回这个引用.(jdk1.8) 由于jdk1.7中将字符串常量池改为存放在堆中,因此intern() ...

  8. jq监控滑动

    $(window).scroll(function () { if ($(window).scrollTop() == $(document).height() - $(window).height( ...

  9. c语言中指针和多维数组的理解

    1.复习指针和数组之间的特殊关系:不带方括号的数组名是一个指针,指向该数组的第一个元素. 2.多维数组: ][];//声明一个二维数组作为举例 a.理解方式1:可以将数组看成行和列构成,即理解成2行4 ...

  10. 题解-------CF372C Watching Fireworks is Fun

    传送门 一道有趣的DP 题目大意 城镇中有$n$个位置,有$m$个烟花要放.第$i$个烟花放出的时间记为$t_{i}$,放出的位置记为$a_{i}$.如果烟花放出的时候,你处在位置$x$,那么你将收获 ...