目录
在使用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角点检测算法原理简单,实时性也较强。
前文回顾