如何通过Python检测照片中的相似对象

问题描述

目前,我尝试通过Python开发AI系统以匹配2张照片中的神圣物体。 第一张照片是DSLR相机拍摄的高分辨率圣物(A)照片。

enter image description here

第二张照片是手机相机捕获的神圣物体(A)照片。

enter image description here

我需要AI系统来预测相似百分比从0-100%。 我尝试了一些方法,但是收效不佳。

请提出哪种方法适合预测模型? 谢谢

解决方法

一种方法是使用template-matching

如果您将第一个图像用作模板:

  • 模板图片:

  • enter image description here

  • 源图像:


  • enter image description here

  • 结果将是:


  • enter image description here

步骤:


    1. templatesource图像都转换为灰度并应用Canny边缘检测。
    • template = cv2.imread("template_resized.jpg")
      template = cv2.cvtColor(template,cv2.COLOR_BGR2GRAY)
      template = cv2.Canny(template,50,200)
      
    • enter image description here

    • source = cv2.imread("source_resized.jpg")
      source = cv2.cvtColor(source,cv2.COLOR_BGR2GRAY)
      source = cv2.Canny(source,200)
      
    • enter image description here

    1. 检查模板是否与源图像匹配
    • result = cv2.matchTemplate(source,template,cv2.TM_CCOEFF)

    • 我们需要result

      中的最大值和最大值位置
    • (_,maxVal,_,maxLoc) = cv2.minMaxLoc(result)

    1. 获取坐标并绘制矩形
    • (startX,startY) = (int(maxLoc[0] * r),int(maxLoc[1] * r))
      (endX,endY) = (int((maxLoc[0] + w) * r),int((maxLoc[1] + h) * r))
      
    • 绘制矩形

    • cv2.rectangle(image,(startX,startY),(endX,endY),(0,255),2)
      

可能的问题: 为什么不使用原始图像尺寸?


答案:嗯,template-matching对于小图像效果更好。否则,结果将不令人满意。如果我使用原始图像尺寸,则结果将是:link

可能的问题: 为什么使用cv2.TM_CCOEFF


答案:这只是一个示例,您可以尝试其他parameters

可能的问题: 如何使用模板匹配来计算相似度百分比?


答案:请查看此answer。如前所述,您可以将minMaxLoc的输出用于相似度百分比。

有关完整代码,请查看opencv-python tutorial