import cv2
import numpy as np
# 1.cv2.cornerHarris(img, blocksize, kszie, k) # 找出图像中的角点
# 参数说明:
# img:是数据类型为float32的输入图像,表示输入的灰度图,
# blocksize:我们检测过程中需要一个窗口,这个就是窗口的大小,W(x,y)
# kszie:运用Sobel算子求解每个像素的梯度。有Ix和Iy方向的。
# k:是角点响应值运算中的α数值,一般推荐是[0.06, 0.06]
img = cv2.imread('images/build.jpeg')
img1 = img.copy()
gray_img = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray_img = np.float32(gray_img)
dst = cv2.cornerHarris(gray_img, blockSize=2, ksize=3, k=0.04)
img1[dst > 0.01 * dst.max()] = (0, 0, 255)
# goodFeaturesToTrack(image,
# maxCorners,
# qualityLevel,
# minDistance,
# corners,
# mask,
# blockSize,
# useHarrisDetector)
# image:输入灰度图像,float32类型
# maxCorners:返回角点的最大数目,值为0表表示没有设置最大值限制,返回所有检测到的角点。
# qualityLevel:质量系数(小于1.0的正数,一般在0.01-0.1之间),表示可接受角点的最低质量水平。该系数乘以最好的角点分数(也就是上面较小的那个特征值),作为可接受的最小分数;例如,如果最好的角点分数值为1500且质量系数为0.01,那么所有质量分数小于15的角都将被忽略。
# minDistance:角之间最小欧式距离,忽略小于此距离的点。
# corners:输出角点坐标
# mask:可选的感兴趣区域,指定想要检测角点的区域。
# blockSize:默认为3,角点检测的邻域大小(窗口尺寸)
# useHarrisDetector:用于指定角点检测的方法,如果是true则使用Harris角点检测,false则使用Shi Tomasi算法。默认为False。
# k:默认为0.04,Harris角点检测时使用。
img2 = cv2.imread('images/build.jpeg')
gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
corners = cv2.goodFeaturesToTrack(gray, maxCorners=100, qualityLevel=0.01, minDistance=10)
corners = np.int0(corners)
for i in corners:
x, y = i.ravel()
cv2.circle(img2, (x, y), 2, (0, 0, 255), -1)
ret = np.hstack((img, img1, img2))
cv2.imshow("Harris and Shi-Tomasi", ret)
cv2.waitKey(0) # 等待时间,单位是毫秒,0代表任意键终止
cv2.destroyAllWindows()