返回顶部
首页 > 资讯 > 后端开发 > Python >Python OpenCV中如何进行特征点检测与匹配
  • 218
分享到

Python OpenCV中如何进行特征点检测与匹配

2023-06-26 06:06:01 218人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

python OpenCV中如何进行特征点检测与匹配,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。背景提取图像的特征点是图像领域中的关键任务,不管在传统还是在深度

python OpenCV中如何进行特征点检测与匹配,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

背景

提取图像的特征点是图像领域中的关键任务,不管在传统还是在深度学习的领域中,特征代表着图像的信息,对于分类、检测任务都是至关重要的;

特征点应用的一些场景:

图像搜索:以图搜图(电商、教育领域)

图像拼接:全景拍摄(关联图像拼接)

拼图游戏:游戏领域

一、Harris角点

哈里斯角点检测主要有以下三种情况:

Python OpenCV中如何进行特征点检测与匹配

  • 光滑区域:无论向哪个方向移动,衡量系数不变;

  • 边缘区域:垂直边缘移动时,衡量系数变化强烈;

  • 角点区域:不管往哪个方向移动,衡量系数变化强烈;

函数原型:

cornerHarris(img,blockSize,ksize,k)

blockSize:检测窗口大小;

k:权重系数,一般取0.02~0.04之间;

代码案例:

img = cv2.imread('chess.png')gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)dst = cv2.cornerHarris(gray, 2, 3, 0.04)img[dst > 0.01*dst.max()] = (0, 0, 255)cv2.imshow('harris', img)cv2.waiTKEy(0)

Python OpenCV中如何进行特征点检测与匹配

二、Shi-Tomasi角点检测

说明:是Harris角点检测的改进,在Harris中需要知道k这个经验值,而在Shi-Tomasi不需要;

函数原型:

GoodFeaturesToTrack(img,…)

maxCorners:角点的最大数量,值为0表示所有;

qualityLevel:角点的质量,一般在0.01~0.1之间(低于的过滤掉);

minDistance:角点之间最小欧式距离,忽略小于此距离的点;

mask:感兴趣区域;

useHarrisDetector:是否使用Harris算法(默认为false)

代码案例:

img = cv2.imread('chess.png')gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)dst = cv2.goodFeaturesToTrack(gray, 1000, 0.01, 10)dst = np.int0(dst)            # 实际上也是np.int64for i in dst:    x, y = i.ravel()         # 数组降维成一维数组(inplace的方式)    cv2.circle(img, (x, y), 3, (0, 0, 255), -1)cv2.imshow('harris', img)cv2.waitKey(0)

Python OpenCV中如何进行特征点检测与匹配

本质上和Harris角点检测相同,效果会好一些,角点数量会多一些;

三、SIFT关键点

中文简译:与缩放无关的特征转换;

说明:Harris角点检测具有旋转不变性,也就是旋转图像并不会影响检测效果;但其并不具备缩放不变性,缩放大小会影响角点检测的效果;SIFT具备缩放不变性的性质;

实现步骤:

创建SIFT对象 —— 进行检测(sift.detect) —— 绘制关键点(drawKeypoints)

代码案例:

img = cv2.imread('chess.png')gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)sift = cv2.xfeatures2d.SIFT_create()kp = sift.detect(gray, None)      # 第二个参数为mask区域cv2.drawKeypoints(gray, kp, img)cv2.imshow('sift', img)cv2.waitKey(0)

Python OpenCV中如何进行特征点检测与匹配

四、SIFT描述子

首先需要说明,关键点和描述子是两个概念;

关键点:位置、大小和方向;

关键点描述子:记录了关键点周围对其有贡献的像素点的一组向量值,其不受仿射变换,光照变换等影响;描述子的作用就是用于特征匹配;

同时计算关键点和描述子的函数(主要使用):

detectAndCompute(img,…)

代码案例:

img = cv2.imread('chess.png')gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)sift = cv2.xfeatures2d.SIFT_create()kp, dst = sift.detectAndCompute(gray, None)      # 第二个参数为mask区域

