一杯清酒邀明月
天下本无事,庸人扰之而烦耳。
posts - 3121,comments - 209,views - 578万

  先说背景。最近在用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秒左右。顺利到达要求。

复制代码
 1 //得到指定帧的位图,这个是自定义函数
 2 _bmpCurrentBMP = _aviFile.GetFrameAsBitmap(index);
 3 try
 4 {
 5   //用以下方法只用时间0.2s左右
 6   //保存位图于临时文件夹
 7    _bmpCurrentBMP.Save(_ImageTempFileName);
 8   //从文件中加载位图
 9    _pCurrentImageRGB = new Image<Bgr, byte>(_ImageTempFileName);
10   //删除位图
11   File.Delete(_ImageTempFileName);
12  }
13  catch (IOException ex)
14  {
15    MessageBox.Show(ex.Message);
16    return;
17 }
复制代码
posted on   一杯清酒邀明月  阅读(1323)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示