1.Harris角点检测

import numpy as np
import cv2 as cv
import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正确显示中文# Harris角点检测
'''
Harris角点检测的思想是通过图像的局部小窗口观察图像,角点的特征是窗口沿任意方向移动都会导致
图像灰度的明显变化将上述思想转化为数学表达式,即将局部窗口向各个方向移动(u,v)并计算所有灰度差异的总和,表达式
如下:E(u,v)=∑w(x,y)[I(x+u,y+v)-I(x,y)]²
其中I(x,y)是局部窗口的灰度图,I(x+u,y+v)是平移后的灰度图像,w(x,y)是窗口函数,其可以是矩形
窗口,也可以是对每一个像素赋予不同权重的高斯窗口
角点检测中使E(u,v)的值最大.利用一阶泰勒展开有:I(x+u,y+v)=I(x,y)+Ix*u+Iy*v其中:Ix和Iy是沿x和y方向的导数,可用sobel算子计算.E(u,v)=∑w(x,y)[I(x+u,y+v)-I(x,y)]²=∑w(x,y)[Ix²u²+2Ix*Iy*u*v+Iy²*v²]|Ix² Ix*Iy|=∑w(x,y)[u,v]|Ix*Iy Iy²|=[u v]M|u||v|M矩阵决定了E(u,v)的取值,M是Ix和Iy的二次函数,可以表示成椭圆的形状,椭圆的长短半轴由M的特征值a1和a2决定,方向由特征矢量决定共可分为三种情况:.图像中的直线.一个特征值大,另一个特征值小,a1>>a2或者a2>>a1.椭圆函数值在某一个方向上大,在其他方向小.图像中的平面.两个特征值都小,且近似相等,椭圆函数值再各个方向都有.图像中的角点.两个特征值都大,且近似相等,椭圆函数在所有方向都增大.Harris给出的角点计算方法并不需要计算具体的特征值,而是计算一个角点响应值R来判断角点.R的计算公式为:R=detM-α(traceM)²式中,detM为矩阵M的行列式,traceM为矩阵M的迹,α为常数取值范围为0.04~0.06.事实上,特征是隐含在detM和traceM中,因为:detM=a1a2traceM=a1+a2那么认为:.当R为大数时的正数是角点.当R为大数时的负数为边界.当R为小数认为是平坦区域API:cv.cornerHarris(src,blockSize,ksize,k)参数:img:数据类型为float32的输入图像blockSize:角点检测中要考虑的领域大小ksize:sobel算子求导使用的核大小k:角点检测中的自由参数取值范围为[0.04,0.06]'''# 读取图片
img = cv.imread('image/house.jpg')# 转换成灰度图
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)# 数据类型转换成float32
gray_float32 = np.float32(gray)# 角点检测
dst = cv.cornerHarris(gray_float32, 2, 3, 0.04)#设置阈值,将角点绘制出来,阈值根据图像进行选择
R=dst.max() * 0.01
#这里将阈值设为dst.max()*0.01 只有大于这个值的数才认为数角点
img[dst > R] = [0, 0, 255]plt.subplot(2,2,1)
plt.imshow(cv.imread('image/house.jpg')[:,:,::-1])
plt.title('原图')plt.subplot(2,2,2)
plt.imshow(gray,cmap=plt.cm.gray)
plt.title('灰度图(uint8型)')plt.subplot(2,2,3)
plt.imshow(gray_float32,cmap=plt.cm.gray)
plt.title('灰度图(float32型)')plt.subplot(2,2,4)
plt.imshow(img[:,:,::-1])
plt.title('检测结果')plt.savefig('image/角点检测(Harris).jpg')
plt.show()

2.Shi-Tomas算法