得到的dst即为描述子的信息;

五、SURF

中译:加速的鲁棒性特征检测;

说明:SIFT最大的缺点是速度慢,因此才会有SURF(速度快);

实现步骤与SIFT一致,代码如下:

surf = cv2.xfeatures2d.SURF_create()kp, dst = surf.detectAndCompute(gray, None)      # 第二个参数为mask区域cv2.drawKeypoints(gray, kp, img)

由于安装的opencv-contrib版本过高(有版权问题),已经不支持该功能了,在此就不作展示了;

六、ORB

说明:最大的优势就是做到实时检测,缺点就是缺失了很多信息(准确性下降);

主要是两个技术的结合:FAST(特征点实时检测)+ BRIEE(快速描述子建立,降低特征匹配时间)

使用步骤与之前的SIFT一致,代码如下:

img = cv2.imread('chess.png')gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)orb = cv2.ORB_create()kp, dst = orb.detectAndCompute(gray, None)      # 第二个参数为mask区域cv2.drawKeypoints(gray, kp, img)cv2.imshow('orb', img)cv2.waitKey(0)

Python OpenCV中如何进行特征点检测与匹配

可以看出,相比于SIFT以及SURF关键点变少了,但是其速度有了很大提升;

七、暴力特征匹配(BF)

匹配原理:类似于穷举匹配机制,使用第一组中每个特征的描述子与第二组中的进行匹配,计算相似度,返回最接近的匹配项;

实现步骤:

创建匹配器:BFMatcher(nORMType,crossCheck)

进行特征匹配:bf.match(des1,des2)

绘制匹配点:cv2.drawMatches(img1,kp1,img2,kp2)

代码案例:

img1 = cv2.imread('opencv_search.png')img2 = cv2.imread('opencv_orig.png')g1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)g2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)sift = cv2.SIFT_create()kp1, dst1 = sift.detectAndCompute(g1, None)      # 第二个参数为mask区域kp2, dst2 = sift.detectAndCompute(g2, None)      # 第二个参数为mask区域bf = cv2.BFMatcher_create(cv2.NORM_L1)match = bf.match(dst1, dst2)img3 = cv2.drawMatches(img1, kp1, img2, kp2, match, None)cv2.imshow('result', img3)cv2.waitKey(0)

Python OpenCV中如何进行特征点检测与匹配

从上图可看出,匹配的效果还是不错的,只有一个特征点匹配错误;

八、FLANN特征匹配

优点:在进行批量特征匹配时,FLANN速度更快;

缺点:由于使用的时邻近近似值,所有精度较差;

实现步骤与暴力匹配法一致,代码如下:

img1 = cv2.imread('opencv_search.png')img2 = cv2.imread('opencv_orig.png')g1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)g2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)sift = cv2.SIFT_create()kp1, dst1 = sift.detectAndCompute(g1, None)      # 第二个参数为mask区域kp2, dst2 = sift.detectAndCompute(g2, None)      # 第二个参数为mask区域index_params = dict(algorithm = 1, trees = 5)search_params = dict(checks=50)flann = cv2.FlannBasedMatcher(index_params, search_params)matchs = flann.knnMatch(dst1, dst2, k=2)good = []for i, (m, n) in enumerate(matchs):    if m.distance < 0.7 * n.distance:        good.append(m)img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, [good], None)cv2.imshow('result', img3)cv2.waitKey(0)

Python OpenCV中如何进行特征点检测与匹配

上图可以看出,匹配的特征点数量相比暴力匹配明显变少了,但速度会快很多;

九、图像查找

实现原理:特征匹配 + 单应性矩阵;

单应性矩阵原理介绍:

Python OpenCV中如何进行特征点检测与匹配

上图中表示从两个不同角度对原图的拍摄,其中H为单应性矩阵,可通过该矩阵将图像进行转换;

下面使用两个函数实现图像查找的功能:

