0

画像処理初心者です。私のSOの質問は...

カメラを使用して画像を撮影し、この画像を使用してリスト コンテナーと照合します。リスト コンテナーにこの画像のような画像が含まれている場合は操作を行い、そうでない場合は行いません。

例...

  1. 私は1つの画像「img_one」を持っています
  2. 私のリストには「image_one、image_two、image_three」が含まれています
  3. ショーリストにはimage_oneがあります(つまり、この画像のように見えます)

では、この画像をリスト コンテナー内の項目と照合して、どの画像がこの画像に似ているかを示すにはどうすればよいでしょうか?

事前に友人に感謝します。すべてのアイデアを歓迎します。

4

3 に答える 3

3

「重複」によって何を定義するかによって大きく異なります。

完全に同一のコピー (コピー アンド ペースト) を探している場合、ゲームは簡単です。Safir によって提案されたアプローチは、パフォーマンスがわずかに向上しただけで、問題ありません。

ほぼ正確な重複を見つけたい場合、その作業は突然信じられないほど困難になります。詳細については、このChecking images for similarity with OpenCVを確認してください。

ここで、「単純な」アプローチに戻りますが、比較する必要がある写真の数によって異なります。1000 個の画像を含むフォルダー内の他のすべての画像と各画像を比較すると、1.000.000 の画像の読み取りと比較が得られるためです。(すべてを一度に RAM に保存することはできないため、何百万回もロードとアンロードを行う必要があります) その方法は、強力なデスクトップ プロセッサでさえ多すぎます。

簡単な方法は、各画像にハッシュ関数 (sha2 など) を使用し、ハッシュのみを比較することです。画像の適切なアドホック「ハッシュ」は、ヒストグラムかもしれません (ただし、陽性の場合は memcmp で再確認することをお勧めします)。

また、ブルート フォース アプローチ (各画像ピクセルを他の画像ピクセルと比較する) を試したとしても、ピクセル単位で画像にアクセスする代わりに memcmp() を使用する方が高速です。

于 2013-03-22T13:57:14.507 に答える
2

opencvにはそのような機能はないと思います。自分でピクセルをループして、1 つずつチェックする必要があります。サンプル コードは次のようになります。

bool identical(cv::Mat m1, cv::Mat m2)
{
  if ( m1.cols != m2.cols || m1.rows != m2.rows || m1.channels() != m2.channels() || m1.type() != m2.type() )
    {
      return false;
    }

  for ( int i = 0; i < m1.rows; i++ )
    {
      for ( int j = 0; j < m1.cols; j++ )
        {
          if ( m1.at(i, j) != m2.at(i, j) )
            {
              return false;
            }
        }
    }
  return true;
}

すべてのピクセルを少し高速に繰り返したい場合は、OpenCV: Matrix Iterationを参照してください。

于 2013-03-22T12:31:26.880 に答える
-1

2つの画像を比較するのは少し時間のかかるプロセスだと思います。ただし、アダプタから、または画像をListViewでバインドしている場所から、その画像のバイナリを相互に比較することで確認できます。

于 2013-03-22T12:40:26.643 に答える