在图片上检测到超过 1 个对象

Detect more than 1 object on picture

我写了一个小脚本,让 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:

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

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

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

这是个好问题。我可以想到几种方法:

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

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

希望对您有所帮助!