OpenCV哈里斯角检测|Harris Corner理论实践

作者:uncle_ll 时间:2021-03-22 02:06:10 

目标

在本章中,将学习

  • "Harris Corner Detection”背后的思想

  • 函数:cv2.cornerHarris(),cv.2cornerSubPix()

理论

OpenCV哈里斯角检测|Harris Corner理论实践

OpenCV哈里斯角检测|Harris Corner理论实践

可以用如下图来表示:

OpenCV哈里斯角检测|Harris Corner理论实践

因此,Harris Corner Detection的结果是具有这些分数的灰度图像。合适的阈值可提供图像的各个角落。

OpenCV中的哈里斯角检测

在OpenCV中有实现哈里斯角点检测,cv2.cornerHarris()。其参数为:

dst = cv2.cornerHarris(src, blockSize, ksize, k[, dst[, borderType]] )

  • src - 输入图像,灰度和float32类型

  • blockSize - 是拐角检测考虑的邻域大小

  • ksize - 使用的Sobel导数的光圈参数

  • k- 等式中的哈里斯检测器自由参数

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('chessboard.png')
img_copy = img.copy()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
dst = cv2.cornerHarris(gray, 2, 3, 0.04)
# result is dilated for marking the corners, not important
dst = cv2.dilate(dst, None)
# Threshold for an optimal value, it may vary depending on the image.
img[dst >0.01*dst.max()]=[255,0,0]
# plot
plt.subplot(121)
plt.imshow(img_copy, cmap='gray')
plt.xticks([])
plt.yticks([])
plt.subplot(122)
plt.imshow(img, cmap='gray')
plt.xticks([])
plt.yticks([])
plt.show()

以下是结果:

OpenCV哈里斯角检测|Harris Corner理论实践

可以看到,各个角点已经标红。

SubPixel精度的转角

有时候可能需要找到最精确的角点。OpenCV附带了一个函数cv2.cornerSubPix(),它进一步细化了以亚像素精度检测到的角点。下面是一个例子。

  • 和之前一样,首先需要先找到哈里斯角点

  • 然后通过这些角的质心(可能在一个角上有一堆像素,取它们的质心)来细化它们

  • Harris角用红色像素标记,SubPixel角用绿色像素标记

对于cv2.cornerSubPix()函数,必须定义停止迭代的条件。我们可以在特定的迭代次数或达到一定的精度后停止它。此外,还需要定义它将搜索角点的邻居的大小。

corners = cv.cornerSubPix( image, corners, winSize, zeroZone, criteria )

  • image: 输入图像,单通道

  • corners: 输入的初始坐标和为输出提供的精制坐标

  • winSize: 搜索窗口的一半侧面长度

  • zeroZone: 搜索区域中间的死区大小的一半在下面的公式中的求和,有时用于避免自相关矩阵的可能奇点。(−1,−1)(-1,-1)(−1,−1) 的值表示没有这样的尺寸

  • criteria: 终止角点细化过程的条件

# sub pixel更精度角点
import cv2
import numpy as np
img = cv2.imread('chessboard2.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# find Harris corners
dst = cv2.cornerHarris(gray,2, 3, 0.04)
dst = cv2.dilate(dst, None)
ret, dst = cv2.threshold(dst, 0.01*dst.max(), 255,0)
dst = np.uint8(dst)
# find centroids
ret, labels, stats, centroids = cv2.connectedComponentsWithStats(dst)
# define the criteria to stop and refine the corners
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.001)
corners = cv2.cornerSubPix(gray, np.float32(centroids), (5, 5), (-1, -1), criteria)
# Now draw them
res = np.hstack((centroids,corners))
res = np.int0(res)
img[res[:,1],res[:,0]]=[0,0,255]
img[res[:,3],res[:,2]] = [0,255,0]
cv2.imshow('subpixel', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

以下是结果, 可以看到SubPixel更精确一点:

OpenCV哈里斯角检测|Harris Corner理论实践

附加资源

docs.opencv.org/4.1.2/dd/d1…

docs.opencv.org/4.1.2/dd/d1…

docs.opencv.org/4.1.2/dd/d1…

docs.opencv.org/4.1.2/d4/d8…

docs.opencv.org/4.1.2/dd/d1…

来源:https://juejin.cn/post/7221159922905202725

标签:OpenCV,哈里斯角,检测,Harris,Corner
0
投稿

猜你喜欢

  • IE6中隐形的PNG8图片

    2009-11-27 18:38:00
  • php函数之子字符串替换 str_replace

    2023-11-23 17:32:29
  • 最新屏蔽百度快照的方法

    2009-07-06 14:37:00
  • 使用Python的Flask框架表单插件Flask-WTF实现Web登录验证

    2021-03-31 12:42:31
  • 解析ASP与SQL server互操作的时间处理

    2008-05-17 11:57:00
  • Python使用GitPython操作Git版本库的方法

    2021-04-28 07:22:16
  • 低版本中Python除法运算小技巧

    2021-11-14 00:54:00
  • python中的内置函数getattr()介绍及示例

    2023-01-15 19:16:46
  • Python中的__new__与__init__魔术方法理解笔记

    2021-12-18 14:29:26
  • 将mysql转换到oracle必须了解的50件事

    2010-07-05 12:15:00
  • asp无限级分类加js收缩伸展功能代码

    2009-12-08 12:25:00
  • GoLang并发编程中条件变量sync.Cond的使用

    2024-04-25 15:28:40
  • Microsoft Office Access 2007使用技巧

    2008-05-23 13:23:00
  • anaconda3安装及jupyter环境配置全教程

    2021-03-26 07:45:07
  • Python第三方包PrettyTable安装及用法解析

    2023-02-22 03:19:16
  • JS 替换和时间插件的结合使用方法

    2013-08-19 16:50:31
  • 网站导航设计的6大分类

    2010-07-12 18:46:00
  • Django Sitemap 站点地图的实现方法

    2023-05-27 07:40:17
  • Python分析特征数据类别与预处理方法速学

    2023-04-29 09:55:52
  • 利用Python生成文件md5校验值函数的方法

    2023-09-29 14:51:40
  • asp之家 网络编程 m.aspxhome.com