繁体   English   中英

在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 对此太过分了。 如果这两个图像是内存中的位图,只需循环两个文件的字节数组。 如果它们在磁盘上,只需逐字节比较两个文件的数据。

您说您“获得了所有图像的路径,然后转换为位图”。 是的,那会占用大量内存。 相反,如果要比较所有文件,请执行以下操作:

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 可以正常工作。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM