在OpenCV里Harris角检测2

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/caimouse/article/details/102641430

Opencv中的Harris角点检测

Opencv中有一个函数cv2.cornerHarris()用来实现这个算法,

参数是:

src- 输入图片,需要灰度图且类型float32

blockSize - 是角点检测考虑的邻域大小

ksize - Sobel所用参数

k - Harris检测器中的自由参数

dst返回值:输入图像中的角点在输出图像中由局部最大值表示。

如下面的例子:

#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import numpy as np
import cv2
from matplotlib import pyplot as plt

filename = 'corner1.png'
img = cv2.imread(filename)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #转换为灰度图

gray = np.float32(gray)
dst = cv2.cornerHarris(gray,6,5,0.04) #找角点

#膨胀一下表示角点。
dst = cv2.dilate(dst,None)

#根据不同图片,可以选择不同的最大值0.01*dst.max(),这里采用1%
img[dst>0.01*dst.max()]=[0,0,255]

cv2.imshow('dst',img)
           
cv2.waitKey(0)
cv2.destroyAllWindows()

结果输出如下:

 

在上面实现找到角了,但是角所有像素点可能偏差有点大,想要更进一步改善这个位置,可以在前面的结果之上,使用函数cv2.connectedComponentsWithStats来找到角块的质心,然后再通过cv2.cornerSubPix函数来找到最好的角点位置,要使用这个函数要先定义迭代的退出的条件,这里使用(cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.001)。最后可以看到Harris角点用红色标记,改进后的角点用绿色标记,例子如下:

#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import numpy as np
import cv2
from matplotlib import pyplot as plt

filename = 'corner1.png'
img = cv2.imread(filename)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #转换为灰度图

gray = np.float32(gray)
dst = cv2.cornerHarris(gray,6,5,0.04) #找角点

#膨胀一下表示角点。
dst = cv2.dilate(dst,None)

#根据不同图片,可以选择不同的最大值0.01*dst.max(),这里采用1%
ret, dst = cv2.threshold(dst,0.01*dst.max(),255,0)
dst = np.uint8(dst)

#寻找质心
ret, labels, stats, centroids = cv2.connectedComponentsWithStats(dst)

#定义寻找角点的条件和寻找
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.001)
corners = cv2.cornerSubPix(gray,np.float32(centroids),(5,5),(-1,-1),criteria)

#显示
res = np.hstack((centroids,corners))
res = np.int0(res)
img[res[:,1],res[:,0]]=[0,0,255]
img[res[:,3],res[:,2]] = [0,255,0]

cv2.imshow('dst',img)
           
cv2.waitKey(0)
cv2.destroyAllWindows()

结果输出如下:

把输出的图片进行放大,才能看清楚角点的位置。

https://blog.csdn.net/caimouse/article/details/51749579

猜你喜欢

转载自blog.csdn.net/caimouse/article/details/102641430