findHomography():获得单应性矩阵;

perspectivveTransform():仿射变换函数;

代码实现如下:

img1 = cv2.imread('opencv_search.png')img2 = cv2.imread('opencv_orig.png')g1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)g2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)sift = cv2.SIFT_create()kp1, dst1 = sift.detectAndCompute(g1, None)      # 第二个参数为mask区域kp2, dst2 = sift.detectAndCompute(g2, None)      # 第二个参数为mask区域index_params = dict(algorithm = 1, trees = 5)search_params = dict(checks=50)flann = cv2.FlannBasedMatcher(index_params, search_params)matchs = flann.knnMatch(dst1, dst2, k=2)good = []for i, (m, n) in enumerate(matchs):    if m.distance < 0.7 * n.distance:        good.append(m)if len(good) >= 4:    # 获得源和目标点的数组    srcPts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2)    dstPts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1, 2)        # 获得单应性矩阵H    H, _ = cv2.findHomography(srcPts, dstPts, cv2.RANSAC, 5.0)    h, w = img1.shape[:2]    pts = np.float32([[0,0], [0, h-1], [w-1, h-1], [w-1, 0]]).reshape(-1, 1, 2)    # 进行放射变换    dst = cv2.perspectiveTransform(pts, H)        # 绘制查找到的区域    cv2.polylines(img2, [np.int32(dst)], True, (0,0,255))else:    print('good must more then 4.')    exit()    img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, [good], None)cv2.imshow('result', img3)cv2.waitKey(0)

Python OpenCV中如何进行特征点检测与匹配

Python主要用来做什么

Python主要应用于:1、web开发;2、数据科学研究;3、网络爬虫;4、嵌入式应用开发;5、游戏开发;6、桌面应用开发。

关于Python OpenCV中如何进行特征点检测与匹配问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网Python频道了解更多相关知识。

--结束END--

本文标题: Python OpenCV中如何进行特征点检测与匹配

