角点检测之Shi-Tomasi方法(python下opencv)
1、他主要替代了哈瑞斯的计算方法,把兰姆达计算公式,改成比大小。
在opencv里使用goodFeaturesToTrack()进行角点计算。
最后在补充一个号称亚像素级焦点函数cornerSubPix。
还是用米框图为例
2、第一步 还是引入图
转成灰度
import cv2 as cvimport numpy as npimport copyimport osfrom matplotlib import pyplot as pltfrom skimage.measure import compare_ssimimport random
image = cv.imread('c:\\color_MiLine.png')gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)生成灰度图像
3、使用goodFeaturesToTrack计算角点
corners = cv.goodFeaturesToTrack(gray,5,0.1,10)
参数5 表示选5个最好的角点
0.1 代表角点的质量水平,在0~1之间
10 代表两个角点间的最短欧式距离
corners0 = np.int0(corners)
for corner in corners0:
row, col = corner.ravel()
# cv.circle(image,(x,y),3,255,-1)
cv.circle(image, (row, col), 5, (255,255,0), 1)
浅蓝色的就是计算的角点
cv.imshow("image", image)
cv.waitKey(0)
4、同时再计算一个plt模式输出图像
plt.imshow(image)
plt.show()
可以看出二者角点一致。
5、opencv还提供了一个号称亚像素级焦点函数
cornerSubPix
下图为官网的图示。
# 参数1是输入图像# 参数2 角点 。# 参数3亚像素角点区域NXN; N=(winSize*2+1)。# 参数4通常(-1, -1)# 参数5停止迭代条件。
6、criteria = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 20, 0.001)
cornerSubPix = cv.cornerSubPix(gray,corners,(5,5),(-1,-1),criteria)
cornerSubPixs = np.int0(cornerSubPix)
for corner in cornerSubPixs:
row, col = corner.ravel()
# cv.circle(image,(x,y),3,255,-1)
cv.circle(image, (row, col), 5, (255,255,0), 1)
plt.imshow(image)
plt.show()
cv.imshow("cornerSubPix", image)
cv.waitKey(0)
每个角点基本被选中2次。