0

画像比較に関するいくつかの投稿を赤くして、画面からキャプチャした画像を保存してファイルシステムに保存しようとしました。

変換方法を使用して、キャプチャした画像byte[]を後で使用するために変換しました。

次に、2番目のスクリーンキャプチャと比較する場合は、(に保存されたファイルを)ロードして、同じ方法byte[]で変換された新しいキャプチャと比較します。byte[]

さて、1回目のキャプチャと2回目のキャプチャの両方をメモリ内で行う場合、比較を行う方法はほとんどありませんでした。まず、同じ答えを探している他の人とこの投稿を共有して、知りたいと思いました。

どちらが高速で、類似性のパーセンテージを制御するにはどうすればよいですか?

(等しい)パーセンテージを持つオプションが計算の最速の方法に反対している場合...パフォーマンスの問題がない場合、およびそのニーズに応じて、他のプロジェクトで使用できますが、無視できます

これらは、タスクを実行するために利用できることがわかっているコードです

私はあなたと一緒に、より速いアイデアと、平等のパーセンテージがある場合とない場合のより良い方法があるかどうかを確認したいと思いました。ありがとうございました。

static bool ByteArrayCompare(byte[] a1, byte[] a2)
{     
  IStructuralEquatable eqa1 = a1;     
  return eqa1.Equals(a2, StructuralComparisons.StructuralEqualityComparer); 
} 

vs

public enum CompareResult
{
  ciCompareOk,
  ciPixelMismatch,
  ciSizeMismatch
};

CompareResult cr = CompareResult.ciCompareOk;

byte[] hash1 = shaM.ComputeHash(btImage1);
byte[] hash2 = shaM.ComputeHash(btImage2);

//Compare the hash values
for (int i = 0; i < hash1.Length && i < hash2.Length 
                  && cr == CompareResult.ciCompareOk; i++)
{
    if (hash1[i] != hash2[i])
        cr = CompareResult.ciPixelMismatch;
}

後者は使用していますSystem.Security.Cryptography

4

1 に答える 1

2

画像の比較とバイト配列/ファイルの内容の比較は、画像形式が慎重になる可能性があるため、2 つの異なるタスクです。したがって、バイト比較に関心があると仮定します(つまり、画像の結果をキャプチャするために使用される同じコードが同じである必要がある場合)。それ以外の場合は、「イメージの比較」の質問を検索する必要があります (イメージ オブジェクトを C# .NET と比較する方法は、Jensen Somers が提案したものなど)。

バイト配列/ファイルを比較するには、最終的にバイトの内容をバイトごとに比較する必要があります。バイト配列/ファイルが確実に一致しない場合に何もしないようにチェックを最適化し、厳密に必要な場合にのみバイト比較を行うことができます。

  • サイズが同じかチェック
  • 配列/ファイルのハッシュをチェックします(計算されたハッシュ値をキャッシュします。毎回ハッシュを計算するのはバイトごとの比較よりも速くないためです)。SHAxxxx ハッシュは適切ですが、配列からランダムに取得された数バイトであっても、妥当なハッシュ関数であれば十分です。配列から値を選択するだけで、ハッシュのキャッシュを完全に回避できます。
  • ファイルが同じよりも頻繁に異なると予想される場合は、配列の固定サイズのチャンク (つまり、画像の中間のどこか) を比較します。

上記の場合、配列/ファイルは、配列/ファイルをバイト単位で比較するよりも同じ (同じ長さ/ハッシュ/部分的なコンテンツ) である可能性があります。

于 2012-08-31T21:05:52.777 に答える