使用cv2.cornerHarris()函数检测出的角称为哈里斯角,它包含了一定数量的像素。有时,可能需要对哈里斯角进行进一步处理,找出角的更精确位置。
cv2.cornerSubPix()函数用于对哈里斯角进行优化,找出更准确的角的位置,其基本格式如下。
dst=cv2.cornerSubPix(src,corners, winSize, zeroZone, criteria)
参数说明如下。
dst为返回结果,存储优化后的角信息。
src为8位单通道或浮点值图像。
corners为哈里斯角的质心坐标。
winSize为搜索窗口边长的一半。
zeroZone为零值边长的一半。
criteria为优化查找的终止条件。
示例代码如下。
优化哈里斯角
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('cube.jpg') #打开图像,默认为BGR格式
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #转换为灰度图像
gray = np.float32(gray) #转换为浮点类型
dst = cv2.cornerHarris(gray,8,7,0.04) #查找哈里斯角
r, dst = cv2.threshold(dst,0.01*dst.max(),255,0) #二值化阈值处理
dst = np.uint8(dst) #转换为整型
r,l,s,cxys = cv2.connectedComponentsWithStats(dst) #查找质点坐标
cif = (cv2.TERM_CRITERIA_EPS +
cv2.TERM_CRITERIA_MAX_ITER, 100, 0.001) #定义优化查找条件
corners = cv2.cornerSubPix(gray,
np.float32(cxys),(5,5),(-1,-1),cif) #执行优化查找
res = np.hstack((cxys,corners)) #堆叠构造新数组,便于标注角
res = np.int0(res) #转换为整型
img[res[:,1],res[:,0]]=[0,0,255] #将哈里斯角对应像素设置为红色
img[res[:,3],res[:,2]] = [0,255,0] #将优化结果像素设置为绿色
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) #转换为RGB格式
plt.imshow(img)
plt.axis('off')
plt.show() #显示检测结果