基于KITTI数据集的无人驾驶感知与传感器融合实现—(7)— Shi-Tomasi 角点检测&FAST角点检测

学习前言

  之前是对道路图片进行了 Harris角点检测算法.,不过角点检测常用的还有FAST角点检测算法.和Shi-Tomasi 算法.。这一篇博客就是进行==FAST角点检测 & Shi-Tomasi 角点检测对车道线的检测。==也是比较简单的。
  老样子,我还是把原作者的项目连接放上面啦~ 连接.在这里插入图片描述

一、 Shi-Tomasi 角点检测 & FAST角点检测

  这边就简单介绍一下这两种算法,给有基础的当是个回顾和复习,对于没学过的同学可以点进去看看,FAST角点检测算法.,Shi-Tomasi 算法
  自己觉得应该是把算法讲明白了,算法也不难,加油加油~

 1、Shi-Tomasi 角点检测

  Shi-Tomasi 角点检测算法其实是建立在Harris角点检测算法的基础上的,可以说是Harris角点检测算法的升级版
  Shi-Tomasi 角点检测算法其实就是修改了Harris角点检测算法对于角点判断原理,这里直接上图:


在这里插入图片描述
在这里插入图片描述
  对于Harris角点检测算法,它的角点响应值 R R R是如上图一样计算的,但是Shi-Tomasi 角点检测算法的角点响应值 R R R是这样的:
R = m i n ( λ 1 , λ 2 ) R=min(λ_1,λ_2) R=min(λ1λ2)
  和 Harris 一样,如果该分数大于设定的阈值,我们就认为它是一个角点。在这里插入图片描述

  2、FAST角点检测

  FAST角点检测也简单,上图:
在这里插入图片描述
  FAST角点检测的方法主要是考虑像素点附近的圆形窗口上的16个像素,如下图所示, p p p为中心像素点,而白框标示的点像素则是我们需要考虑的点。

  最初的检测方法就是检测在这样的圆环上的16个像素点中,如果有 n n n个连续的点都比中心像素 p p p的强度都大,或都小的话,这样的中心点就是角点,实际上比较强度时,需要加上阈值 t t t

  一般情况下,n是取12,所以这个标准定义为FAST-12,而实际上当n=9时,往往能取得较好的效果。


 3、为什么要考虑Shi-Tomasi 角点检测&FAST角点检测

  基于我们要实现的目的:无人驾驶感知与传感器融合实现,我们处理的图像一定是视频流,而上一章我们使用的Harris角点检测算法在对视频的处理中,如果图像旋转和光强变化依然可以保留较高的检测率,但对目标大小(scale)和仿射变换(affine transformation)比较敏感,检测率较低。这样我们就改用Shi-Tomasi 角点检测算法,得到更好的效果。

  同时也可以使用更快的Corner Detector算法FAST角点检测,牺牲一定的精度,但速度更快:


