前言
SIFT(Scale-invariant feature transform)是2004年提出的,至今已经经受住各种考验,被证实是在同类描述子中具有很强健壮性的算法。
SIFT既是一种特征点检测算法,也同时提供特征点的描述子。
本文使用两个示例,简单介绍在python下如何使用opencv计算SIFT特征点
完整代码及更多算法demo,见我最近开始构建的 AI ToolBox
我建立 AI ToolBox 的初衷是,将工作学习中编写的代码中可复用的部分总结起来,组成一个工具箱,提高工作中尝试算法的时间成本。希望也能对大家有用,我会持续的进行更新,下面进入正题。
潜在的问题记录
由于SIFT及SURF等特征点检测算法已经申请专利,其算法实际是独立于opencv之外的。
因此,(假设你已经安装了opencv)你在搜索网上教程尝试使用SIFT算法时,你可能遇到下面的问题
'module' object has no attribute 'xfeatures2d'
这是由于你没有安装 opencv-contrib-python 库导致的,解决方法:
但愿程序已正常运行,但是,取决于你的各种版本配置,你还可能遇到这样的问题:
……Set OPENCV_ENABLE_NONFREE CMake option and rebuild the library in function 'cv::xfeatures2d::SIFT::create'
在 stackflow 上可以找到该问题的若干解决办法
由于我猜测这是和版本相关的问题,我是用如下方法解决的,很简单。
先卸载 opencv 和 opencv-contrib-python, 再重新安装统一版本的两个库。依此输入如下命令:
demo1:计算并绘制特征点
我们先来简单感受一下SIFT在做什么
调用很简单:
使用方法检测特征点
使用将特征点绘制处理
结果如下:
img01
demo2:使用SIFT匹配两幅图像
我们可以用SIFT点做些什么呢?
最常见的应用有图像拼接、模板匹配等
在demo2中,我们假设这样的应用场景: 已有一张人脸模板,在另一幅图像中,尝试判断其中是否包含这个人的脸。
核心思路是:
1)使用SIFT分别检测图片和模板的特征点
2)对两组特征点进行KNN匹配
3)使用RANSAC剔除误匹配的点对
4)通过最后留下的配对成功的点对的数量,通过一个阈值,判断图像中是否出现了模板人脸对应的同一个人
这里我们对前两部进行实现练习:
代码详见AI ToolBox中的
看下效果:
img02
img03
可以看到,强大的SIFT描述子可以很好的匹配出两幅图中的同一个人,即使是像金馆长这种已经被做成表情包的例子,都可以匹配成功。
同时,对于不是同一个人的情况,即使都是人(都有同样人类的面部结构),SIFT也能够进行很好的区分。
参考文章地址
David G.Lowe Distinctive Image Features from Scale-Invariant Keypoints. January 5, 2004.
Python-opencv3 SIFT算法做特征匹配
Python进行SIFT图像对准
SIFT算法详解
SIFT detector and descriptor
本文来自团队的安晟同学,他的github地址为:
https://github.com/monkeyDemon
经过8年多的发展,LSGO软件技术团队在地理信息系统、数据统计分析、计算机视觉领域积累了丰富的研发经验,也建立了人才培养的完备体系。
欢迎对算法设计与实现感兴趣的同学加入,与我们共同成长进步。
领取专属 10元无门槛券
私享最新 技术干货