OpenCV Python Shi-Tomasi 角点检测器
【目标】
- Shi-Tomasi 角点检测器
- cv2.goodFeaturesToTrack
【理论】
上一个章节中学习了Harris角点,J. Shi and C. Tomasi 做了一些修改,Good Features to Track显示了比Harris角点更好的效果。
Harris 角点检测器分数函数如下:
R = λ 1 λ 2 − k ( λ 1 + λ 2 ) 2 R=\lambda_1 \lambda_2 -k(\lambda_1+\lambda_2)^2 R=λ1λ2−k(λ1+λ2)2
而 Shi-Tomasi 用:
R = m i n ( λ 1 , λ 2 ) R=min(\lambda_1,\lambda_2) R=min(λ1,λ2)
如果 R R R大于一个阈值,就认为是角点。
如上图,绿色部分的取值就被认为是角点。
【代码】
Harris角点和Shi-Tomasi角点效果对比
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread("assets/blox.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# #############################################
# harris 角点检测
gray_harris = np.float32(gray)
# dst 为角点相应,并没有直接返回角点位置
dst = cv2.cornerHarris(gray_harris, 2, 3, 0.04)
# 角点响应,消除一些噪声,所以要做膨胀和腐蚀
dst = cv2.dilate(dst, None)
dst = cv2.erode(dst, None)
ret, dst = cv2.threshold(dst, 0.01 * dst.max(), 255, cv2.THRESH_BINARY)
dst = np.uint8(dst)
# 取连通区域
ret, labels, stats, centroids = cv2.connectedComponentsWithStats(dst)
# print(len(centroids))
# print(centroids)
img_harris = img.copy()
for xy in centroids:
x, y = int(xy[0]), int(xy[1])
cv2.circle(img_harris, (x, y), 3, (0, 255, 255), -1)
cv2.imshow("img_harris", img_harris)
###########################################
# shi-Tomasi 角点检测
# corners = cv2.goodFeaturesToTrack(gray, 25, 0.01, 10)
# 这里为了统一对比,也选择56个角点
corners = cv2.goodFeaturesToTrack(gray, 56, 0.01, 10)
corners = np.int0(corners)
img_goodfeatures = img.copy()
for i in corners:
x, y = i.ravel()
cv2.circle(img_goodfeatures, (x, y), 3, (0, 0, 255), -1)
cv2.imshow("img_goodfeatures", img_goodfeatures)
cv2.waitKey(0)
cv2.destroyAllWindows()
【接口】
- goodFeaturesToTrack
cv.goodFeaturesToTrack( image, maxCorners, qualityLevel, minDistance[, corners[, mask[, blockSize[, useHarrisDetector[, k]]]]] ) -> corners
cv.goodFeaturesToTrack( image, maxCorners, qualityLevel, minDistance, mask, blockSize, gradientSize[, corners[, useHarrisDetector[, k]]] ) -> corners
cv.goodFeaturesToTrackWithQuality( image, maxCorners, qualityLevel, minDistance, mask[, corners[, cornersQuality[, blockSize[, gradientSize[, useHarrisDetector[, k]]]]]] ) -> corners, cornersQuality
寻找图像中强的角点
- image: 输入的单通道8位或浮点图像
- corners: 输出的角点列表
- maxCorners: 返回的最多的角点数量,如果检测数量较多,返回最强的那个数量即可。如果要返回所有的,设置为
0
即可,测试发现设置负数运行报错。- qualityLevel: 最小可接受角点等级。该参数会与最好的角点响应值相乘,比如说最好的响应为1500,如果设置为0.01,则小于15的角点都不会接受。
- minDistance: 返回的角点之间的最小欧式距离。
- mask: 感兴趣区域
- cornersQuality: 输出角点的质量
- blockSize: 计算梯度和特征值的小窗口
- gradientSize: sobel 梯度窗口直径
- useHarrisDetector: 是否使用 harris 的检测算子
- k: Harris角点检测器的参数
【参考】
- OpenCV 官方文档
- Jianbo Shi and Carlo Tomasi. Good features to track. In Computer Vision and Pattern Recognition, 1994. Proceedings CVPR’94., 1994 IEEE Computer Society Conference on , pages 593–600. IEEE, 1994.