2013-03-22 28 views
0

我是圖像處理新手。我的SO問題是...我們可以檢查列表中是否存在重複圖像?

我使用相機拍攝圖像,然後使用此圖像並對照列表容器進行檢查。如果列表容器包含的圖像看起來像這個圖像,然後做一個操作,否則不要。

例...

  1. 我有一個形象 「img_one」
  2. 我的列表中包含 「image_one,image_two,image_three」
  3. 顯示列表有image_one(即它看起來像這樣圖片)

那麼如何檢查這個圖像對列表容器中的項目,並顯示哪個圖像看起來像這個圖像?

在此先感謝朋友。所有的想法都被讚賞。

+0

@djaqeel在圖像processeing我寫[檢查相似度與圖像的OpenCV]的 – QuokMoon 2013-03-22 12:10:06

+0

可能重複(http://stackoverflow.com/questions/11541154/checking-images-for-similarity-with-opencv) – Sam 2013-03-22 15:08:08

回答

1

我不認爲在opencv中存在這樣的函數。你必須自己循環遍歷像素並逐一檢查它們。樣本代碼可以是這樣的:

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

+0

漂亮多點! – 2013-03-22 12:44:26

-1

我認爲它有點費時的過程來比較兩張圖片。但是您可以通過比較來自適配器的圖像的二進制文件或使用ListView綁定圖像的位置來檢查它。

2

這很大程度上取決於您通過「重複」定義的內容。

如果您正在尋找完全相同的副本(複製粘貼),遊戲很簡單。 Safir提出的方法只有一些性能上的改進,就是好的。

如果你想找到幾乎完全相同的副本,這項工作突然變得非常困難。看看這個Checking images for similarity with OpenCV瞭解更多信息。

現在,回到「簡單」的方法,它取決於你有多少圖片進行比較。因爲將每張圖片與1000張圖片文件夾中的所有其他圖片進行比較,可以爲您提供1.000.000張圖片讀取和比較。 (因爲你不能將它們全部存儲在RAM中,你將不得不加載和卸載它們一百萬次)。即使是強大的桌面處理器,這種方式也太多了。

一個簡單的方法是對每個圖像使用散列函數(如sha2),然後僅比較散列。圖像的特別「哈希」可能是直方圖(儘管對於肯定,您可能想要使用memcmp進行仔細檢查)。

即使您嘗試蠻力方法(比較每個圖像像素與另一個),更快的方法是使用memcmp()而不是逐像素訪問圖像。