172

OpenCV は 2 つの画像の比較をサポートしており、これらの画像がどの程度似ているかを示す値 (パーセンテージなど) を返しますか? たとえば、同じ画像が 2 回渡された場合は 100% が返され、画像がまったく異なる場合は 0% が返されます。

私はすでに、StackOverflow で同様のトピックをたくさん読んでいます。私もかなりのグーグルをしました。残念ながら、満足のいく答えを見つけることができませんでした。

4

5 に答える 5

237

これは巨大なトピックであり、3 行のコードから研究雑誌全体への回答が含まれています。

最も一般的なそのような手法とその結果について概説します。

ヒストグラムの比較

最も簡単で最速の方法の 1 つ。写真の類似点を見つける手段として数十年前に提案されました。アイデアは、森にはたくさんの緑があり、人間の顔にはたくさんのピンクなどがあります. したがって、2 つの画像を森と比較すると、両方に緑が多いため、ヒストグラム間にある程度の類似性が得られます。

欠点:単純すぎる。バナナとビーチはどちらも黄色なので同じように見えます。

OpenCV メソッド: compareHist()

テンプレートマッチング

ここでの良い例は、適切な一致を見つける matchTemplateです。検索画像と検索対象の画像を畳み込みます。通常、大きな画像内の小さな画像部分を見つけるために使用されます。

欠点: 同一の画像、同じサイズと向きでのみ良い結果が返されます。

OpenCV メソッド: matchTemplate()

特徴マッチング

画像検索を行う最も効率的な方法の 1 つと考えられています。画像から多数の特徴が抽出され、回転、拡大縮小、または傾斜しても同じ特徴が再び認識されることが保証されます。この方法で抽出された特徴は、他の画像特徴セットと照合できます。最初の画像と一致する特徴の割合が高い別の画像は、同じシーンを描いていると見なされます。

2 組のポイント間のホモグラフィを見つけると、元の写真間の撮影角度の相対的な違いや重なりの量も見つけることができます。

これに関する多数の OpenCV チュートリアル/サンプルと、こちらの素敵なビデオがあります。OpenCV モジュール (features2d) 全体が専用です。

短所:遅いかもしれません。完璧ではありません。


OpenCV Q&Aサイトで、画像全体を比較する際に役立つ機能記述子と、画像内の人間の顔や車などのオブジェクトを識別するために使用されるテクスチャ記述子の違いについて話しています。

于 2012-07-18T12:38:40.427 に答える
36

同一の画像を一致させる場合(同じサイズ/向き)

// Compare two images by getting the L2 error (square-root of sum of squared error).
double getSimilarity( const Mat A, const Mat B ) {
if ( A.rows > 0 && A.rows == B.rows && A.cols > 0 && A.cols == B.cols ) {
    // Calculate the L2 relative error between images.
    double errorL2 = norm( A, B, CV_L2 );
    // Convert to a reasonable scale, since L2 error is summed across all pixels of the image.
    double similarity = errorL2 / (double)( A.rows * A.cols );
    return similarity;
}
else {
    //Images have a different size
    return 100000000.0;  // Return a bad value
}

ソース

于 2013-10-31T14:17:57.367 に答える