本文链接: https://lsjlt.com/news/307297.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python OpenCV中如何进行特征点检测与匹配
    Python OpenCV中如何进行特征点检测与匹配,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。背景提取图像的特征点是图像领域中的关键任务,不管在传统还是在深度...
    99+
    2023-06-26
  • OpenCV实现特征检测和特征匹配方法汇总
    目录1.SURF2.SIFT3.ORB4.FAST5.Harris角点一幅图像中总存在着其独特的像素点,这些点我们可以认为就是这幅图像的特征,成为特征点。计算机视觉领域中的很重要的图...
    99+
    2024-04-02
  • PythonOpenCV学习之特征点检测与匹配详解
    目录背景一、Harris角点二、Shi-Tomasi角点检测三、SIFT关键点四、SIFT描述子五、SURF六、ORB七、暴力特征匹配(BF)八、FLANN特征匹配九、图像查找总结背...
    99+
    2024-04-02
  • OpenCV特征提取与检测之Harris角点检测
    目录前言1. 效果图2. 原理3. 源码3.1 Harris角点检测3.2 精细角点检测总结前言 这篇博客将了解什么是特征,角点,哈里斯角点检测(Harris Corner Dete...
    99+
    2024-04-02
  • Python中OpenCV图像特征和harris角点检测
    目录概念第一步:计算一个梯度 Ix,Iy第二步:整合矩阵,计算特征值第三步:比较特征值的大小第四步: 非极大值抑制,把真正的角点留下来,角点周围的过滤掉代码实现概念 第一步:...
    99+
    2024-04-02
  • OpenCV特征提取与检测之Shi-Tomasi角点检测器
    前言  角点通常被定义为两条边的交点,或者说,角点的局部邻域应该具有两个不同区域的不同方向的边界。角点检测(Corner Detection)是计算机视觉系统中获取图像特征...
    99+
    2024-04-02
  • 在Python中如何使用OpenCV进行直线检测
    这篇文章主要介绍了在Python中如何使用OpenCV进行直线检测的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇在Python中如何使用OpenCV进行直线检测文章都会有所收获,下面我们一起来看看吧。1. 引言...
    99+
    2023-06-29
  • 如何利用OpenCV进行特征(颜色、形状)提取
    目录图像处理1. 颜色2. 形状总结图像处理 图像处理所做的只是从图像中提取有用的信息,从而减少数据量,但保留描述图像特征的像素。 下面从图像中提取颜色、形状和纹理特征的方法开始 1...
    99+
    2024-04-02
  • 详解在Python中使用OpenCV进行直线检测
    目录1. 引言2. 霍夫变换3. 举个栗子3.1 读入图像 进行灰度化3.2 执行边缘检测3.3 进行霍夫变换补充1. 引言 在图像处理中,直线检测是一种常见的算法,它通常获取n个边...
    99+
    2024-04-02
  • 如何用XGBoost在Python 中进行特征重要性分析和特征选择
    如何用XGBoost在Python 中进行特征重要性分析和特征选择,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。使用诸如梯度增强之类的决策树方法的集成的好处是,...
    99+
    2023-06-15
  • Python+OpenCV内置方法如何实现行人检测
    小编给大家分享一下Python+OpenCV内置方法如何实现行人检测,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!您是否知道 OpenCV 具有执行行人检测的内置...
    99+
    2023-06-22
  • 如何在python中使用OpenCV检测人脸
    这期内容当中小编将会给大家带来有关如何在python中使用OpenCV检测人脸,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相...
    99+
    2023-06-14
  • 如何使用深度学习和OpenCV进行目标检测
    这篇文章给大家分享的是有关如何使用深度学习和OpenCV进行目标检测的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。使用深度学习和 OpenCV 进行目标检测基于深度学习的对象检测时,您可能会遇到三种主要的对象检测...
    99+
    2023-06-22
  • 如何在Python中进行数据预处理和特征工程
    如何在Python中进行数据预处理和特征工程数据预处理和特征工程是数据科学领域中非常重要的一部分。数据预处理是指对原始数据进行清洗、转换和整理,以便进一步分析和建模。而特征工程则是指从原始数据中提取有用的特征,以帮助机器学习算法更好地理解数...
    99+
    2023-10-22
    缺失值处理 数据预处理:数据规范化 离群值处理 特征工程:特征选择 特征构建
  • python+mediapipe+opencv如何实现手部关键点检测功能
    今天给大家介绍一下python+mediapipe+opencv如何实现手部关键点检测功能。,文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。一、mediapip...
    99+
    2023-06-26
  • 如何分析ORB、SURF、SIFT特征点提取方法以及ICP匹配方法
    本篇文章给大家分享的是有关如何分析ORB、SURF、SIFT特征点提取方法以及ICP匹配方法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。在进行编译视觉SLAM时,书中提到了O...
    99+
    2023-06-22
  • 使用Python中OpenCV和深度学习进行全面嵌套边缘检测
    这篇博客将介绍如何使用OpenCV和深度学习应用全面嵌套的边缘检测。并将对图像和视频流应用全面嵌套边缘检测,然后将结果与OpenCV的标准Canny边缘检测器进行比较。 1. 效果图...
    99+
    2024-04-02
  • 基于Python如何进行年龄和性别检测
    基于Python如何进行年龄和性别检测,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言我将使用 Python 编程语言带您完成使用机器学习进行年龄和性别检测的任务。年龄和...
    99+
    2023-06-22
  • Python OpenCV中如何进行图形绘制
    这篇文章将为大家详细讲解有关Python OpenCV中如何进行图形绘制,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。背景使用OpenCV进行图形绘制是一种必备的技能,在图像的任务...
    99+
    2023-06-22
  • 如何在Keras中进行异常检测任务
    在Keras中进行异常检测任务通常可以通过以下步骤实现: 准备数据集:收集和准备用于训练和测试的数据集。数据集应包含正常和异常样...
    99+
    2024-03-14
    Keras
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作