目录

一 涉及的函数

二 实践


在使用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
  • 效果图

数字图像处理(实践篇)十七 Shi-Tomasi 角点检测-LMLPHP

Harris 和 Shi-Tomasi 都是基于梯度计算的角点检测方法。从上图结果中可以看出,Shi-Tomasi 的检测的效果要好一些。但是,基于梯度的检测方法有计算复杂度高等缺点。如果有提高检测速度的需求的话,可以考虑FAST角点检测算法。FAST角点检测算法原理简单,实时性也较强。

前文回顾

 入门篇目录

实践篇目录

12-03 08:14