目录
一 涉及的函数
二 实践
在使用OpenCV之前,需要先安装相关的库和依赖项,命令如下所示:
# 安装OpenCV的基础版
pip install opencv-python
# 安装OpenCV的扩展版
pip install opencv-contrib-python
OpenCV 提供了cv2.goodFeaturesToTrack()函数,来获取图像中前 N 个最好的角点。
cv2.goodFeaturesToTrack()函数的原型如下所示:
corners=cv.goodFeaturesToTrack(image, maxCorners, qualityLevel, minDistance[, corners[, mask[, blockSize[, useHarrisDetector[, k]]]]])
输入:
①image:输入灰度图像,float32类型。
②maxCorners:返回角点的最大数目。
注意:值为0表示没有设置最大值限制,返回所有检测到的角点。
③qualityLevel:表示可接受角点的最低质量水平。
④minDistance:角点之间最小欧式距离,忽略小于这个距离的角点。
⑤mask:可选的感兴趣区域,指定想要检测角点的区域。
⑥blockSize:角点检测的邻域大小。
⑦useHarrisDetector:选择是否采用Harris角点检测,默认是false.值为false的时候,使用的是Shi Tomasi算法。
⑧k:Harris角点检测时使用的参数。
返回:
①corners:输出为角点坐标。
import numpy as np
import cv2
import matplotlib.pyplot as plt
def dealImg(img):
b, g, r = cv2.split(img)
img_rgb = cv2.merge([r, g, b])
return img_rgb
def dealImageResult(img_path):
img = cv2.imread(img_path)
im1 = img.copy()
im2 = img.copy()
gray = cv2.cvtColor(im1, cv2.COLOR_BGR2GRAY)
# 返回的最大角点数是40,最低质量水平为0.01,角点之间最小欧式距离为10,useHarrisDetector为默认值false,使用的是Shi-Tomasi算法。
corners = cv2.goodFeaturesToTrack(gray, 40, 0.01, 10)
corners = np.intp(corners)
for i in corners:
x, y = i.ravel()
cv2.circle(im1, (x, y), 3, (255, 255, 0), -1)
# 返回的最大角点数是40,最低质量水平为0.01,角点之间最小欧式距离为10,useHarrisDetector为True,使用的是harris算法。
corners_harris = cv2.goodFeaturesToTrack(gray, 40, 0.01, 10, useHarrisDetector=True)
corners_harris = np.intp(corners_harris)
for i in corners_harris:
x, y = i.ravel()
cv2.circle(im2, (x, y), 3, (255, 255, 0), -1)
fig = plt.figure(figsize=(10, 10))
img = dealImg(img)
im1 = dealImg(im1)
im2 = dealImg(im2)
titles = ["im", " Shi-Tomasi", "harris"]
images = [img, im1, im2]
for i in range(3):
plt.subplot(1, 3, i + 1), plt.imshow(images[i], "gray")
plt.title("{}".format(titles[i]), fontsize=20, ha='center')
plt.xticks([]), plt.yticks([])
#plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.3, hspace=0)
# plt.tight_layout()
plt.show()
fig.savefig('test_results.jpg', bbox_inches='tight')
if __name__ == '__main__':
dealImageResult("corner.jpg")
pass
Harris 和 Shi-Tomasi 都是基于梯度计算的角点检测方法。从上图结果中可以看出,Shi-Tomasi 的检测的效果要好一些。但是,基于梯度的检测方法有计算复杂度高等缺点。如果有提高检测速度的需求的话,可以考虑FAST角点检测算法。FAST角点检测算法原理简单,实时性也较强。
前文回顾
数字图像处理(入门篇)一 图像的数字化与表示
数字图像处理(入门篇)二 颜色空间
数字图像处理(入门篇)三 灰度化
数字图像处理(入门篇)四 像素关系
数字图像处理(入门篇)五 图像数据预处理之颜色空间转换
数字图像处理(入门篇)六 图像数据预处理之坐标变化
数字图像处理(入门篇)七 图像数据预处理之灰度变化
数字图像处理(入门篇)八 图像数据预处理之直方图
数字图像处理(入门篇)九 图像数据预处理之滤波
数字图像处理(入门篇)十 边缘检测
数字图像处理(入门篇)十一 形态学处理
数字图像处理(入门篇)十二 自适应阈值分割
数字图像处理(入门篇)十三 仿射变换
数字图像处理(入门篇)十四 透视变换
数字图像处理(实践篇)一 将图像中的指定目标用bBox框起来吧!
数字图像处理(实践篇)二 画出图像中目标的轮廓
数字图像处理(实践篇)三 将两张图像按照指定比例融合
数字图像处理(实践篇)四 图像拼接-基于SIFT特征点和RANSAC方法
数字图像处理(实践篇)五 使用Grabcut算法进行物体分割
数字图像处理(实践篇)六 利用hough变换进行直线检测
数字图像处理(实践篇)七 利用霍夫变换进行圆环检测
数字图像处理(实践篇)八 Harris角点检测
数字图像处理(实践篇)九 基于边缘的模板匹配
数字图像处理(实践篇)十 图像质量检测
数字图像处理(实践篇)十一 图像中的条形码解析
数字图像处理(实践篇)十二 基于小波变换的图像降噪
数字图像处理(实践篇)十三 数据增强之给图像添加噪声!
数字图像处理(实践篇)十四 图像金字塔
数字图像处理(实践篇)十五 基于傅里叶变换的高通滤波和低通滤波
数字图像处理(实践篇)十六 基于分水岭算法的图像分割