在图片上检测多个对象

时间:2016-12-15 09:32:41

标签: python opencv computer-vision sift surf

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

我有这张全球图片:

enter image description here

我有这个模板:

enter image description here

我的脚本如下:

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)

结果是:

enter image description here

我的问题是:

我如何能够发现其他灯具?因为所有灯都非常相似,我想与图片中的所有灯匹配。

非常感谢你!

编辑与Micka的回答:

enter image description here

0.2比例距离没有出现,但如果我放0.75:

enter image description here

2 个答案:

答案 0 :(得分:1)

尝试通过在条件允许的情况下允许更多好的匹配。

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

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

答案 1 :(得分:1)

这是一个很好的问题。有几种方法我可以想到这样做:

1. 滑动窗口技术 - 您可以搜索&#34;模板&#34;在全局图像中,通过创建窗口,模板的大小,并在整个图像中滑动它。您可以为金字塔执行此操作,以便处理缩放和平移更改。Sliding Window Technique

  1. SIFT - 尝试将全局图片与模板匹配并查找所有匹配项。然后你应该用相对姿势过滤匹配。可能是您需要进行其他过滤,但我认为这种方法更为通用,因为它可以满足比以前更多的限制。
  2. 希望它有所帮助!