python实现sift_使用opencv-python计算SIFT特征点的示例

本文介绍了如何在Python中使用OpenCV计算和绘制SIFT特征点,并提供了两个示例。SIFT(尺度不变特征转换)是一种强大的特征点检测算法,具有良好的鲁棒性。在实践中,可能会遇到因未安装`opencv-contrib-python`导致的错误,通过安装正确版本的库可以解决。示例代码展示了SIFT如何用于图像匹配,即便在复杂的场景下也能准确匹配特征。
摘要由CSDN通过智能技术生成

前言

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 库导致的,解决方法:pip install opencv-contrib-python

但愿程序已正常运行,但是,取决于你的各种版本配置,你还可能遇到这样的问题:

……Set OPENCV_ENABLE_NONFREE CMake option and rebuild the library in function 'cv::xfeatures2d::SIFT::create'

在 stackflow 上可以找到该问题的若干解决办法

由于我猜测这是和版本相关的问题,我是用如下方法解决的,很简单。

先卸载 opencv 和 opencv-contrib-python, 再重新安装统一版本的两个库。依此输入如下命令:pip uninstall opencv-python

pip uninstall opencv-contrib-python

pip install opencv-python==3.3.0.10

pip install opencv-contrib-python==3.3.0.10

demo1:计算并绘制特征点

我们先来简单感受一下SIFT在做什么

调用很简单:

使用detectAndCompute方法检测特征点

使用drawKeypoints将特征点绘制处理# -*- coding: utf-8 -*-

"""

Created on Thu Nov  8 15:34:41 2018

SIFT特征点检测demo1

计算SIFT特征点并绘制于图像中

@author: zyb_as

"""

import cv2

# 1) 以灰度图的形式读入图片

psd_img_1 = cv2.imread('jgz1.jpg', cv2.IMREAD_GRAYSCALE)

# 2) SIFT特征计算

# 初始化detector

sift = cv2.xfeatures2d.SIFT_create()

# 检测特征点

psd_kp1, psd_des1 = sift.detectAndCompute(psd_img_1, None)

# 3) 绘制特征点

#画出特征点

im_keypoint = cv2.drawKeypoints(psd_img_1, psd_kp1, psd_img_1,

flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

cv2.imshow('image', im_keypoint)#展示图片

cv2.waitKey(0)#等待按键按下

cv2.destroyAllWindows()#清除所有窗口

结果如下:199546875_2_20200817051320990img01

demo2:使用SIFT匹配两幅图像

我们可以用SIFT点做些什么呢?

最常见的应用有图像拼接、模板匹配等

在demo2中,我们假设这样的应用场景: 已有一张人脸模板,在另一幅图像中,尝试判断其中是否包含这个人的脸。

核心思路是:

1)使用SIFT分别检测图片和模板的特征点

2)对两组特征点进行KNN匹配

3)使用RANSAC剔除误匹配的点对

4)通过最后留下的配对成功的点对的数量,通过一个阈值,判断图像中是否出现了模板人脸对应的同一个人

这里我们对前两部进行实现练习:

代码详见AI ToolBox中的sift_demo2.py

看下效果:199546875_3_20200817051321161img02

199546875_4_20200817051321365img03

可以看到,强大的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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值