角点
角点
角点所具有的特征:
轮廓之间的交点
对于同一场景,即使视角发生变化,通常具备稳定性质的特征
该点附近区域的像素点无论在梯度方向上还是其梯度幅值上有着较大变化
复制代码
角点检测基本原理
使用一个固定窗口在图像上进行任意方向上的滑动,比较滑动前与滑动后两种情况,窗口中的像素灰度
变化程度,如果存在任意方向上的滑动,都有着较大灰度变化,那么我们可以认为该窗口中存在角点.
复制代码
OpenCV 中的 Harris 角点检测
cv2.cornerHarris(src, blockSize, ksize, k, dst, borderType)
复制代码
src:数据类型为float32的输入图像
blockSize:角点检测中要考虑的领域大小
ksize:Sobel求导中使用的窗口大小
k:Harris 角点检测方程中的自由参数,取值参数为 [0,04,0.06].
dst:目标图像
borderType:边界类型
复制代码
测试代码:
def plot(img, n):
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
gray = np.float32(gray)
# 输入图像必须是 float32,最后一个参数在 0.04 到 0.05 之间
dst = cv.cornerHarris(gray, 2, 3, 0.04)
dst = cv.dilate(dst, None)
img[dst > 0.005*dst.max()] = [255, 0, 0]
plt.subplot(1, 3, n), plt.imshow(img, cmap='gray'),
plt.title('dst'), plt.axis('off')
复制代码
效果如图,即将图片的角点检测出来:
Shi-Tomasi 角点检测goodFeaturesToTrack()
goodFeaturesToTrack()是cornerHarris() 函数升级版
该函数的角点检测效果与cornerHarris()函数效果差不多。
cv2.goodFeaturesToTrack ( image, maxcorners, qualityLevel, minDistance, [, corners [, mask [, blocksize [, useHarrisDetector [, k ]]]]] )
第一个参数:通常情况下,其输入的应是灰度图像;
第二个参数N:是想要输出的图像中N个最好的角点;
第三个参数:设置角点的质量水平,在0~1之间;代表了角点的最低的质量,
小于这个质量的角点,则被剔除;
最后一个参数:设置两个角点间的最短欧式距离;也就是两个角点的像素差
的平方和;
复制代码
测试代码:
(所用参数均为最通用的)
def plot01(img):#角点检测
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
corners = cv.goodFeaturesToTrack(gray, 25, 0.01, 10)
corners = np.int0(corners)
for i in corners:
x, y = i.ravel()
cv.circle(img, (x, y), 3, 255, -1)
cv.imshow("img", img)
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END