【OpenCV-Python】27.OpenCV的特征检测——角检测

27.OpenCV的特征检测——角检测


文章目录

  • 前言
  • 一、哈里斯角检测
  • 二、优化哈里斯角检测
  • 三、Shi-Tomasi角检测
  • 四、OpenCV-Python资源下载
  • 总结


前言

  图像的特征是指图像中具有独特性和易于识别性的区域,角、边缘等都属于有意义的特征。OpenCV可以检测并提取图像的特征,并对其进行描述,以便用于图像匹配和搜索。
  特征检测中的角是两条边的交点,也可称为角点、拐点,它是图像中各个方向上强度变化最大的区域。OpenCV中的cv2.cornerHarris()、cv2.cornerSubPix()、cv2.goodFeaturesToTrack()函数用于角检测。


一、哈里斯角检测

  哈里斯角检测是克里斯·哈里斯(Chris Harris)和迈克尔·斯蒂芬斯(Mike Stephens)在他们的论文中提出的一种角检测方法。
  cv2.cornerHarris()函数根据哈里斯角检测器算法检测图像中的角,其基本格式如下:

dst = cv2.cornerHarris(src, blockSize, ksize, k)

dst为返回的结果, 它是一个numpy.ndarray对象, 大小和src相同, 每一个数组元素对应一个像素点, 其值越大, 对应像素点是角的概率越高
src为8位单通道或浮点值图像
blockSize为领域大小, 值越大, 检测出的角占的区域就越大
ksize为哈里斯角检测器使用的Sobel算子的中孔参数
k为哈里斯角检测器的自由参数, ksize和k影响检测的敏感度, 值越小, 检测出的角越多, 但准确率越低
import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread("five.jpg")
cv2.imshow("Five",img)

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow("Five_gray",gray)

gray = np.float32(gray)
dst = cv2.cornerHarris(gray, 8, 7, 0.01)
img[dst>0.02*dst.max()] = [0,0,255]     # 将检测结果中值大于“最大值0.02”的对应像素设置为红色
cv2.imshow("dst",img)

cv2.waitKey(0)
cv2.destroyAllWindows()

【OpenCV-Python】27.OpenCV的特征检测——角检测_第1张图片


二、优化哈里斯角检测

  使用cv2.cornerHarris()函数检测出来的角称为哈里斯角,它包含了一定数量的像素。有时,可能需要对哈里斯角进行进一步处理,找出更精确的位置。
  cv2.cornerSubPix()函数用于优化哈里斯角,找出更精确的角的位置,其基本格式如下:

dst = cv2.cornerSubPix(src, corners, winSize, zeroZone, criteria)

dst为返回结果, 存储优化后的角的信息
src为8位单通道或浮点值图像
corners为哈里斯角的质心坐标
winSize为搜索窗口边长的一半
zeroZone为零值边长的一半
criteria为优化查找的终止条件
img = cv2.imread("cube.jpg")   							# 打开图像,默认BGR格式  
cv2.imshow("Cube", img)

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)   			# 转换为灰度图像
cv2.imshow("Cube_gray", gray)

gray = np.float32(gray)                      			# 转换为浮点类型
dst = cv2.cornerHarris(gray, 8, 7, 0.04)     			# 查找哈里斯角

r, dst = cv2.threshold(dst,0.01*dst.max(),255,0)  		# THRESH_BINARY=0,二值化阈值处理
cv2.imshow('THRESH_BINARY', dst)

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]          			# 将优化结果像素设置为绿色

cv2.imshow("Cube_SubPix", img)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

cv2.waitKey(0)
cv2.destroyAllWindows()

【OpenCV-Python】27.OpenCV的特征检测——角检测_第2张图片
  放大后立方体的一个角,可以看出绿色和红色角的位置:
【OpenCV-Python】27.OpenCV的特征检测——角检测_第3张图片


三、Shi-Tomasi角检测

  Shi-Tomasi角检测是史建波(Jianbo Shi)和卡罗·托马西(Carlo Tomasi)在哈里斯角检测的基础上提出的改进角检测方法。
  OpenCV的cv2.goodFeaturesToTrack()函数使用Shi-Tomasi角检测器查找图像中的N个最强角,其基本格式如下:

dst = cv2.goodFeaturesToTrack(src, maxCorners, qualityLevel, minDistance)

dst为返回的结果, 保存了检测到的角在原图中的坐标
src为8位单通道或浮点值图像
maxCorners为返回的角的最大数量
qualityLevel为可接受的角的最低质量
minDistance为返回的角之间的最小欧几里得距离
img = cv2.imread("five.jpg")
cv2.imshow("Five", img)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)     
gray = np.float32(gray) 

corners = cv2.goodFeaturesToTrack(gray, 6, 0.1, 100)
corners = np.int0(corners)

for i in corners:
    x, y = i.ravel()
    cv2.circle(img, (x,y), 4, (0,0,255), -1)

cv2.imshow("Shi-Tomasi",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

【OpenCV-Python】27.OpenCV的特征检测——角检测_第4张图片


四、OpenCV-Python资源下载

OpenCV-Python测试用图片、中文官方文档、opencv-4.5.4源码


总结

  以上内容介绍了OpenCV-Python特征检测中的角检测,有关Python、数据科学、人工智能等文章后续会不定期发布,请大家多多关注,一键三连哟(●’◡’●)。

你可能感兴趣的:(OpenCV-Python,opencv,python,计算机视觉)