2016-04-05 9 views
0

Ich fand eine ähnliche Frage emgu Calculate histogram with matrices ... aber ich vermisse einige Schritte!Load Bin-Werte zu Dichtehistogramm von Float-Array

Emgu 3/C#/SQL Server 2014

Ich versuche, ein Bild zu vergleichen mit mehreren Bildern in einer varbinary (max) in SQL Server gespeichert.

Mein erster Schritt von vielen ist es, Histogramme zu vergleichen, weil einige Bilder (Objekte) ähnlich, aber mit verschiedenen Farben sein können. Daher möchte ich in meinem Vergleichsalgorithmus auch die Farbe der zu vergleichenden Objekte berücksichtigen.

Ich habe manged zusammen einige Code setzen hier auf der Grundlage anderer Posten, und ich bin in der Lage erfolgreich zu tun, wenn ich berechnen die Basis Histogramme auf die Bilder:

histBlueSource.Calculate(new Image<Gray, byte>[] { imgBlueSource }, true, null); 
histBlueTarget.Calculate(new Image<Gray, byte>[] { imgBlueTarget }, true, null); 

double cBlue = CvInvoke.CompareHist(histBlueSource, histBlueTarget, HistogramCompMethod.Correl); 

Da Fragen der Leistung Beim Laden der Bilder aus der Datenbank dachte ich daran, die BinValues ​​aus den Histogrammen zu extrahieren und sie einfach in der SQL SERVER-Datenbank zu speichern, um sie später wieder in ein DenseHistogram hochzuladen.

ich extrahieren erfolgreich die binvalues ​​mit:

//** problem may be here - dont know if i should SAVE/LOAD bin value to a 1d FLOAT[256] 
float[] BlueHist = new float[256]; 
BlueHist = histBlue.GetBinValues(); 

ich serialisiert, um SQL Server zu speichern. Ich kann das von SQL-Server lesen, deserialisieren und mit meinen bin-Werten genau wie die extrahierten zu einem float [256] zurückkehren.

Um die Daten wieder zu einem Densehistogram laden diese ich tue:

DenseHistogram histBlue = new DenseHistogram(256, new RangeF(0.0f, 255.0f)); 
BlueHist = (float[])bformatterBlue.Deserialize(memStreamBlue); 
//**Other problem may be here 
Matrix<float> mtx = new Matrix<float>(BlueHist); 

finde ich seltsam, dass Matrix-Daten {float [256,1]}. Die Werte aus den Binwerten werden dann von [0,0] bis [255,0] geladen.

Als ich den letzten Schritt tue

histBlue.Calculate(new Matrix<float>[] { mtx }, false, null); 

Das Problem das Histogramm binvalues ​​ist nicht korrekt geladen, nur die [0] einen Wert von 135 hat und die andere [255] 0.

Kann mir bitte jemand mit diesem oder anderen Vorschlag helfen, das selbe zu machen?

Antwort

0

Das funktioniert für mich .... Sie können ein DenseHistogram nicht serialisieren, aber Sie können eine Mat serialisieren. Sie können die Darstellung später dann in einem SQL Server Varbinary-Feld speichern.

Hier ist ein Beispiel Serialisierungscode. In diesem Beispiel arbeite ich mit einem Graustufenbild.

Image<Gray, Byte> croppedImage = sourceImage.Copy(); 

DenseHistogram hist1 = new DenseHistogram(256, new RangeF(0.0f, 255.0f)); 
hist1.Calculate<Byte>(new Image<Gray, byte>[] { croppedImage }, true, null); 

Mat matFromHistogram = new Mat(hist1.Size, hist1.Depth, hist1.NumberOfChannels, hist1.DataPointer, hist1.Step); 

byte[] histogramBytes; 

using (MemoryStream stream = new MemoryStream()) 
{ 
    BinaryFormatter bformatter = new BinaryFormatter(); 
    bformatter.Serialize(stream, matFromHistogram); 
    histogramBytes = stream.GetBuffer(); 
} 

Sie können dann aus der Datenbank deserialise und einen Vergleich mit einem DenseHistogram ausführen:

Mat matToCompare; 

using (var memStream = new MemoryStream()) 
{ 
    byte[] bytes = face.Histogram; 
    BinaryFormatter bformatter = new BinaryFormatter(); 
    memStream.Write(bytes, 0, bytes.Length); 
    memStream.Seek(0, SeekOrigin.Begin); 
    matToCompare = bformatter.Deserialize(memStream) as Mat;          
} 

distance = CvInvoke.CompareHist(histSource, matToCompare, HistogramCompMethod.Bhattacharyya);