【问题标题】:Detect more than 1 object on picture在图片上检测超过 1 个物体
【发布时间】:2016-12-15 09:32:40
【问题描述】:

我写了一个小脚本,它可以让SIFT descriptors method 在全局图片中找到一个对象。但我对同一张图片中的多个检测有疑问。

我有这张全球图片:

我有这个模板:

我的脚本如下所示:

import numpy as np
import cv2

#########################
# SIFT descriptors part #
#########################

img1 = cv2.imread('/Users/valentinjungbluth/Desktop/SIFT:SURF Algo/lampe.jpg',0)
img2 = cv2.imread('/Users/valentinjungbluth/Desktop/SIFT:SURF Algo/ville.jpg',0)

# Initiate SIFT detector
sift = cv2.xfeatures2d.SIFT_create()

print (img1.dtype)
print (img2.dtype)


kp1, des1 = sift.detectAndCompute(img1,None)
kp2, des2 = sift.detectAndCompute(img2,None)

bf = cv2.BFMatcher()
matches = bf.knnMatch(des1,des2,k=2)

good = []
for m,n in matches :
    if m.distance < 0.2*n.distance :
        good.append([m])

img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=2)

cv2.imwrite('matches.jpg',img3)

结果是:

我的问题是:

我怎样才能检测到其他灯?因为所有的灯都非常相似,我想与图片中存在的所有灯匹配。

非常感谢!

用 Micka 的回答编辑:

在 0.2 比例距离处什么都没有出现,但如果我放 0.75 :

【问题讨论】:

  • 很难解释,但也许您可以使用类似于我在此链接中使用的方法以及此链接中的链接:stackoverflow.com/questions/34310914/… 但我猜其他灯看起来不像在你的情况下足够相似。您可以尝试通过过度绘制来移除图像中最右边的灯,然后开始对修改后的图像进行检测。
  • @Micka 谢谢你的回答。在我看来,其他灯非常相似。所以我需要找到如何向我的脚本显示其他灯以便考虑。
  • 你能用你在这张图片中发布的模板尝试你的算法并发布结果吗? picload.org/image/ralgwllg/sift_smaller.png
  • 当然,我编辑了我的帖子;)

标签: python opencv computer-vision sift surf


【解决方案1】:

这是个好问题。我可以考虑以下几种方法:

1.Sliding Windowing技术 - 可以在全局图像中搜索“模板”,方法是制作一个窗口,模板的大小,在整个图像中滑动。您可以对金字塔执行此操作,以便处理规模和平移变化。

  1. SIFT - 尝试将全局图像与模板匹配并找到所有匹配项。然后你应该用相对姿势过滤匹配。可能您需要再进行一次过滤,但我认为这种方法更通用,因为它比以前的限制更多。

希望对你有帮助!

【讨论】:

  • 是的,我使用 SIFT 方法来做到这一点。但是,即使我从全局图像中获取模板(我在灯周围裁剪),其他灯也非常相似但未检测到 ^^
  • 我看到您正在使用 SIFT 方法,但是在 knnmatch 中,将全局与模板匹配,而不是相反。这将为您提供从全局到模板的所有匹配项,然后您可以过滤它们。 MatOfKeypoint 容器为您提供 7 个不同的分数,您可以比较这些分数以过滤相对姿势。
  • 谢谢瑞克!但是MatOfKeypoint 是一个 C++ 函数,对吗?我得看看它在Python中是否存在类似的功能?
  • 是的,不幸的是它不存在于 python 中。但我想在 python 中你确实得到了类似的东西may be this
【解决方案2】:

通过更宽松的条件来尝试允许更多好的匹配。

good = []
for m,n in matches :
    if m.distance < 0.2*n.distance :
        good.append([m])

一种更稳健的方法是使用从模板图像中提取的筛选特征来描述灯,然后尝试使用图像上的滑动窗口来找到这些特征。对于每个窗口,计算筛选特征,并计算到模板特征的“距离”。如果距离小于给定阈值,则窗口包含一盏灯!

【讨论】:

  • 感谢您的回答。但这很奇怪,因为当我通过距离修改允许更多好的匹配时,我没有找到更多的灯:/我没有提到,但这是我第一次做这种东西。
  • 我会为您指出滑动窗口的良好 python+opencv 参考:pyimagesearch.com/2015/03/23/…
  • 谢谢你,我会看这个教程来做同样的事情。希望得到多次检测:)
猜你喜欢
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 2018-12-06
  • 2015-01-26
  • 2013-12-15
  • 2011-08-06
  • 1970-01-01
相关资源
最近更新 更多