使用opencv python检测SURF徽标

时间:2013-06-14 09:38:50

标签: python opencv

我正在尝试检测图片中已知软件相关内容的一些徽标。 我使用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

Template url

http://img4.hostingpics.net/thumbs/mini_659254image.jpg

Image url

匹配点与loho完全对应,我得到两个完全不同的图像相同的结果。

我认为这是执行此任务的唯一解决方案,但这次检测的问题在哪里?提前谢谢。

亚历山大

1 个答案:

答案 0 :(得分:2)

边缘的兴趣点被抑制,因为它们在比例空间中不是不变的。由于您的徽标完全由边缘定义,因此像SURF(或SIFT)一样工作的中间点检测器不能很好地工作。可能会训练一个哈尔分类器,就像OpenCV中的Viola-Jones一样,会更好。