从float数组

时间:2016-04-05 12:25:03

标签: c# histogram emgucv

我发现了一个类似的问题 emgu Calculate histogram with matrices ......但我错过了一些步骤!

Emgu 3 / c#/ Sql Server 2014

我试图将一个图像与SQL Server中存储在varbinary(max)中的几个图像进行比较。

我的第一步是比较直方图,因为一些图像(对象)可能相似但颜色不同,所以在我的比较算法中我还想考虑要比较的对象的颜色。

我已经根据其他帖子将一些代码放在一起,如果我根据图像计算直方图,我能够成功地完成它:

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

由于从数据库加载图像时出现性能问题,我想到从直方图中提取BinValues并将它们保存在SQL SERVER数据库中,以便稍后将它们上传回DenseHistogram。

我成功提取了binvalues:

//** 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 server。我可以从sql server读取,反序列化并使用我的bin值返回float [256],与提取的值完全相同。

要将数据加载回密集组图,请执行以下操作:

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

我发现奇怪的是Matrix数据是{float [256,1]}。然后将来自binvalues的值从[0,0]加载到[255,0]。

当我做最后一步时

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

问题是直方图binvalues未正确加载,只有[0]的值为135而其他[255]为0。

有人可以用这个或其他建议来帮助我吗?

1 个答案:

答案 0 :(得分:0)

这对我有用....你不能序列化DenseHistogram,但你可以序列化Mat。然后,您可以将更高版本的表示存储在SQL Server Varbinary字段中。

以下是一些示例序列化代码。在这个例子中,我正在使用灰度图像。

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

然后,您可以从数据库中反序列化并与DenseHistogram进行比较:

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