import numpy as np
import cv2 as cv
import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正确显示中文#shi-Tomas算法
'''
shi-Tomas算法是对Harris角点检测算法的改进,一般会比Harris算法得到更好的角点.
Harris算法的角点响应函数是将矩阵M的行列式值与M的迹相减,利用差值判断是否为角点,
后来shi和Tomas提出改进的方法是,若矩阵M的两个特征值中较小的一个大于阈值,则认为
他是角点,即:R=min(a1,a2)API:corners=cv.goodFeaturesToTrack(image,maxcorners,qualityLevel,minDistance)参数:image:输入的灰度图像maxCorners:获取角点数的数目qualityLevel:该参数指出最低可接受的角点质量水平,在0~1之间minDistance:角点之间的最小欧氏距离,避免得到相邻特征点返回:corners:搜索到的角点,在这里所有低于质量水平的角点被排除,然后把合格的角点按照质量排序,然后将质量较好的角点附近(小于最小欧氏距离)的角点删除,最后找到maxCorners个角点返回'''#读取图片
img=cv.imread('image/house.jpg')#转成灰度图
gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)#shi-Tomas角点检测
corners=cv.goodFeaturesToTrack(gray,1000,0.05,10)#绘制角点
for corner in corners:x,y=corner.ravel()cv.circle(img,(int(x),int(y)),2,(0,0,255),-1)plt.subplot(2,1,1)
plt.imshow(cv.imread('image/house.jpg')[:,:,::-1])
plt.title('原图')plt.subplot(2,1,2)
plt.imshow(img[:,:,::-1])
plt.title('检测结果')plt.savefig('image/角点检测(shi-Tomas).jpg')
plt.show()

3.sift算法

import numpy as np
import cv2 as cv
import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正确显示中文# Sift算法
'''
Harris和shi-Tomas角点检测算法,这两种算法具有旋转不变性,但不具有尺度不变性,在原本能检测
到角点的位置,当图像放大后,就检测不到角点了.尺度不变特征转换即SIFT(Scale-invariant feature transform).它用来侦测与描述影响中
局部性特征,它在空间尺度中寻找极值点,并提取出其位置,尺度,旋转不变量,此算法由David Lowe
在1999年所发表,2004年完善总结.应用范围包含物体识别,机器人地图感知与导航,影像缝合,3D模型
建立,手势识别,影像追踪和动作对比等领域.SIFT算法实质是在不同的尺度空间上寻找关键点(特征点),并计算出关键点的方向.SIFT所查找到的关键点
是一些十分突出,不会因为光照,仿射变换和噪音等因素影响而变化的点,如角点,边缘点,暗区的亮点及亮区
的暗点.'''# 实现SIFT检测关键点的步骤# 1.实例化sift
# sift = cv.SIFT_create()# 2.利用sift.detectAndCompute()检测关键点并计算
'''
kp,des=sift.detectAndCompute(gray,None)
参数:gray:进行关键点检测的图像(灰度图)
返回:kp:关键点信息,包括位置,尺度,方向信息des:关键点描述,每个关键点对应128个梯度信息的特征向量
'''#3.将关键点检测结果绘制在图像上
'''
cv.drawKeyPoints(image,keypoints,outputimage,color,flags)
参数:image:原始图像keypoints:关键点信息outputimage:输出图片,可以是原始图color:颜色设置,通过(b,g,r)修改颜色flags:绘图功能的标识设置1.cv.DRAW_MATCHES_FLAGS_DEFAULT:创建输出图像矩阵,使用现存的输出图像绘制匹配对和特征点,对每一个特征点只绘制中间点2.cv.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTING:不创建输出图像矩阵,而是在输出图像上绘制匹配对3.cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS:对每一个特征点绘制带大小和方向的关键点图形4.cv.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS:单点的特征点不被绘制
'''#读取图像
img=cv.imread('image/house.jpg')#转换成灰度图像
gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)#实例化sift
sift=cv.SIFT_create()#检测关键点并计算
kp,des=sift.detectAndCompute(gray,None)#绘制关键点
# cv.drawKeypoints(img,kp,img,(0,255,0),cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv.drawKeypoints(img,kp,img,(0,255,0),cv.DRAW_MATCHES_FLAGS_DEFAULT)plt.subplot(2,1,1)
plt.imshow(cv.imread('image/house.jpg')[:,:,::-1])
plt.title('原图')plt.subplot(2,1,2)
plt.imshow(img[:,:,::-1])
plt.title('检测结果')plt.savefig('image/角点检测(sift).jpg')
plt.show()

