Modifica: RISOLTO! Si prega di vedere la mia risposta in basso per i dettagli. Non sono riuscito a trovare una risposta alla domanda originale ma ho trovato una soluzione alternativaConversione dell'immagine in C#
Questa domanda può essere chiesta da qualche altra parte ma ho cercato per giorni e non riesco a trovare nulla che aiuti.
Domanda: Ho bisogno di convertire "Stream" a "immagine (BGR, byte)" in un colpo solo, c'è un comando/modo per convertire direttamente da System.Drawing.Image.FromStream a Emgu. CV.Image (BGR, byte) senza la conversione da flusso-immagine-bitmap-immagine (BGR, byte)?
Informazioni: sto codifica in C# in Visual Studio 2010 come parte del mio progetto di tesi. Sto acquisendo un flusso di immagini da una telecamera IP su una rete e applicando molti algoritmi per rilevare i volti/estrarre le caratteristiche facciali e riconoscere un volto di individui. Sulla mia fotocamera locale con i laptop posso ottenere FPS di circa 25 ~ (dare o prendere) inclusi gli algoritmi perché non devo convertire l'immagine. Per un flusso di telecamere IP ho bisogno di convertirlo più volte per ottenere il formato desiderato e il risultato è di circa 5-8 fps.
(So che il mio metodo attuale è estremamente inefficiente ed è per questo che sono qui, in realtà sto convertendo un'immagine 5 volte totale (anche in grigio), in realtà usando solo metà della memoria dei miei processori (i7, 8gb RAM)). Deve essere l'immagine (bgr, byte) poiché questo è l'unico formato con cui gli algoritmi funzioneranno.
Il codice che sto usando per ottenere l'immagine:
//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();
Ho un sacco di roba in background gestione delle connessioni, dati, sicurezza, ecc che ho accorciato al codice di cui sopra. Il mio codice corrente per convertire l'immagine per l'output desiderato:
//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>();
Capisco che ci sia un metodo per salvare un'immagine in locale temporaneamente, ma avrei bisogno di evitare che per motivi di sicurezza. Sto cercando una conversione diretta per risparmiare energia di elaborazione. Sto trascurando qualcosa? Tutto l'aiuto è apprezzato.
Grazie per la lettura. (Aggiornerò questo se qualcuno richiede ulteriori dettagli) -Dave
È possibile utilizzare la classe Cronometro per misurare le prestazioni di ogni linea? (per le ultime 3 righe) –
Non l'ho usato per misurare le prestazioni, ma se mi dai un po 'di tempo darò uno schiaffo a qualcosa e commenterò. Le ultime 3 righe sono ciò che rallenta quando esegue 5 conversioni, attingendo a una imagebox e restituendo gli output dell'algoritmo mentre prepara il prossimo frame – Hughsie28
@VanoMaisuradze La classe cronometro indica che è stato necessario 00: 00: 00: 0343616 per completare l'operazione per quelle 3 righe in particolare (penso che sia in millisecondi). – Hughsie28