ML之SIFT_FLANN:对图片提取SIFT特征并利用FLANN方法判别图像的相似度并可视化

ML之SIFT_FLANN:对图片提取SIFT特征并利用FLANN方法判别图像的相似度并可视化


FLANN算法

FLANN库全称是Fast Library for Approximate Nearest Neighbors,它是目前最完整的(近似)最近邻开源库。不但实现了一系列查找算法,还包含了一种自动选取最快算法的机制。
          使用flann的搜索,整体来说分为两步,一是建立索引,二是搜索。

  • 使用SIFT特征提取关键点;
  • 计算SIFT特征描述子;
  • 使用FLANN匹配器进行描述子向量匹配。

1、建立索引

其实就是要两部分参数,一是数据也就是mat矩阵,二是一些具体参数,这个参数要根据建立的索引类型来设置。而有哪些索引类型呢?  共有:线性索引、KD-Tree索引、K均值索引、复合索引、LSH方法索引、自动索引 六种。

2、进行搜索

有两种搜索方式 :knnSearch //搜索k邻近 、radiusSearch //搜索半径最近 
从返回结果考虑两者的不同之处在于: 
knnSearch返回最近邻的点(具体点的个数由用户设定,设n个就一定返回n个); 
radiusSearch返回搜索半径内所有点(即可能不存在符合条件的点,则返回空的)。

输出结果

实现代码

ML之SIFT:对图片提取SIFT特征并利用FLANN方法判别图像的相似度并可视化

    sift = cv2.xfeatures2d.SIFT_create()
    # 查找监测点和匹配符
    kp1, des1 = sift.detectAndCompute(img1, None)
    kp2, des2 = sift.detectAndCompute(img2, None)
    print(len(kp1), len(des1) )   # 1402, 1402

    FLANN_INDEX_KDTREE = 0
    indexParams = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
    searchParams = dict(checks=50)
    flann = cv2.FlannBasedMatcher(indexParams, searchParams)
    # 进行匹配
    matches = flann.knnMatch(des1, des2, k=2)
    # 准备空的掩膜 画好的匹配项
    matchesMask = [[0, 0] for i in range(len(matches))]

    for i, (m, n) in enumerate(matches):
        if m.distance < 0.7*n.distance:
            matchesMask[i] = [1, 0]

    drawPrams = dict(matchColor=(0, 255, 0),
                     singlePointColor=(255, 0, 0),
                     matchesMask=matchesMask,
                     flags=0)
    img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, matches, None, **drawPrams)
    img_PutText = cv2.putText(img3, "SIFT+kNNMatch: Image Similarity Comparisonn", (40, 40),cv2.FONT_HERSHEY_COMPLEX, 1.5, (0, 0, 255), 3,)
    img4 = cv2.resize(img_PutText, (0, 0), fx=0.5, fy=0.5, interpolation=cv2.INTER_NEAREST)  #缩小1/2

    cv2.imshow("matches", img4)
    cv2.waitKey(7000)
    cv2.destroyAllWindows()
(0)

相关推荐

  • opencv python实现图像匹配

    '''基于FLANN的匹配器(FLANN based Matcher)1.FLANN代表近似最近邻居的快速库.它代表一组经过优化的算法,用于大数据集中的快速最近邻搜索以及高维特征.2.对于大型数据集, ...

  • 一文解析基于特征点的视觉全局定位技术

    文章转自:无人车情报局 在无人驾驶中,感知.定位.规划决策.控制是四个基本的系统模块.由于当前算法还无法实现绝对的智能,因此依然需要大量的先验知识来提高模块性能.鲁棒性,以实现安全的自动驾驶.其中,高 ...

  • nanoflann库

    点云处理过程中可能会遇到寻找最临近点的问题,常用的解决方案就是用空间换效率.例如建立kd-tree等树状结构来代替遍历. 这里向大家介绍一个nanoflann工程,nanoflann 算法对fasta ...

  • 图片提取文字,想要哪里点哪里

    在技术迅速发展的当下,我们越来越需要享受技术所带来的快捷和方便,比如文字输入我们可以采用语音转文字识别工具,图片内容可以使用图片识别工具,信息统计可以使用在线协作工具.       如此等等,我们不断 ...

  • 关于opencv3.4 VS2015运行SIFT特征匹配detectAndCompute()函数莫名...

    最近在学习关于图像匹配拼接部分内容,在学习SIFT特征匹配方法时,本来想着先尝试着用opencv整合后的features2d类来创建一个生成特征点的简单小程序,然而却是在关键函数detectAndCo ...

  • GUI实战|Python做一个文档图片提取软件

    作者丨GUI工作组 来源丨经授权转自 早起Python(ID:Zaoqi_Python) 本文将进一步讲解如何用Python提取PDF与Word中图片,并结合之前讲解过的GUI框架PysimpleGU ...

  • 一学就会的图片提取文字方法,简单到没朋友。。。

    与 30万 读者一起学Excel 昨天坐高铁的时候,玩手机无意间发现的功能,简单好用,特意分享给你.印刷版识别率最高,手工写的只要写的标准点也可以识别大部分. 打开手机,在聊天的窗口,点键盘,我使用的 ...

  • 图片提取文字

    微信版本升级后,有在图片上提取文字的功能,可是提取到的文字与原文往往存在或多或少的差别,需要修改整理.上次我发现提取文字于是乎,变成于是平,几行的诗文变成一行文字一句话,不过,在提取散文方面准确率还是 ...

  • 如何利用QQ对话框识别图片提取文字

    如何利用QQ对话框识别图片提取文字

  • 陈根:研究开发新技术,高效提取数据特征

    文|陈根 机器学习是人工智能发展到一定阶段的产物,其让拥有多个处理层的计算模型来学习具有多层次抽象的数据的表示,这些方法在许多方面都带来了显著的改善.可以说,深度学习的出现,让图像.语音等感知类问题取 ...

  • 一个相见恨晚的图片提取和批量下载神器

    相信小伙伴们平时在剪辑过程中有遇到过这样一个问题:需要使用的图片素材缺不方便采集. 那么今天,和大家分享一个小技巧,来帮助大家脱离这个"苦海". 首先,我们要请出今天的主角--图片 ...

  • 在华为手机上,怎么把图片提取、转换为文字?

    小北今天还在车上,就接到了领导的任务,说是让小北将几张图片中的文字给整理到WORD上,原本想着去办公室之后再办的,没想到领导还挺急,说是中午就要,刚巧小北又是外出办事儿,不能立马赶回去,实在没办法,小 ...