OpenCV哈里斯角检测怎么应用
这篇文章主要讲解了“OpenCV哈里斯角检测怎么应用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“OpenCV哈里斯角检测怎么应用”吧!
理论
可以用如下图来表示:
因此,Harris Corner Detection的结果是具有这些分数的灰度图像。合适的阈值可提供图像的各个角落。
OpenCV中的哈里斯角检测
在OpenCV中有实现哈里斯角点检测,cv2.cornerHarris()
。其参数为:
dst = cv2.cornerHarris(class="lazy" data-src, blockSize, ksize, k[, dst[, borderType]] )
class="lazy" data-src
- 输入图像,灰度和float32类型blockSize
- 是拐角检测考虑的邻域大小ksize
- 使用的Sobel导数的光圈参数k
- 等式中的哈里斯检测器自由参数
import cv2import numpy as npfrom matplotlib import pyplot as pltimg = 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 importantdst = 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]# plotplt.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 cv2import numpy as npimg = cv2.imread('chessboard2.png')gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# find Harris cornersdst = 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 centroidsret, labels, stats, centroids = cv2.connectedComponentsWithStats(dst)# define the criteria to stop and refine the cornerscriteria = (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 themres = 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哈里斯角检测怎么应用”的内容了,经过本文的学习后,相信大家对OpenCV哈里斯角检测怎么应用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341