2016-04-05 12 views
0

私は同様の質問を見つけました emgu Calculate histogram with matrices ...しかし、いくつかのステップがありません!ビンの値を浮動小数点配列のdensehistogramにロード

私はSQL Serverのvarbinary型(最大)に保存されているいくつかのイメージの一つの画像を比較しようとしているEmgu 3/C#の/ SQLサーバー2014

いくつかの画像(オブジェクト)が類似しているかもしれないが色が異なるため、ヒストグラムを比較することです。比較アルゴリズムでは、比較するオブジェクトの色も考慮する必要があります。

私はここの他の記事に基づいて一緒にいくつかのコードを入れてうまく管理しました、と私は画像に基づいてヒストグラムを計算する場合、私は、首尾よくそれをやってすることができるよ

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からの読み取り、deserializeと私のビンの値を正確に抽出されたものとフロート[256]に戻って取得することができます。バックDensehistogramにデータをロードするために

私はこれをやっている:

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

を私は行列データは{フロート[256,1]}であることを奇妙見つけます。 binvaluesの値は[0,0]から[255,0]にロードされます。

私は最後のステップ

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

を行うと、問題がヒストグラムbinvaluesが正しくロードされないで、のみ[0] 135の値と他の人を持っている[255]は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(); 
} 

あなたは、データベースからdeserialiseと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); 
関連する問題