前言
角点通常被定义为两条边的交点,或者说,角点的局部邻域应该具有两个不同区域的不同方向的边界。角点检测(Corner Detection)是计算机视觉系统中获取图像特征的一种方法,广泛应用于运动检测、图像匹配、视频跟踪、三维重建和目标识别等,也可称为特征点检测。
角点检测算法的基本思想:
使用一个固定窗口在图像上进行任意方向上的滑动,比较滑动前与滑动后两种情况,窗口中的像素灰度变化程度,如果存在任意方向上的滑动,都有着较大灰度变化,那么我们可以认为该窗口中存在角点。
目前,角点检测算法还不是十分完善,许多算法需要依赖大量的训练集和冗余数据来防止和减少错误的特征的出现。对于角点检测算法的重要评价标准是:其对多幅图像中相同或者相似特征的检测能力,并且能够应对光照变化、或者图像旋转等影响。
关于角点的具体描述可以有几种:
- 一阶导数(即灰度的梯度)的局部最大所对应的像素点;
- 两条及两条以上边缘的交点;
- 图像中梯度值和梯度方向的变化速率都很高的点;
- 角点处的一阶导数最大,二阶导数为零,指示物体边缘变化不连续的方向
上一篇博客介绍了Harris角点检测器,这篇博客将介绍另一个角点检测器:Shi-Tomasi角点检测器。
Shi-Tomasi角点检测器是Harris角点检测器的优化,效果更好;
cv2.goodFeaturesToTrack(),通过Shi-Tomasi方法(或者Harris角点检测)在图像中找到N个最强的角点。并且在跟踪对象方面性能很好。
1. 效果图
原图 VS Harris角点检测器效果如下:
原图 VS Shi-Tomasi角点检测效果图如下:
可以看出Shi-Tomasi确实效果要好一些,所有角点均被成功检测;
2. 源码
# Shi-Tomasi角点检测是Harris角点检测的优化,更准确,会检测出N个最强角点;
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('images/polygon.jpg')
plt.subplot(1, 2, 1)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.xticks([])
plt.yticks([])
plt.title("origin")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
corners = cv2.goodFeaturesToTrack(gray, 25, 0.01, 10)
corners = np.int0(corners)
for i in corners:
x, y = i.ravel()
cv2.circle(img, (x, y), 3, 255, -1)
plt.subplot(1,2,2)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.xticks([])
plt.yticks([])
plt.title("Shi-Tomasi res")
plt.show()
参考 https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_feature2d/py_shi_tomasi/py_shi_tomasi.html#shi-tomasi
总结
到此这篇关于OpenCV特征提取与检测之Shi-Tomasi角点检测器的文章就介绍到这了,更多相关OpenCV Shi-Tomasi角点检测器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:- OpenCV特征提取与检测之Harris角点检测
- python opencv角点检测连线功能的实现代码
- OpenCV哈里斯(Harris)角点检测的实现
- OpenCV半小时掌握基本操作之角点检测