在图片上检测到超过 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,模板大小,滑动即可在全局图像中搜索“模板”它在整个图像中。您可以对金字塔执行此操作,以便处理比例和平移变化。
- SIFT - 尝试将全局图像与模板匹配并找到所有匹配项。然后你应该过滤具有相对姿势的匹配项。可能你需要另一个过滤,但我认为这种方法更通用,因为它比以前的限制更多。
希望对您有所帮助!
我写了一个小脚本,让 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,模板大小,滑动即可在全局图像中搜索“模板”它在整个图像中。您可以对金字塔执行此操作,以便处理比例和平移变化。
- SIFT - 尝试将全局图像与模板匹配并找到所有匹配项。然后你应该过滤具有相对姿势的匹配项。可能你需要另一个过滤,但我认为这种方法更通用,因为它比以前的限制更多。
希望对您有所帮助!