4.fast算法

import numpy as np
import cv2 as cv
import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正确显示中文# fast算法
'''
Fast(全称Features from accelerated segment test)是一种用于角点检测的算法,
该算法的原理是取图像中检测点,以改点为圆心的周围邻域内像素点判断检测点是否为角点,
通俗的讲就是若一个像素周围有一定数量的像素与该点像素不同,则认为其为角点.基本流程:1.在图像中选取一个像素点p,来判断它是不是关键点.Ip等于点p的灰度值.2.以r为半径,覆盖p点周围M个像素,通常情况下,设置r=3,则M=163.设置一个阈值t,如果在这16个像素点中存在n个连续像素点的灰度值都高于Ip+t,或者低于Ip-t,那么像素点p就被认为是一个角点,n一般取值为124.由于检测特征点时是需要对所有的像素点进行监测,然而图像中绝大多数点都不是特征点,如果对每个像素点都进行上述的检测过程,那显然浪费许多时间,因此采用一种进行非特征点判别的方法:首先对候选点的周围每个90度的点:1,9,5,13进行测试(先测1和9,如果他们符合阈值要求,再测5和13).如果p是角点,那么这是个点中至少有3个要符合阈值要求,否则直接剔除,对保留下来的点再继续进行测试虽然这个检测器的效率很高,但它有一下几个缺点:.获得的候选点比较多.特征点的选取不是最优的,因为它的效果取决于与要解决的问题的角点的分布情况.进行非特征点判别时大量的点被丢弃.检测到的很多特征点都是相邻的
前3个问题可以通过机器学习的方法解决,最后一个问题可以使用非最大值抑制的方法解决'''# 机器学习的角点检测
'''
1.选择一组训练图片(最好是跟最后应用相关的图片)
2.使用Fast算法找出每幅图像的特征点,对图像中每一个特征点,将其周围的16个像素存储构成一个向量p
3.每一个特征点的16个像素点都属于下列三类中的一种:| d Ip->x≤Ip-t (darker)Sp->x=| s Ip-t≤Ip->x≤Ip+t (similar)| b Ip->x≥Ip+t (brighter)
4.根据这些像素点的分类,特征向量P也被分为3个子集:Pd,Ps,Pb
5.定义一个新的布尔变量Kp,如果p是角点就设置为True,否则为False
6.利用特征向量p,目标值Kp,训练ID3树
7.将构建好的决策树运用于其他图像的快速检测'''# 非极大值抑制
'''
在筛选出来的候选点中有很多是紧挨在一起的,需要通过非极大值抑制来消除这种影响.
为所有的候选点后确定一个打分函数V,V的值可以这样计算:先分别计算Ip与圆上16个
点的像素值差值,取绝对值,再将这16个绝对值相加,就得到了V值V=∑|Ip-Ii| (i=1,2...16)最后比较毗邻候选点的V值,把V值较小的候选点pass掉
Fast算法的思想与我们对角点的直观认识非常接近,化繁为简.Fast算法比其他角点的检测
算法快,但是在噪声比较高时不够稳定,这需要设置合适的阈值.
'''#Fast算法的实现'''
1.实例化fastfast=cv.FastFeatureDetector_create(threshold,nonmaxSuppression)参数:threshold:阈值t,默认值为10(特征点与周围像素值差值的阈值)nonmaxSuppression:是否进行非极大值抑制,默认为True返回:fast:创建的FastFeatureDetector对象2.利用fast.detect检测关键点kp=fast.detect(grayImg,None)参数:grayImg:输入的灰度图片(彩色图像也可以)返回:kp:关键点信息,包括位置,尺度,方向信息3.将关键点监测结果绘制在图像上,与sift中的一样
cv.drawKeypoints(image,keypoints,outputimage,color,flags)'''img=cv.imread('image/house.jpg')
img2=cv.imread('image/house.jpg')#阈值设为20 进行非极大值抑制
fast=cv.FastFeatureDetector_create(threshold=30,nonmaxSuppression=True)
fast_not_nonmaxSuppression=cv.FastFeatureDetector_create(threshold=30,nonmaxSuppression=False)#检测出关键点
kp=fast.detect(img,None)
kp_not_nonmaxSuppression=fast_not_nonmaxSuppression.detect(img2,None)#将关键点绘制在图像上
cv.drawKeypoints(img,kp,img,(0,255,0),cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv.drawKeypoints(img2,kp_not_nonmaxSuppression,img2,(0,255,0),cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)plt.subplot(2,1,1)
plt.imshow(img2[:,:,::-1])
plt.title('未进行非极大值抑制')plt.subplot(2,1,2)
plt.imshow(img[:,:,::-1])
plt.title('进行了非极大值抑制')plt.savefig('image/fast算法.jpg')
plt.show()

5.ORM算法

import matplotlib.pyplot as plt
import cv2 as cv
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正确显示中文#ORB算法
'''
1.实例化ORBorb=cv.ORB_create(nfeatures)参数:nfeatures:特征点的最大数量返回值:orb:实例的ORB对象2.利用orb.detectAndCompute()检测关键点并计算kp,des=orb.detectAndCompute(gray,None)参数:gray:输入的灰度图像返回值:kp:关键点的信息,包括位置,尺度,方向des:关键点描述符,每个关键点BRIEF特征向量,二进制字符3.将关键点绘制在图像上cv.drawKeypoints(image,keypoints,outputimage,flags)'''img=cv.imread('image/house.jpg')#实例化orb
orb=cv.ORB_create(5000)#检测关键点
kp,des=orb.detectAndCompute(img,None)print(des.shape)#将特征点绘制在图像上
cv.drawKeypoints(img,kp,img,(0,255,0),cv.DRAW_MATCHES_FLAGS_DEFAULT)plt.imshow(img[:,:,::-1])
plt.title('ORB检测结果')plt.savefig('image/ORB算法.jpg')
plt.show()


更多内容同步更新于个人博客系统:OpenCV中的几种角点检测方法

OpenCV中的几种角点检测方法相关推荐

  1. OpenCV实战(16)——角点检测详解

    OpenCV实战(16)--角点检测详解 0. 前言 1. Harris 特征检测器 1.1 检测 Harris 角点 1.2 cv::cornerHarris 函数参数 2. 可追踪的良好特征 3. ...

  2. 激光雷达角点检测 c语言,一种基于事件帧的角点检测方法与流程

    本发明属于图像处理领域,用于解决基于事件相机的SLAM项目的角点检测. 背景技术: 在过去几十年里,由于计算机视觉算法的研究与发展,人们对机器人感知的兴趣也日益增加.这种传统相机能够捕获相机周围环境的 ...

  3. OpenCV中的5种平滑滤波操作

    平滑滤波是一种简单又常见的图像处理操作.平滑图像的目的有很多,但通常都是为了减少噪声和伪影. 在OpenCV中共有5种平滑滤波操作,分别是以下几种: 实验测试代码如下: #include<ios ...

  4. 基于曲线曲度或类曲度的角点检测方法总结

    摘要: 主要介绍了基于曲线曲度的角点检测方法,不仅介绍了早期的曲度计算方法,还包括了CSS方法.CPDA方法.样条曲线参数估计曲度方法.协方差矩阵估计曲度方法等,最后还给出了针对这些方法最新的一些改进 ...

  5. 判断二极管导通例题_几种二极管的检测方法(普通,稳压,双向触发)

    几种二极管的检测方法(普通,稳压,双向触发二极管) (一) 普通二极管的检测(包括检波二极管.整流二极管.阻尼二极管.开关二极管.续流二极管) 普通二极管是由一个PN结构成的半导体器件,具有单向导电特 ...

  6. 语音端点检测 php,几种语音端点检测方法简介

    几种语音端点检测方法简介 2011年第11期福建电脑 67 几种语音端点检测方法简介 邢亚从 (苏州市职业大学江苏苏州215000) [摘要]:语音的端点检测在语音的编码.语音识别.语音增强.说话人识 ...

  7. 计算机网络检查方式,一种计算机网络环路检测方法与流程

    本发明涉及计算机网络环路检测技术领域,具体为一种计算机网络环路检测方法 背景技术: 计算机俗称电脑,是一种用于高速计算的电子计算机器,可以进行数值计算,又可以进行逻辑计算,还具有存储记忆功能.是能够按 ...

  8. 五种外观缺陷检测方法,不分优劣,应用场景不同使用的技术不同

    工业外观缺陷检测方法详细介绍如下: 一.超声波探伤检测 超声波探伤检测是根据声波在缺陷处发生波形变化的原理来检测缺陷.声波在工件内的反射状况就会显示在屏幕上,根据反射波的时间及形状来判断工业制造件内部 ...

  9. 疲劳驾驶监测方案_一种疲劳驾驶检测方法

    一种疲劳驾驶检测方法 [专利摘要]本发明公开了一种疲劳驾驶检测方法,属于汽车安全驾驶领域,通过采集驾驶员的行为指标(主要为方向盘数据.驾驶时间和驾驶车速),进行信息预处理,得到疲劳生理参数作为检测指标 ...

最新文章

  1. 牛客网刷题知识汇总3
  2. Win XP远程桌面双管理员同时登录
  3. 四大中三家已面向客户推出机器人业务解决方案?别逗了,先用机器人自我革命吧! post by 上海嘉冰信息技术...
  4. Linux C编程之二:Linux基础
  5. 单例模式反射、序列化漏洞及解决方案!
  6. 计算机网络与影视多媒体技术 南京理工大学,计算机网络多媒体数学库和课件结构设计-计算机仿真论文-计算机论文(8页)-原创力文档...
  7. 在气候灾难的时代,这些游戏正在用自己的方式去重新审视自然
  8. SQL Server表结构和数据导入到MySQL
  9. java各个平台订单动态对接_平台订单丨全国各地最新采购、代加工订单,免费联系对接...
  10. oracle raw类型 索引,为什么RAW数据类型可以建立索引,但是不走索引
  11. matlab标定工具箱 参数,使用MATLAB标定工具箱求出内外参数后怎样求实物的两点间......
  12. ajax redirectattributes 使用,Spring中RedirectAttributes对象重定向传参
  13. Vue中,在<template>内进行页面链接跳转
  14. MongoDB 计划从“Data Sprawl”中逃脱!
  15. 为ASP.NET AJAX 1.0 Beta补充trace和dump功能
  16. 基于LDA的文本主题聚类Python实现
  17. VS2019离线安装方法
  18. 2022-2028年中国环保减速机行业运行动态及投资机会分析报告
  19. ussd代码大全_USSD查询器app
  20. IntelliJ IDEA 汉化包-支持2018和2019版本

热门文章

  1. 5GC学习笔记之NF功能简介
  2. 【Demo】IOS中将对象数组按照时间戳排序
  3. WIN7以上系统WDDM虚拟显卡开发(WDDM Filter/Hook Driver 显卡过滤驱动开发之一)
  4. [绍棠] iOS设置Label上显示不同字体大小和字体颜色
  5. java练习题:宝石和石头(map)
  6. 如何将报表服务部署到金蝶中间件中
  7. spring boot web程序发布到金蝶中间件
  8. python word转excel题库_将word版题库转换为Excel版
  9. Matplotlib入门06-箱线图
  10. wifi 租约到期 自动连接