本帖最后由 wuqiong 于 2018-7-25 11:00 编辑
内容来自OpenCV-Python Tutorials 自己翻译整理
目标: Shi-Tomasi 角点检测方法 函数cv2.goodFeatureToTrack()
原理: 在harris角点检测的方法中,对角点判断的打分公式为 R=λ1λ2−k(λ1+λ2)2R=λ1λ2−k(λ1+λ2)2 (λλ的含义见此http://blog.csdn.net/tengfei461807914/article/details/78009887)
但是在Shi-Tomasi 角点检测的打分函数为:
R=min(λ1,λ2)R=min(λ1,λ2) 如果打分超过阈值,就判断为一个角点。如图 上图当中, λ1λ1和λ2λ2都大于设定的阈值时,判断为角点。(绿色部分)
代码: cv2.goodFeaturesToTrack()此函数可以获得图像当中最好的N个角点。
参数 cv2.goodFeaturesToTrack(image, maxCorners, qualityLevel, minDistance[, corners[, mask[, blockSize[, useHarrisDetector[, k]]]]]) → corners
image 输入的灰度图像 maxCorners 要检测到的最大角点数量 qualityLevel 角点质量,值在0到1之间,低于此值的角点会被略掉。 minDistance 两个角点之间的最小距离,使用欧几里得距离 blocksize 可选,计算每个像素相邻矩阵导数时的平均块大小 mask 可选参数,表示角点的检测区域 k 可选,使用harris角点检测的自由参数 结果返回角点向量
将获得到的角点按照角点“质量”降序排列。将质量最高的角点排在第一位,然后过滤掉它周围minDistance之内的角点。以此类推 代码很简单 import numpy as np import cv2 from matplotlib import pyplot as plt
img = cv2.imread('2.jpg') gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
corners = cv2.goodFeaturesToTrack(gray,72,0.01,10)#棋盘上的所有点
corners = np.int0(corners)
for i in corners: x,y = i.ravel() cv2.circle(img,(x,y),10,255,-1)#在原图像上画出角点位置
cv2.imshow('p',img) cv2.waitKey(0)
#plt.imshow(img) #plt.show() 结果如下
此函数最目标追踪上非常有用!
|