0

画像とそれらの DCT ハッシュを含むコレクションがあります。LINQ where句でSimilarity(long hash, long hashOther)メソッドを使用して類似の画像のみを選択する方法。
このクエリは機能しません:

var results = imageCollection
.AsQueryable()
.Where(x=>ImageHash.Similarity(x.Hash, hash) >= 50)
.ToList();

シリアル化エラーが発生します。

ありがとう!

4

2 に答える 2

1

MongoDB に対して作成する LINQ クエリは、最終的に MongoDB クエリ言語の同等のクエリに変換する必要があることに注意してください。この部分が原因で、作成した LINQ クエリを生の MongoDB クエリに変換することはできません。

.Where(x=>ImageHash.Similarity(x.Hash, hash) >= 50)

MongoDB クエリ言語には同等のものはありません。

あなたがしなければならないことは、すべての Image _id と Hash 値をクライアント側で取得し、類似性基準のクライアント側を実行することです。十分に類似しているすべての画像の _id 値を取得したら、画像自体を取得できます。

画像のサブセットのみが類似性基準クライアント側で実行される必要があるように、クエリに他の基準も含まれることを願っています。

多かれ少なかれ次のようになります。

var matchingIds = collection.FindAllAs<BsonDocument>
    .SetFields("_id", "Hash")
    .AsEnumerable() // force client side evaluation of the rest of the query
    .Where(x => ImageHash.Similarity(x["Hash"].AsByteArray, hash) > 50))
    .Select(x => x["_id"]);
var query = Query.In("_id", matchingIds);
var matchingImages = collection.Find(query);
foreach (var image in matchingImages)
{
    // process matching image
}
于 2014-01-23T18:44:13.043 に答える
0

コメントで言っているように、POCO クラスを試しましたか?

public class MyImage
{
 [BsonId]
 public ObjectId id {get;set;}    
 public string Hash {get;set;}

}

var results = imageCollection
 .AsQueryable(MyImage)
.Where(x=>ImageHash.Similarity(x.Hash, hash) >= 50)
.ToList();
于 2014-01-21T22:31:06.477 に答える