簡體   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