我正在尝试检测图片中已知软件相关内容的一些徽标。 我使用Opencv 2.4.5和python 2.7。 我想使用在opencv中实现的SURF检测器,但问题是我没有获得好的结果。有很多假阴性和假阳性。 我的代码是:
import cv2
import numpy as np
def detectLogo(template, img):
templateg = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
imgg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# SURF extraction
hessian_threshold = 30
surf = cv2.SURF(hessian_threshold)
kp, desc = surf.detect(imgg, None, useProvidedKeypoints = False)
# KNN
samples = np.array(desc)
responses = np.arange(len(kp), dtype = np.float32)
knn = cv2.KNearest()
knn.train(samples, responses)
# Loading template and searching for similar kp
kp2, desc2 = surf.detect(templateg, None, useProvidedKeypoints = False)
matched = 0
total = 0
for h,des in enumerate(desc2):
des = np.array(des,np.float32).reshape((1,128))
retval, results, neigh_resp, dists = knn.find_nearest(des,1)
res,dist = int(results[0][0]),dists[0][0]
total += 1
if dist<0.1: # draw matched keypoints in red color
color = (0,0,255)
matched += 1
else:
color = (255,0,0)
#Draw matched key points on original image
x,y = kp[res].pt
center = (int(x),int(y))
cv2.circle(img,center,2,color,-1)
#Draw matched key points on template image
x,y = kp2[h].pt
center = (int(x),int(y))
cv2.circle(template,center,2,color,-1)
cv2.imwrite("../resources/template.jpg", template)
cv2.imwrite("../resources/image.jpg", img)
return matched / float(total)
template = cv2.imread("../resources/pictures/appleLogo.jpg")
img = cv2.imread("../resources/pictures/pic2.jpg")
print detectLogo(template, img)
以下是结果。
http://img4.hostingpics.net/thumbs/mini_975726template.jpg
http://img4.hostingpics.net/thumbs/mini_659254image.jpg
匹配点与loho完全对应,我得到两个完全不同的图像相同的结果。
我认为这是执行此任务的唯一解决方案,但这次检测的问题在哪里?提前谢谢。
亚历山大
答案 0 :(得分:2)
边缘的兴趣点被抑制,因为它们在比例空间中不是不变的。由于您的徽标完全由边缘定义,因此像SURF(或SIFT)一样工作的中间点检测器不能很好地工作。可能会训练一个哈尔分类器,就像OpenCV中的Viola-Jones一样,会更好。