pycharm+windows7
opencv3 python3
他主要替代了哈瑞斯的计算方法,把兰姆达计算公式,改成比大小。在opencv里使用goodFeaturesToTrack()进行角点计算。最后在补充一个号称亚像素级焦点函数cornerSubPix。还是用米框图为例
第一步 还是引入图转成灰度import cv2 as cvimport numpy as npimport copyimport osfrom matplotlib import pyplot as pltfrom skimage.measure import compare_ssimimport randomimage = cv.imread('c:\\color_MiLine.png')gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)生成灰度图像
使用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)
同时再计算一个plt模式输出图像plt.imshow(image)plt.show()可以看出二者角点一致。
opencv还提供了一个号称亚像素级焦点函数cornerSubPix下图为官网的图示。# 参数1是输入图像# 参数2 角点 。# 参数3亚像素角点区域NXN; N=(winSize*2+1)。# 参数4通常(-1, -1)# 参数5停止迭代条件。
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次。
goodFeaturesToTrack()用于计算shi-tomas角点 注意参数选择
cornerSubPix用于sub角点选择,更精细一些