首页 > 解决方案 > 如何通过Python检测照片中的相似物体

问题描述

目前,我尝试通过 Python 开发 AI 系统以匹配来自 2 张照片的神圣对象。第一张照片是由数码单反相机拍摄的高分辨率圣物 (A) 照片。 在此处输入图像描述 第二张照片是由手机相机拍摄的圣物 (A) 照片。 在此处输入图像描述

我需要人工智能系统来预测 0 - 100% 的相似百分比。我尝试了一些方法,但没有得到好的结果。

请建议哪种方法适合预测模型?感谢

标签: pythonimage-processingobject-detectionprediction

解决方案


一种方法是使用template-matching

如果您使用第一张图片作为模板:

  • 模板图片:

  • 在此处输入图像描述

  • 源图像:


  • 在此处输入图像描述

  • 结果将是:


  • 在此处输入图像描述

脚步:


    1. templatesource图像都转换为灰度并应用 Canny 边缘检测。
    • template = cv2.imread("template_resized.jpg")
      template = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
      template = cv2.Canny(template, 50, 200)
      
    • 在此处输入图像描述

    • source = cv2.imread("source_resized.jpg")
      source = cv2.cvtColor(source, cv2.COLOR_BGR2GRAY)
      source = cv2.Canny(source, 50, 200)
      
    • 在此处输入图像描述

    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, 0, 255), 2)
      

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


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

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


答:这只是一个例子,您可以尝试其他参数

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


答:请看这个答案。如前所述,您可以将minMaxLoc' 的输出用于相似性百分比。

完整代码请查看opencv-python 教程


推荐阅读