⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟
🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号:不懂开发的程序猿
个人网站:https://jerry-jy.co/❗❗❗知识付费,🈲止白嫖,有需要请后台私信或【文末】个人微信公众号联系我
基于OpenCv的图像Harris角点检测
- 基于OpenCv的图像Harris角点检测
- 任务需求
- 任务目标
- 1、掌握Harris角点检测的简单步骤
- 2、掌握基于OpenCv进行Harris角点检测
- 3、掌握基于亚像素角点检测
- 任务环境
- 1、jupyter开发环境
- 2、OpenCv
- 3、python3.6
- 任务实施过程
- 一、Harris角点检测
- 1.导入所需要的工具包和图像
- 2.Harris角点检测
- 二、亚像素角点检测
- 三、任务小结
- 说明
基于OpenCv的图像Harris角点检测
任务需求
角点检测(corner detection)是计算机视觉系统中获得图像特征的一种方法,由于角点检测的实时性和稳定性,所以角点检测广泛应用于运动检测、图像匹配、视频跟踪、三维建模和目标识别等领域。角点作为一种特征点,角点检测也被称为特征点检测。
任务目标
1、掌握Harris角点检测的简单步骤
2、掌握基于OpenCv进行Harris角点检测
3、掌握基于亚像素角点检测
任务环境
1、jupyter开发环境
2、OpenCv
3、python3.6
任务实施过程
一、Harris角点检测
Harris角点检测算法是Harris和Stephens于1988年在Moravec算法的基础上提出基于信号的点特征提取方法,其基本思想为:使用一个固定窗口在图像上进行任意方向上的滑动,比较窗口中的像素灰度在窗口滑动前与滑动后的变化程度,如果在任意方向上的滑动都有着较大灰度值的变化,那么我们可以认为该窗口中存在角点。
Harris角点检测的一般步骤是根据图像窗口平移产生灰度变化得到角点响应函数R,对角点响应函数R进行阈值处理和非最大化抑制,得到选择局部区域算子最大的点作为最终的特征点。
1.导入所需要的工具包和图像
import cv2 # 导入opencv
import matplotlib.pyplot as plt # 导入绘图模块
import numpy as np # 导入numpy库
from utils import im_show # 导入显示图像函数
# 绘制图像直接展示,不用调用plt.show()
%matplotlib inline
# 用来正常显示中文标签
plt.rc('font',family="SimHei")
# 读取图像
img = cv2.imread(r'./experiment/data/qp.png')
# 将图像转换成灰度图像
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 设置画布大小
plt.figure(figsize=(6,6))
# 显示图像
im_show('原图像',gray)
2.Harris角点检测
OpenCV提供函数cv2.cornerHarris()进行Harris角点检测
cv2.cornerHarris(InputArray src,OutputArray dst, int blockSize, int ksize, double k, intborderType=BORDER_DEFAULT )
- src:源图像且需为单通道8位或者浮点型图像
- dst:存放Harris角点检测的输出结果,和源图片有一样的尺寸和类型
- blockSize:邻域大小(角点检测中指定区域的大小为 b l o c k S i z e ∗ b l o c k S i z e blockSize*blockSize blockSize∗blockSize)
- ksize:Sobel()算子的模板大小
- k:角点响应函数R中的k参数,常取0.04~0.06
- borderType:图像像素的边界模式,默认值为BORDER_DEFAULT
# 1.将灰度图数据转换为浮点数
gray = np.float32(gray)
# 2.使用cornerHarris()进行Harris角点检测
# 放入灰度图,设置窗口大小为2*2,
# sobel算子大小为3*3,k在0.04到0.06之间,取0.05
dst = cv2.cornerHarris(gray,2,3,0.05)
# 3.设置阈值,将角点绘制出来,阈值根据图像进行选择
# 在原图像中设置dst中大于0.01倍的dst的最大值的像素点为红色
img[dst>0.01*dst.max()]=[0,0,255]
# 设置画布大小
plt.figure(figsize=(6,6))
# 显示角点检测后的图像
im_show('Harris角点检测(红色角点)',img)
二、亚像素角点检测
如果想要找到最精确的角点。可以使用OpenCV函数cv2.cornerSubPix()用来对检测到的角点作进一步的优化计算,可使角点的精度达到亚像素级别。
对于下面的例子来说进行亚像素角点检测需要如下三步:
- 1.首先找到harris角点,然后找到这些点的质心。
- 2.harris角点用红色像素标记,精制角用绿色像素标记。
- 3.定义搜索角点领域的大小和达到一定精度后停止迭代。
cv2.cornerSubPix(InputArray _image, InputOutputArray _corners,Size win, Size zeroZone, TermCriteria criteria)
- image:输入图像
- corners:提取的初始整数角点(Harris角点)
- win:求取亚像素角点的窗口大小,这里设置的是半径长度。
- zeroZone:设置的“零区域”,在搜索窗口内,设置的“零区域”内的值不会被累加,权重值为0。
- criteria:条件阈值,包括迭代次数阈值和误差精度阈值,一旦其中一项条件满足设置的阈值,则停止迭代,获得亚像素角点。
# 读取图像
img = cv2.imread(r'./experiment/data/blox.jpg')
# 将图像转换成灰度图
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 将灰度图数据转换为浮点数
gray = np.float32(gray)
# 1.获取Harris角点
dst = cv2.cornerHarris(gray,2,3,0.04)
# 使用阈值函数,设置阈值为0.01*dst.max(),图像灰度值大于0.01*dst.max()的设为255,小于的设为0
ret, dst = cv2.threshold(dst,0.01*dst.max(),255,cv2.THRESH_BINARY)
# 将dst转换成uint8
dst = np.uint8(dst)
# dst得到的就是Harris角点
# 2.寻找这些角点的质心
# connectedComponentsWithStats()函数进行连通域提取
# 放入二值图
ret, labels, stats, centroids = cv2.connectedComponentsWithStats(dst)
# 得到四个返回值,取最后一个返回值centroids表示连通域的中心点也就是质心
# 3.定义停止条件以及精细化角点的标准
# cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER表示迭代次数或者精确度满足时停止迭代
# 迭代次数10,精度0.001
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.001)
# 使用cornerSubPix()函数得到亚像素角点,放入灰度图,得到的质心(转换成浮点型)
# 设置窗口大小为11*11,zeroZone表示没有“零区域”,放入条件阈值
corners = cv2.cornerSubPix(gray,np.float32(centroids),(5,5),(-1,-1),criteria)# 对于得到的质心和角点绘制角点水平拼接
res = np.hstack((centroids,corners))
# 将结果转换称为int整型
res = np.int0(res)
img1 = img.copy()
# 设置Harris角点质心为红色,亚像素角点为绿色
img1[res[:,1],res[:,0]]=[0,0,255]
img1[res[:,3],res[:,2]] = [0,255,0]
# 设置画布大小
plt.figure(figsize=(12,12))
im_show('Harris角点质心(红色)和亚像素角点(绿色)',img1)
上图得到的就是Harris角点质心和亚像素角点,亚像素角点检测可以获取更为精确的角点位置坐标
三、任务小结
本次实验主要完成基于Harris角点检测和亚像素角点检测。注意进行Harris角点检测源图像且需为单通道8位或者浮点型图像。
进行亚像素角点检测前需要先获取到Harris角点检测的角点,并找到这些角点的质心,并且设置条件阈值。
通过本次实验需要掌握以下内容:
- 1.掌握基于OpenCv进行Harris角点检测
- 2.掌握基于亚像素角点检测,可以获取更为精确的角点位置坐标
–end–
说明
本实验(项目)/论文若有需要,请后台私信或【文末】个人微信公众号联系我