编辑:已解决! 详细信息请参见下面我的答案。 我找不到原问题的答案,但我找到了一种替代方案。
也许在其他地方有人问过这个问题,但我已经搜索了几天,没有找到任何有用的信息。
问题:我需要一次性将“Stream”转换为“image(bgr,byte)”,是否有一种方法/命令可以直接从System.Drawing.Image.FromStream转换为Emgu.CV.Image(Bgr,Byte),而不必先将其从stream转换为image再转换为bitmap最后再转换为image(bgr, byte)?
信息:我的论文项目中使用c#在Visual Studio 2010中编写代码。我从网络上的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>();
我知道有一种方法可以暂时在本地保存图片,但出于安全考虑,我需要避免使用这种方法。我更希望能直接转换以帮助节省处理能力。
我是否忽略了什么?所有的帮助都将不胜感激。
谢谢您的阅读。(如果有人需要更多细节,我会更新)- Dave