2016-04-05 17 views
0

Benzer bir soru emgu Calculate histogram with matrices buldum ... ama bazı adımları kaçırmıyorum! Yük değeri değerleri, float dizisinden yoğunluk eşgörünümüne dön

Emgu 3/C#/SQL SQL Server varbinary (max) saklanan çeşitli Görüntüler ile bir resim karşılaştırmak çalışıyorum 2014

Sunucusu.

Birçok ilk adımım, Histogramları karşılaştırmaktır çünkü bazı görüntüler (nesneler) benzer olabilir, ancak farklı renkler sayesinde, karşılaştırma algoritmamda da karşılaştırılacak nesnelerin rengini göz önünde bulundurmak istiyorum.

Burada diğer yayınları temel bir araya koymak bazı kod manged ettik ve başarıyla yapıyor açabiliyorum ben Görüntüler dayalı histogramlar hesaplamak eğer:

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); 

Performanstan dolayi Görüntüleri Veritabanından yüklemekle, BinValues'i histogramlardan çıkarmayı düşündüm ve daha sonra bunları daha sonra bir DenseHistogram'a geri yüklemek için SQL SERVER veritabanına kaydedin.

Ben serialize
//** 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(); 

, sql sunucusuna kaydedin:

başarıyla birlikte binvalues ​​ayıklamak. Sql sunucusundan okuyabiliyorum, deserialize edip, bir float'a [256], bin tane değerlerim ile tam olarak çıkarılmış olanlar olarak geri dönebiliyorum.

Bunu yapmamın geri Densehistogram veri yüklemek için:

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); 

tuhaf buluyorum Matris verisi olduğunu {float [256,1]}. Bin değerlerden gelen değerler daha sonra [0,0] ila [255,0] arasında yüklenir.

I

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

sorun histogram binvalues ​​doğru yüklenmez olan son adımı yalnızca [0] [255] olarak 135 arasında bir değere ve diğerleri olan 0

Birisi bana aynısını yapmak için bu veya başka bir öneri ile lütfen bana yardımcı olabilir mi?

cevap

0

Bu benim için çalışır .... Bir DenseHistogram'ı serileştiremezsiniz, ancak bir Mat'ı serileştirebilirsiniz. Daha sonra temsilini bir SQL Server Varbinary alanında saklayabilirsiniz.

Bazı örnek serileştirme kodları. Bu örnekte gri ölçekli bir görüntü ile çalışıyorum.

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(); 
} 

Daha sonra veritabanından deserialise ve DenseHistogram ile bir karşılaştırma yapabilirsiniz:

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);