二、主要API介绍

  1、corners = cv2.goodFeaturesToTrack(image, maxCorners, qualityLevel, minDistance[, corners[, mask[, blockSize[, useHarrisDetector[, k]]]]])

    API功能:该功能可以找到图像中或指定图像区域中最突出的角

    参数:
      src: 输入8位或浮点32位单通道图像。
      maxCorners:返回的最大角数。如果角落多于找到的角落,则返回最强的角落。maxCorners <= 0表示没有设置最大值限制,并且返回了所有检测到的角。
      qualityLevel:质量水平系数(小于1.0的正数,一般在0.01-0.1之间),该参数表征图像角的最低可接受质量。参数值乘以最佳角质量度量,即最小特征值。指标小于产品指标的边角将被拒收。例如,如果最佳角的质量度量为1500,而qualityLevel = 0.01,则拒绝质量度量小于15的所有角。(推荐值:0.01)
      minDistance:返回的角之间的最小可能欧几里得距离。(推荐值:10)
      mask:可选的感兴趣区域。如果图像不为空(它的类型必须为CV_8UC1且大小与image相同),则它指定检测到拐角的区域。
      blockSize: w w w窗口尺寸,用于计算每个像素邻域上的导数协方差矩阵的平均块的大小。
      useHarrisDetector: 是否使用Harris检测器(False表示使用)。
      k:Harris角点检测的 α α α 值。
    返回:
      corners:检测到的角的输出向量。

  如果使用参数qualityLevel的不同值A和B以及A> B调用函数,则返回带有qualityLevel = A的角的向量将是带有qualityLevel = B的输出向量的前缀。

  2、retval = cv2.FastFeatureDetector_create([, threshold[, nonmaxSuppression])

    API功能:初始化FAST对象,创建一个FAST角点检测器。 cv2.FastFeatureDetector类。

    参数:
      threshold:阈值 t t t(就是上面提到的那个阈值 t t t);默认值为10.
      nonmaxSuppression:是否开启非极大值抑制。默认为Ture。
    返回:
      retval :一个FAST角点检测器


  3、keypoints = cv2.FastFeatureDetector.detect(image)

    API功能:查找角点

    参数:
      image: 需要进行角点检测的图像。
    返回:
      keypoints :输出角点。列表的形式。


  4、outImage = cv2.drawKeypoints( image, keypoints, outImage[, color[, flags]])

    API功能:绘制关键点。

    参数:
      image: 源图像。
      keypoints:(列表)源图像中的关键点。
      color:关键点的颜色。RGB格式,如:(255, 0, 0)
    返回:
      outImage:输出图像。它的内容取决于标志值,该标志值定义了在输出图像中绘制的内容。


三、代码&效果图

import numpy as np
import cv2
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

# 读入图片+高斯滤波+灰度
image = cv2.imread('test_image/0000000086.png')
image2 = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
Blur = cv2.GaussianBlur(image2, ksize=(9, 9), sigmaX=1.0)
gray = cv2.cvtColor(Blur, cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)

# 使用Shi-Tomasi
keypoint_ST = cv2.goodFeaturesToTrack(gray, maxCorners=100, qualityLevel=0.01, minDistance=10, useHarrisDetector=False,
                                      k=0.04, blockSize=10)
keypoint_ST = np.int0(keypoint_ST)
# 逐个标出角点
img1 = np.copy(Blur)
for i in keypoint_ST:
    x, y = i.ravel()
    cv2.circle(img1, center=(x, y), radius=5, color=255, thickness=-1)

# 使用FAST
fast = cv2.FastFeatureDetector_create(nonmaxSuppression=True)
keypoint_FAST = fast.detect(Blur, None)
# 标出角点
img2 = np.copy(Blur)
cv2.drawKeypoints(img2, keypoint_FAST, img2, color=(255, 0, 0))

# 可视化
f, (ax1, ax2,) = plt.subplots(1, 2, figsize=(18, 9))
f.tight_layout()
ax1.imshow(img1)
ax1.set_title('Shi-Tomasi Method', fontsize=25)
ax2.imshow(img2)
ax2.set_title('FAST Method', fontsize=25)
plt.subplots_adjust(left=0., right=1, top=0.9, bottom=0.)
plt.show()

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
import cv2 as cv import numpy as np """"" cv2.cornerHarris() 可以用来进行角点检测。参数如下: • img - 数据类型为 float32 的输入图像。 • blockSize - 角点检测中要考虑的领域大小。 • ksize - Sobel 求导中使用的窗口大小 • k - Harris 角点检测方程中的自由参数,取值参数为 [0,04,0.06] """"" src_inital = cv.imread("E:/opencv/picture/building.jpg") src = cv.cvtColor(src_inital,cv.COLOR_BGR2GRAY) src = np.float32(src) dst = cv.cornerHarris(src,3,3,0.04) #R值是由det(M)-K(trace(M))*(trace(M)),当该点是角点时,该点所对应的R值就会很大,通过设置对R的阈值,就可以筛选得到角点 #这里的dst就是R值构成的灰度图像,灰度图像坐标会与原图像对应,R值就是角点分数,当R值很大的时候 就可以认为这个点是一个角点 print(dst.shape) src_inital[dst>0.08*dst.max()]=[0,0,255] """"" src_inital[dst>0.08*dst.max()]=[0,0,255] 这句话来分析一下 dst>0.08*dst.max()这么多返回是满足条件的dst索引值,根据索引值来设置这个点的颜色 这里是设定一个阈值 当大于这个阈值分数的都可以判定为角点 dst其实就是一个个角度分数R组成的,当λ1和λ2都很大,R 也很大,(λ1和λ2中的最小值都大于阈值)说明这个区域是角点。 那么这里为什么要大于0.08×dst.max()呢 注意了这里R是一个很大的值,我们选取里面最大的R,然后只要dst里面的值大于百分之八的R的最大值  那么此时这个dst的R值也是很大的 可以判定他为角点,也不一定要0.08可以根据图像自己选取不过如果太小的话 可能会多圈出几个不同的角点 """"" cv.imshow("inital_window",src_inital) cv.waitKey(0) cv.destroyAllWindows() 目标: 理解Harris角点检测的概念 使用函数cv2.cornerHarris(),cv2.cornerSubPix() 原理: Harris 角点检测的方法大概原理就是建立一个窗口区域,然后以当前窗口为中心向各个方向进行偏移。 如上图所示,第一个窗口向各个方向偏移的时候,像素值没有变化,因为窗口偏移的时候没有遇到任何边缘信息。 第二个图,窗口当中有一个直线(即block是在边缘上),如果当前窗口进行上下的移动,也没有像素值发生变化(在其他方向上灰度值也会变化)。 第三个图,窗口覆盖了一个“拐角”,如果窗口进行偏移,任何方向上都会有像素变化。 所以,第三张图片判断为检测到角点。 判断特征点是否为角点的依据:R只与M值有关,R为大数值正数时特征点为角点,R为大数值负数时为边缘,R为小数值时为平坦区 寻找R位于一定阈值之上的局部最大值,去除伪角点。 方向导数IxIx和IyIy可以使用cv2.Sobel()函数得到 Harris角点检测的结果是灰度图,图中的值为角点检测的打分值。需要选取合适的阈值对结果进行二值化来检测角点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fire丶Chicken

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值