OpenCV哈里斯角检测|Harris Corner理论实践
作者:uncle_ll 发布时间:2021-03-22 02:06:10
目标
在本章中,将学习
"Harris Corner Detection”背后的思想
函数:
cv2.cornerHarris()
,cv.2cornerSubPix()
理论
可以用如下图来表示:
因此,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()
以下是结果:
可以看到,各个角点已经标红。
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更精确一点:
附加资源
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


猜你喜欢
- 如何用Access加密页面?很简单哦,看看这个用用Access和ASP做的加密程序: <%userid =&nbs
- 1、前言接上节,我们初步体验了layui-vue的用法。相比其他ui框架,layui-vue的数据结构显得不是非常友好,但是经过数据拼凑也是
- 并行查询其优势就是可以通过多个线程来处理查询作业,从而提高查询的效率。SQL Server数据库为具有多个CPU的数据库服务器提供并行查询的
- 数据库服务器主要用于存储、查询、检索企业内部的信息,因此需要搭配专用的数据库系统,对服务器的兼容性、可靠性和稳定性等方面都有很高的要求。下面
- 首先,我们来看一个Python抓取网页的库:urllib或urllib2。那么urllib与urllib2有什么区别呢?可以把urllib2
- 一、实现#tmp表内容如下:实现group_concat的sql语句为:SelectRegionID,STUFF((SELECT '
- 下面的查询选择所有 date_col 值在最后 30 天内的记录。 mysql> SELECT something FROM tbl_
- 一、读者指引读者指引帮助你掌握本文的梗概。以免你看了大半才明白这编文章不适合你,给你造成视觉污染。如果你正在用ASP+XML写一些程序,或者
- 在网上的一些资料的基础上自己又添了些新内容,算是Python socket编程练手吧。#coding=utf-8import socketi
- 我就废话不多说了,大家还是直接看代码吧!stdi, stdo, stde = sys.stdin, sys.stdout, sys.stde
- groupcache 简介在软件系统中使用缓存,可以降低系统响应时间,提高用户体验,降低某些系统模块的压力.groupcache是一款开源的
- 区域生长是一种串行区域分割的图像分割方法。区域生长是指从某个像素出发,按照一定的准则,逐步加入邻近像素,当满足一定的条件时,区域生长终止。区
- 参考 https://books.agiliq.com/projects/django-admin-cookbook/en/lat
- 获得当前机器的名字:def hostname(): sy
- 很久没有发表文章了,最近一直在研究产品设计标准的问题,之前有发过一篇关于 Axure的教程 ,相信很多人已经学会如何使用,这次我给大家介绍一
- 这篇文章主要介绍了python 哈希表实现简单python字典代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学
- 参考的一些文章以及论文我都会给大家分享出来 —— 链接就贴在原文,论文我上传到资源中去,大家可以免费下载学习,如果当天资源区找不到论文,那就
- 切片与数组数组数组是具有相同 唯一类型 的一组以编号且长度固定的数据项序列数组声明var identifier [len]type切片切片(
- 本文实例为大家分享了vue简单实现购物车结算的具体代码,供大家参考,具体内容如下样式没有写<template> <
- 我就废话不多说了,直接上代码吧!import cv2import timecap = cv2.VideoCapture(0)cap.set(