| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Python知识库 -> 【计算机知识学习】OpenCV——图像特征以及匹配算法 -> 正文阅读 |
|
[Python知识库]【计算机知识学习】OpenCV——图像特征以及匹配算法 |
目录 2.利用sift.detectAndCompute()检测关键点并计算 surf因为专利问题,?一个下午纠结的恶心。 上午的转换类型的代码知道了,课件给的代码可以实现了? astype(int) 角点特征1 图像的特征大多数人都玩过拼图游戏。首先拿到完整图像的碎片,然后把这些碎片以正确的方式排列起来从而重建这幅图像。如果把拼图游戏的原理写成计算机程序,那计算机就也会玩拼图游戏了。 在拼图时,我们要寻找一些唯一的特征,这些特征要适于被跟踪,容易被比较。我们在一副图像中搜索这样的特征,找到它们,而且也能在其他图像中找到这些特征,然后再把它们拼接到一起。我们的这些能力都是天生的。 那这些特征是什么呢?我们希望这些特征也能被计算机理解。 如果我们深入的观察一些图像并搜索不同的区域 蓝色框中的区域是一个平面很难被找到和跟踪。无论向哪个方向移动蓝色框,都是一样的。对于黑色框中的区域,它是一个边缘。如果沿垂直方向移动,它会改变。但是如果沿水平方向移动就不会改变。而红色框中的角点,无论你向那个方向移动,得到的结果都不同,这说明它是唯一的。 所以,我们说角点是一个好的图像特征,也就回答了前面的问题。 角点是图像很重要的特征,对图像图形的理解和分析有很重要的作用。角点在三维场景重建运动估计,目标跟踪、目标识别、图像配准与匹配等计算机视觉领域起着非常重要的作用。在现实世界中,角点对应于物体的拐角,道路的十字路口、丁字路口等 那我们怎样找到这些角点呢?接下来我们使用 OpenCV 中的各种算法来查找图像的特征,并对它们进行描述。 Harris和Shi-Tomas算法1 Harris角点检测1.1 原理Harris角点检测的思想是通过图像的局部的小窗口观察图像,角点的特征是窗口沿任意方向移动都会导致图像灰度的明显变化 当R为大数值的正数时是角点 当R为大数值的负数时是边界 当R为小数是认为是平坦区域 1.2 实现在OpenCV中实现Hariis检测使用的API是:
参数:
示例:
?Harris角点检测的优缺点: 优点:
缺点:
2 Shi-Tomasi角点检测2.1 原理Shi-Tomasi算法是对Harris角点检测算法的改进,一般会比Harris算法得到更好的角点。Harris 算法的角点响应函数是将矩阵 M 的行列式值与 M 的迹相减,利用差值判断是否为角点。后来Shi 和Tomasi 提出改进的方法是,若矩阵M的两个特征值中较小的一个大于阈值,则认为他是角点,即: 在OpenCV中实现Shi-Tomasi角点检测使用API: corners = cv2.goodFeaturesToTrack ( image, maxcorners, qualityLevel, minDistance ) 参数:
返回:
示例:
?SIFT/SURF算法1.1 SIFT原理前面两节我们介绍了Harris和Shi-Tomasi角点检测算法,这两种算法具有旋转不变性,但不具有尺度不变性,以下图为例,在左侧小图中可以检测到角点,但是图像被放大后,在使用同样的窗口,就检测不到角点了。 所以,下面我们来介绍一种计算机视觉的算法,尺度不变特征转换即SIFT (Scale-invariant feature transform)。它用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David Lowe在1999年所发表,2004年完善总结。应用范围包含物体辨识、机器人地图感知与导航、影像缝合、3D模型建立、手势辨识、影像追踪和动作比对等领域。 SIFT算法的实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。SIFT所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。 1.1.1 基本流程Lowe将SIFT算法分解为如下四步:
我们就沿着Lowe的步骤,对SIFT算法的实现过程进行介绍: 1.1.2 尺度空间极值检测在不同的尺度空间是不能使用相同的窗口检测极值点,对小的关键点使用小的窗口,对大的关键点使用大的窗口,为了达到上述目的,我们使用尺度空间滤波器。 高斯核是唯一可以产生多尺度空间的核函数。-《Scale-space theory: A basic tool for analysing structures at different scales》。 1.2 SURF原理 使用 SIFT 算法进行关键点检测和描述的执行速度比较慢, 需要速度更快的算法。 2006 年 Bay提出了 SURF 算法,是SIFT算法的增强版,它的计算量小,运算速度快,提取的特征与SIFT几乎相同,将其与SIFT算法对比如下: 1.3 实现在OpenCV中利用SIFT检测关键点的流程如下所示: 1.实例化sift
2.利用sift.detectAndCompute()检测关键点并计算
参数:
返回:
3.将关键点检测结果绘制在图像上
参数:
SURF算法的应用与上述流程是一致,这里就不在赘述。 示例: 利用SIFT算法在中央电视台的图片上检测关键点,并将其绘制出来:
关于sift算法专利无法使用的问题 一、降低版本 https://blog.csdn.net/weixin_43772533/article/details/103242845 二、20年过期后 https://blog.csdn.net/pursuing2019/article/details/119523025 去年3月以后SIFT专利就已经到期了,OpenCV官方也把它挪出非免费模块了!我查了一下版本,从OpenCV3.4.10和OpenCV4.3后,就已经可以免费使用了! 另外需要注意的是,上面一句适用于OpenCV3.4.10,如果是OpenCV4.3,需要改为: sift = cv2.SIFT_create() 没有用这个,就是安装了 pip install opencv -contrib-python 之后 按照课件代码就运行出来了 Surf弄一下午 编译那些都是vs的,我也看不懂,解决不了 pip install --user opencv-contrib-python==3.4.2.17 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 12:10:37- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |