在 android 中比较图像相似性的最佳方法

best way to compare images for similarity in android

如何比较两张图片,是否100%相似? 我从 mediastore 获取所有图像的路径,然后转换为位图并使用 bitmap.sameAs(bitmapToCompare) 进行比较,但它占用大量内存并出现内存不足问题 现在我正在尝试将 OpenCv 库用作:

  val img1: Mat = Imgcodecs.imread(it)
                    val img2: Mat = Imgcodecs.imread(it1)
                    val result = Mat()
                    Core.compare(img1, img2, result, Core.CMP_EQ)
     val ines = Core.countNonZero(result)
                        if(ines==0){
//similar images

}

但在 Core.countNonZero 中出现如下错误:

cv::Exception: OpenCV(4.5.3) /home/quickbirdstudios/opencv/releases/opencv-4.5.3/modules/core/src/count_non_zero.dispatch.cpp:128: error: (-215:Assertion failed) cn == 1 in function 'countNonZero'

比较两张图片的最佳方式是什么?

首先,让我们纠正你。您的 OpenCV 代码段和 Android 都不能直接比较两张图像是否“相似”。他们可以比较是否完全相同。那不是一回事。你必须决定它是否足够好。

其次,OpenCV 在这方面有点矫枉过正。如果两张图片是内存中的Bitmap,就循环遍历这两个文件的字节数组即可。如果它们在磁盘上,只需比较两个文件的字节数据即可。

你说你“得到所有图片的路径,然后转换成Bitmap”。是的,那会占用大量内存。相反,如果您想比较所有文件,请执行以下操作:

val map = mutableMapOf()
fileNames.each {
  val hash = hash_file(it)
  if (map.contains(hash)) {
    //In this case, the two file stored in it and map[hash] are the same
  }
  else {
    map[hash] = it
  }
}

这里hash_file是任何众所周知的散列函数。 MD5 可以正常工作。

现在,如果你真的想要相似性——祝你好运,你将需要学习大量的人工智能和机器学习来确定这一点。或者找一个已经有合适训练集模型的人。