使用SIFT匹配金馆长表情包

python使用opencv计算SIFT特征点的示例

  • 前言
  • 潜在的问题记录
  • demo1:计算并绘制特征点
  • demo2:使用SIFT匹配两幅图像
  • 参考文章地址

前言

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 2018SIFT特征点检测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()#清除所有窗口

结果如下:
在这里插入图片描述

demo2:使用SIFT匹配两幅图像

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

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

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

核心思路是:

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

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

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

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

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

代码详见AI ToolBox中的sift_demo2.py

看下效果:
在这里插入图片描述
在这里插入图片描述
可以看到,强大的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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499495.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PID控制器开发笔记之六:不完全微分PID控制器的实现

从PID控制的基本原理我们知道,微分信号的引入可改善系统的动态特性,但也存在一个问题,那就是容易引进高频干扰,在偏差扰动突变时尤其显出微分项的不足。为了解决这个问题人们引入低通滤波方式来解决这一问题。 1、不完全微分的基…

使用Python实现简易的数据标注工具

使用Python实现简易的数据标注工具 以增加工作效率为目的,最近一直在着手构建一个AI ToolBox 这两天,我为其中的预处理工具目录添加了数据标注模块,本文所介绍内容的代码见这里 该数据标注模块包含以下几个demo gui_tkinter_exercise.py …

PID控制器开发笔记之七:微分先行PID控制器的实现

前面已经实现了各种的PID算法,然而在某些给定值频繁且大幅变化的场合,微分项常常会引起系统的振荡。为了适应这种给定值频繁变化的场合,人们设计了微分先行算法。 1、微分先行算法的思想 微分先行PID控制是只对输出量进行微分,而…

python实现视频关键帧提取(基于帧间差分)

python实现视频关键帧提取(基于帧间差分) 在很多场景下,我们不想或者不能处理视频的每一帧图片,这时我们希望能够从视频中提取出一些重要的帧进行处理,这个过程我们称为视频关键帧提取。 关键帧提取算法多种多样&…

PID控制器开发笔记之八:带死区的PID控制器的实现

在计算机控制系统中,由于系统特性和计算精度等问题,致使系统偏差总是存在,系统总是频繁动作不能稳定。为了解决这种情况,我们可以引入带死区的PID算法。 1、带死区PID的基本思想 带死区的PID控制算法就是检测偏差值,…

在多任务(RTOS)环境中使用看门狗

最近在SEGGER的博客上看到一篇有关在实时操作系统使用看门狗的文章。从一个失败的太空项目出发,分析了看门狗的作用及使用,自我感觉很有启发,特此翻译此文并推荐给各位同仁。为了阅读方便,有些航天领域名词本人添加了注释&#xf…

天池竞赛-津南数字制造算法挑战赛【赛场二】解决方案分享

天池竞赛-津南数字制造算法挑战赛【赛场二】解决方案分享 一、前言 竞赛页面 团队名BugFlow,最终排名35/2157 虽然成绩一般,但是作为一支目标检测领域的新手队伍,仅仅有一块1070显卡,从零开始拿到这个排名,也算有一…

信息摘要算法之三:SHA256算法分析与实现

前面一篇中我们分析了SHA的原理,并且以SHA1为例实现了相关的算法,在这一片中我们将进一步分析SHA2并实现之。 1、SHA简述 前面的篇章中我们已经说明过,SHA实际包括有一系列算法,分别是SHA-1、SHA-224、SHA-256、SHA-384以及SHA-…

focal loss的几种实现版本(Keras/Tensorflow)

起源于在工作中使用focal loss遇到的一个bug,我仔细的学习多个靠谱的focal loss讲解及实现版本 通过测试,我发现了这样一个奇怪的现象,几乎每个版本的focal loss实现对同样的输入计算出的loss都是不同的。 通过仔细的比对和思考&#xff0c…

基于ARM Cortex-M和Eclipse的SWO单总线输出

最近在MCU on Eclipse网站上看到Erich Styger所写的一篇有关通过SWD的跟踪接口SWO获取ARM Cortex-M相关信息的文章,文章结构明晰,讲解透彻,本人深受启发,特意将其翻译过来供各位同仁参考。当然限于个人水平,有不当之处…

PID控制器开发笔记之九:基于前馈补偿的PID控制器的实现

对于一般的时滞系统来说,设定值的变动会产生较大的滞后才能反映在被控变量上,从而产生合理的调节。而前馈控制系统是根据扰动或给定值的变化按补偿原理来工作的控制系统,其特点是当扰动产生后,被控变量还未变化以前,根…

借助百度识图爬取数据集

背景 一个能够实际应用的深度学习模型,背后的数据集往往都花费了大量的人力财力,通过聘用标注团队对真实场景数据进行标注生产出来,大多数情况不太可能使用网络来源的图片。但在项目初期的demo阶段,或者某些特定的场合下&#xf…

通过printf从目标板到调试器的输出

最近在SEGGER的博客上看到Johannes Lask写的一篇关于在调试时使用printf函数从目标MCU输出信息到调试器的文章,自我感觉很有启发,特此翻译此文并推荐给各位同仁。当然限于个人水平,有不当之处恳请指正。原文网址:https://blog.seg…

小心使用tf.image.resize_images,填坑经验分享给你

上上周,我在一个项目上线前对模型进行测试时出现了问题,这个问题困扰了我近两周,终于找到了问题根源,做个简短总结分享给你,希望对大家有帮助。 问题描述: 线上线下测试结果不一致,且差异很大…

PID控制器开发笔记之十:步进式PID控制器的实现

对于一般的PID控制系统来说,当设定值发生较大的突变时,很容易产生超调而使系统不稳定。为了解决这种阶跃变化造成的不利影响,人们发明了步进式PID控制算法。 1、步进式PID的基本思想 所谓步进式PID算法,实际就是在设定值发生阶跃…

AutoML 与 Bayesian Optimization 概述

1. AutoML 概述 AutoML是指对于一个超参数优化任务(比如规定计算资源内,调整网络结构找到准确率最高的网络),尽量减少人为干预,使用某种学习机制,来调节这些超参数,使得目标问题达到最优。 这…

使用Eclipse进行Makefile项目

最近在MCU on Eclipse网站上看到Erich Styger所写的一篇有关在Eclipse中使用Makefile创建项目的文章,文章讲解清晰明了非常不错,所以呢没人将其翻译过来供各位同仁参考。当然限于个人水平,有不当之处恳请指正。原文网址:https://m…

C语言学习及应用笔记之一:C运算符优先级及使用问题

C语言中的运算符绝对是C语言学习和使用的一个难点,因为在2011版的标准中,C语言的运算符的数量超过40个,甚至比关键字的数量还要多。这些运算符有单目运算符、双目运算符以及三目运算符,又涉及到左结合和右结合的问题,真…

使用FreeRTOS进行性能和运行时分析

在MCU on Eclipse网站上看到Erich Styger在2月25日发的博文,一篇关于使用FreeRTOS进行性能和运行分析的文章,本人觉得很有启发,特将其翻译过来以备参考。当然限于个人水平,有描述不当之处恳请指正。原文网址:https://m…

生成微信公众号对应二维码的两种简单方法

方法1 在浏览器中打开下面的链接 https://open.weixin.qq.com/qr/code?usernameName 其中Name替换为对应公众号的微信号 例如,我们打算生成公众号 AI算法联盟 的二维码 只需首先关注这个公众号 在其详细信息中,查找到微信号信息:AIReport…