OpenCV哈里斯角检测|Harris Corner理论实践
目录
- 目标
- 理论
- OpenCV中的哈里斯角检测
- SubPixel精度的转角
目标
在本章中,将学习
- "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更精确一点:
附加资源
以上就是OpenCV哈里斯角检测|Harris Corner理论实践的详细内容,更多关于OpenCV哈里斯角检测的资料请关注我们其它相关文章!
赞 (0)