2016-12-15 68 views
4

我寫了一個小腳本,可以通過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

+1

難以解釋,但也許你可以使用一種類似於我在這個鏈接和鏈接中使用的方法:http://stackoverflow.com/questions/34310914/recognize-recurring-images-into- a-large-one/34314697#34314697 但我想其他燈在你的情況下看起來不夠相似。通過透視圖像,您可以嘗試從圖像中移除最右邊的燈泡,並在修改的圖像上開始檢測。 – Micka

+0

@Micka謝謝你的回答。在我看來,其他燈是非常相似的。所以我需要找到我如何向我的劇本展示其他燈以考慮問題。 – Deadpool

+0

你可以在你的發佈模板中試試你的算法,併發布結果嗎? https://picload.org/image/ralgwllg/sift_smaller.png – Micka

回答

1

這是一個很好的問題。有幾種方法我可以這樣做:

1. 滑動窗口技術 - 您可以通過製作窗口,模板大小以及滑動它來在全局圖像中搜索「模板」在整個圖像中。您可以爲金字塔做到這一點,因此規模和平移變化得到了照顧。 Sliding Window Technique

  • SIFT - 嘗試與模板的全球形象匹配,找到所有匹配。然後你應該用相對姿勢過濾比賽。也許你會需要另一個過濾器,但我認爲這種方法更通用,因爲它迎合了比以前更多的約束。
  • 希望它能幫助!

    +0

    是的,我用SIFT方法來做到這一點。但是,即使我從全局圖像中獲取模板(我在燈的周圍進行了裁剪),其他燈都非常相似但未檢測到^^ – Deadpool

    +0

    我看到您正在使用SIFT方法,但在knnmatch中,匹配全局和模板而不是其他方式。這會給你從全局到模板的所有匹配,然後你可以過濾它們。 MatOfKeypoint容器爲您提供7種不同的分數,您可以比較它們以篩選相對姿勢。 –

    +0

    謝謝瑞克!但是'MatOfKeypoint'是一個C++函數嗎?我必須看看它在Python中是否存在類似的函數? – Deadpool

    1

    嘗試允許通過更精彩的比賽在條件下更寬容。

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

    更健壯的方法是使用說明從模板圖像(S)中提取的SIFT特徵的燈,然後嘗試使用滑動窗口在圖像上找到這些功能。對於每個窗口,計算篩選特徵,並計算模板特徵的「距離」。如果距離小於一個給定的閾值,那麼該窗口包含一盞燈!

    +0

    謝謝你的回答。但是,這很奇怪,因爲當我修改距離時,允許更多的優秀比賽時,我沒有發現更多的燈:/我沒有提到它,但這是我第一次做這種事情。 – Deadpool

    +0

    我會告訴你一個很好的python + opencv參考滑動窗口:http://www.pyimagesearch.com/2015/03/23/sliding-windows-for-object-detection-with-python-and- opencv/ – Hennio

    +0

    謝謝,我會看看這個教程,以便做出同樣的事情。希望得到多個檢測:) – Deadpool