Редактировать: SOLVED! Подробнее см. Мой ответ ниже. Мне не удалось найти ответ на исходный вопрос, но я нашел альтернативное решениеПреобразование изображения в C#
Этот вопрос может быть задан где-то в другом месте, но я искал дни и не могу найти ничего, что поможет.
Вопрос: мне нужно преобразовать «поток» на «изображение (BGR, байты)» на одном дыхании, есть ли способ/команда для преобразования непосредственно из System.Drawing.Image.FromStream в Emgu. CV.Image (BGR, байт) без преобразования из потока к изображения к растровый к изображения (БГР, байт)?
Информация: Я кодирования в C# в Visual Studio 2010 как часть моей диссертации проекта. Я беру поток изображений с IP-камеры в сети и применяю много алгоритмов для обнаружения лиц/экстрактов лицевых функций и распознавания лиц. На моем ноутбуке локальная камера я могу достичь FPS около 25 ~ (дать или взять), включая алгоритмы, потому что мне не нужно преобразовывать изображение. Для потока IP-камеры мне нужно многократно преобразовать его для достижения желаемого формата, а результат - около 5-8 кадров в секунду.
(Я знаю, что мой текущий метод чрезвычайно неэффективен, поэтому я здесь, я фактически конвертирую изображение в 5 раз (даже серое масштабирование), на самом деле только половину памяти моего процессора (i7, 8gb ОЗУ)). Это должно быть изображение (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
Можете ли вы использовать класс секундомера для измерения производительности каждой линии? (для последних 3 строк) –
Я не использовал это для измерения производительности, но если вы дадите мне некоторое время, я удалю что-нибудь вместе и прокомментирую. Последние 3 строки замедляют его, когда он делает 5 преобразований, обращаясь к выводам изображений и выводам алгоритма рендеринга при получении следующего кадра. – Hughsie28
@VanoMaisuradze. Секундомер показывает, что для завершения задачи для завершения задачи было выполнено 00: 00: 00: 0343616. эти 3 строки в частности (подумайте, что в миллисекундах). – Hughsie28