我正在尝试编写代码以找出两个图像是否相同。我能够以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;
}
答案 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);
如果图像完全相同,结果将为零。
越相似,越接近零。