比较BGR图片是否完全相同

时间:2019-06-27 23:08:31

标签: c++ opencv

我正在尝试编写代码以找出两个图像是否相同。我能够以BGR的形式读取图像,并且能够从另一个图像中减去一个图像。我需要检查一下差异是否仅包含零。我知道有一个名为countNonZero的函数,但它仅适用于单个通道,而不适用于3个通道。我的解决方案是遍历整个矩阵并检查是否所有内容均为零,但这太慢了。有什么有效的检查方法吗?这是下面的代码。

int main(int argc, char** argv)
{
  if(argc != 3)
  {
    printf("usage: DisplayImage.out <testImg.png> <copy.png>\n");
    return -1; 
  }

  Mat image;
  Mat copy;
  Mat output;

  image = imread(argv[1], 1); 
  copy = imread(argv[2], 1); 

  absdiff(image, copy, output);

  if(countNonZero(output) == 0)
  {
    cout << "Same" << endl;
  }
  else
  {
    cout << "Different" << endl;
  }

  imshow("outut", output);
  waitKey();
  return 0;
}

2 个答案:

答案 0 :(得分:2)

您可以这样做:

Mat diff_im = image - copy;
double s = cv::sum(diff_im)[0];

答案 1 :(得分:1)

您还可以使用规范类型为norm()的OpenCV的NORM_L2功能

double rst = cv::norm(img1, img2, cv::NORM_L2);

如果图像完全相同,结果将为零。

越相似,越接近零。