这篇文章主要讲解了“OpenCV哈里斯角检测怎么应用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“OpenCV哈里斯角检测怎么应用”吧!
可以用如下图来表示:
因此,Harris Corner Detection的结果是具有这些分数的灰度图像。合适的阈值可提供图像的各个角落。
在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附带了一个函数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哈里斯角检测怎么应用”的内容了,经过本文的学习后,相信大家对OpenCV哈里斯角检测怎么应用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。