【发布时间】:2015-05-27 20:41:17
【问题描述】:
编辑:已解决!请在下面查看我的答案以了解详细信息。 我无法找到原始问题的答案,但我找到了替代解决方案
这个问题可能会在其他地方被问到,但我已经搜索了好几天,找不到任何有用的东西。
问题:我需要一次性将“Stream”转换为“image(bgr, byte)”,有没有办法/命令直接从系统转换.Drawing.Image.FromStream 到 Emgu.CV.Image(Bgr, Byte) 不从 stream 转换为 image 到 bitmap 到 图像(bgr,字节)?
信息:作为我的论文项目的一部分,我在 Visual Studio 2010 中使用 c# 进行编码。 我正在从网络上的 IP 摄像机获取图像流,并应用许多算法来检测面部/提取面部特征并识别个人面部。在我的笔记本电脑本地摄像头上,我可以实现大约 25~(给或取)的 FPS,包括算法,因为我不必转换图像。对于 IP 摄像机流,我需要对其进行多次转换以达到所需的格式,结果约为 5-8fps。
(我知道我目前的方法效率极低,这就是我在这里的原因,我实际上将图像总共转换了 5 次(甚至是灰度缩放),实际上只使用了我的处理器内存的一半(i7、8gb RAM ))。它必须是 image(bgr, byte),因为这是算法将使用的唯一格式。
我用来获取图像的代码:
//headers
using System.IO
using System.Threading;
using System.Net;
//request a connection
req = (HttpWebRequest)HttpWebRequest.Create(cameraUrl);
//gives chance for timeout for errors to occur or loss of connection
req.AllowWriteStreamBuffering = true;
req.Timeout = 20000;
//retrieve response (if successfull)
res = req.GetResponse();
//image returned
stream = res.GetResponseStream();
我在后台管理连接、数据、安全等方面有很多东西,我已将其简化为上述代码。 我当前将图像转换为所需输出的代码:
//Convert stream to image then to bitmap
Bitmap bmpImage = new Bitmap(System.Drawing.Image.FromStream(stream));
//Convert to emgu image (desired goal)
currentFrame = new Emgu.CV.Image<Bgr, Byte>(bmpImage);
//gray scale for other uses
gray = currentFrame.Convert<Gray, Byte>();
我知道有一种方法可以暂时在本地保存图像,但出于安全考虑,我需要避免这种情况。我正在寻找更多的直接转换来帮助节省处理能力。 我忽略了什么吗?感谢所有帮助。
感谢阅读。 (如果有人要求更多详细信息,我会更新此内容) -戴夫
【问题讨论】:
-
您可以使用 Stopwatch 类来衡量每条线路的性能吗? (最后 3 行)
-
我没有用它来衡量性能,但如果你给我一点时间,我会一起拍一些东西并发表评论。最后 3 行是它进行 5 次转换、绘制到图像框并渲染算法输出同时准备下一帧的原因
-
@VanoMaisuradze 秒表类表明完成这 3 行的任务需要 00:00:00:0343616 (想想以毫秒为单位)。
-
您从相机中得到什么样的图像?我怀疑它是 jpeg。
-
您是否考虑过/尝试过使用多核?
标签: c# image emgucv type-conversion