2013-03-22 36 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()而不是逐像素访问图像。