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
投稿

猜你喜欢

  • 讲解MaxDB数据库和MySQL的数据库的主要差别

    2012-02-25 20:04:34
  • Python实现图像的垂直投影示例

    2023-12-06 13:20:15
  • python文件目录操作之os模块

    2023-01-10 14:22:59
  • 多个域名后缀同时查询的域名查询系统代码

    2008-05-20 11:53:00
  • python tkinter库实现气泡屏保和锁屏

    2021-09-17 22:37:57
  • 如何使用Python实现自动化水军评论

    2022-08-25 21:15:48
  • Qt5 实现主窗口状态栏显示时间

    2022-05-29 23:54:45
  • mysql慢查询的分析方法

    2010-08-03 14:51:00
  • 支持鼠标拖拽的简单目录树代码

    2011-07-01 12:34:09
  • asp access数据库并生成XML文件范例

    2011-03-29 10:49:00
  • python爬虫-模拟微博登录功能

    2021-12-13 21:54:08
  • 用Python制作mini翻译器的实现示例

    2021-07-26 02:48:09
  • thinkphp6如何使用中间件记录行为日志

    2023-06-13 14:43:44
  • Python入门教程(三十六)Python的文件写入

    2023-04-30 11:27:48
  • django admin 自定义替换change页面模板的方法

    2022-01-15 11:19:30
  • pandas提升计算效率的一些方法汇总

    2023-12-01 00:08:04
  • PyTorch 迁移学习实践(几分钟即可训练好自己的模型)

    2021-09-07 23:37:31
  • 注册表单的改进分解

    2008-05-31 17:19:00
  • Python3如何对urllib和urllib2进行重构

    2022-05-18 08:48:52
  • python使用rabbitmq实现网络爬虫示例

    2022-04-20 20:11:58
  • asp之家 网络编程 m.aspxhome.com