Opencv Python-特征匹配的相似性分数+;同音字

Opencv Python-特征匹配的相似性分数+;同音字,python,opencv,matching,feature-detection,surf,Python,Opencv,Matching,Feature Detection,Surf,我的数据库中有几个鱼图像,我的目标是找到用户输入的鱼图像和数据库中的图像之间的相似性分数。为此,我从这个链接使用opencv功能匹配+同音字 我目前的代码如下 query_image = '/home/zealous/Pictures/train_images/AbudefdufWhitleyiJER.jpg' trained_image_folder = '/home/zealous/Pictures/train_images' def feature_matcher(query_imag

我的数据库中有几个鱼图像,我的目标是找到用户输入的鱼图像和数据库中的图像之间的相似性分数。为此,我从这个链接使用opencv功能匹配+同音字

我目前的代码如下

query_image = '/home/zealous/Pictures/train_images/AbudefdufWhitleyiJER.jpg'
trained_image_folder = '/home/zealous/Pictures/train_images'
def feature_matcher(query_image, image_folder):

    min_match_count = 10

    img1 = cv2.imread(query_image, 0)
    surf = cv2.xfeatures2d.SURF_create(800)
    kp1, des1 = surf.detectAndCompute(img1, None)

    bf = cv2.BFMatcher(cv2.NORM_L2)

    all_files = next(os.walk(image_folder))[2]

    for file_name_temp in all_files:
        try:
            train_image = image_folder + '/' + file_name_temp
            img2 = cv2.imread(train_image, 0)
            surf = cv2.xfeatures2d.SURF_create(800)
            kp2, des2 = surf.detectAndCompute(img2, None)

            matches = bf.knnMatch(des1, des2, k=2)

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

            if len(good) > min_match_count:

                src_pts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1,1,2)
                dst_pts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1,1,2)

                M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)

                matchesMask = mask.ravel().tolist()

                h, w = img1.shape
                pts = np.float32([[0, 0], [0, h-1], [w-1, h-1], [w-1, 0]]).reshape(-1,1,2)
                dst = cv2.perspectiveTransform(pts, M)

                if not M==None:
                    print "\n"
                    print "-"*2, file_name_temp
                    print "number of good matches", len(good)
                    print "*"*10, matchesMask
我目前的代码如下

query_image = '/home/zealous/Pictures/train_images/AbudefdufWhitleyiJER.jpg'
trained_image_folder = '/home/zealous/Pictures/train_images'
def feature_matcher(query_image, image_folder):

    min_match_count = 10

    img1 = cv2.imread(query_image, 0)
    surf = cv2.xfeatures2d.SURF_create(800)
    kp1, des1 = surf.detectAndCompute(img1, None)

    bf = cv2.BFMatcher(cv2.NORM_L2)

    all_files = next(os.walk(image_folder))[2]

    for file_name_temp in all_files:
        try:
            train_image = image_folder + '/' + file_name_temp
            img2 = cv2.imread(train_image, 0)
            surf = cv2.xfeatures2d.SURF_create(800)
            kp2, des2 = surf.detectAndCompute(img2, None)

            matches = bf.knnMatch(des1, des2, k=2)

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

            if len(good) > min_match_count:

                src_pts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1,1,2)
                dst_pts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1,1,2)

                M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)

                matchesMask = mask.ravel().tolist()

                h, w = img1.shape
                pts = np.float32([[0, 0], [0, h-1], [w-1, h-1], [w-1, 0]]).reshape(-1,1,2)
                dst = cv2.perspectiveTransform(pts, M)

                if not M==None:
                    print "\n"
                    print "-"*2, file_name_temp
                    print "number of good matches", len(good)
                    print "*"*10, matchesMask
def功能匹配器(查询图像、图像文件夹):
最小匹配计数=10
img1=cv2.imread(查询图像,0)
surf=cv2.xfeature2d.surf\u创建(800)
kp1,des1=表面检测和计算(img1,无)
bf=cv2.BFMatcher(cv2.NORM_L2)
all_files=next(os.walk(image_文件夹))[2]
对于所有\u文件中的文件\u name\u temp:
尝试:
列车图像=图像文件夹+'/'+文件名称
img2=cv2.imread(列车图像,0)
surf=cv2.xfeature2d.surf\u创建(800)
kp2,des2=表面检测和计算(img2,无)
匹配=bf.knnMatch(des1,des2,k=2)
好的=[]
对于匹配中的m,n:
如果m.距离<0.7*n.距离:
好。追加(m)
如果长度(良好)>最小匹配计数:
src_pts=np.float32([kp1[m.queryIdx].pt代表m处于良好状态])。重塑(-1,1,2)
dst_pts=np.float32([kp2[m.trainIdx].pt代表m处于良好状态])。重塑(-1,1,2)
M、 掩模=cv2.findHomography(src_pts,dst_pts,cv2.RANSAC,5.0)
matchesMask=mask.ravel().tolist()
h、 w=img1.1形状
pts=np.float32([[0,0],[0,h-1],[w-1,h-1],[w-1,0]])。重塑(-1,1,2)
dst=cv2.透视变换(pts,M)
如果不是M==无:
打印“\n”
打印“-”*2,文件名
打印“良好匹配数”,len(良好)
打印“*”*10,匹配任务
我得到了非常好的输出,这是我假设的,因为我看到了一些好的匹配和matchesMask变量(其中包含一些0和1)。若数据库包含和输入图像相同的图像,那个么将有许多良好的匹配,并且所有matchesMask元素都将为1

我的问题是,如何基于此计算相似度分数?我是否应该假设matchesMask中的1(内联线)数量越多,两个图像的相似性就越高,或者我应该取1(内联线)数量和0(离群点)数量之间的比率,并基于此计算相似性


我知道这在很多问题中都已经讨论过了,但是所有的建议和答案都是用C++语言编写的,所以我无法找到解决方案。

在相似性得分中,你不想包括离群值——它们是离群值,因为它们对你的数据没有帮助。只需将1的数量(内联数)作为相似性分数-您应该会得到不错的结果