OpenCV特征提取与检测之Shi-Tomasi角点检测器
作者:程序媛一枚~ 发布时间:2023-12-17 09:41:35
前言
角点通常被定义为两条边的交点,或者说,角点的局部邻域应该具有两个不同区域的不同方向的边界。角点检测(Corner Detection)是计算机视觉系统中获取图像特征的一种方法,广泛应用于运动检测、图像匹配、视频跟踪、三维重建和目标识别等,也可称为特征点检测。
角点检测算法的基本思想:
使用一个固定窗口在图像上进行任意方向上的滑动,比较滑动前与滑动后两种情况,窗口中的像素灰度变化程度,如果存在任意方向上的滑动,都有着较大灰度变化,那么我们可以认为该窗口中存在角点。
目前,角点检测算法还不是十分完善,许多算法需要依赖大量的训练集和冗余数据来防止和减少错误的特征的出现。对于角点检测算法的重要评价标准是:其对多幅图像中相同或者相似特征的检测能力,并且能够应对光照变化、或者图像旋转等影响。
关于角点的具体描述可以有几种:
一阶导数(即灰度的梯度)的局部最大所对应的像素点;
两条及两条以上边缘的交点;
图像中梯度值和梯度方向的变化速率都很高的点;
角点处的一阶导数最大,二阶导数为零,指示物体边缘变化不连续的方向
上一篇博客介绍了Harris角点检测器,这篇博客将介绍另一个角点检测器:Shi-Tomasi角点检测器。
Shi-Tomasi角点检测器是Harris角点检测器的优化,效果更好;
cv2.goodFeaturesToTrack(),通过Shi-Tomasi方法(或者Harris角点检测)在图像中找到N个最强的角点。并且在跟踪对象方面性能很好。
1. 效果图
原图 VS Harris角点检测器效果如下:
原图 VS Shi-Tomasi角点检测效果图如下:
可以看出Shi-Tomasi确实效果要好一些,所有角点均被成功检测;
2. 源码
# Shi-Tomasi角点检测是Harris角点检测的优化,更准确,会检测出N个最强角点;
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('images/polygon.jpg')
plt.subplot(1, 2, 1)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.xticks([])
plt.yticks([])
plt.title("origin")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
corners = cv2.goodFeaturesToTrack(gray, 25, 0.01, 10)
corners = np.int0(corners)
for i in corners:
x, y = i.ravel()
cv2.circle(img, (x, y), 3, 255, -1)
plt.subplot(1,2,2)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.xticks([])
plt.yticks([])
plt.title("Shi-Tomasi res")
plt.show()
参考 https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_feature2d/py_shi_tomasi/py_shi_tomasi.html#shi-tomasi
来源:https://blog.csdn.net/qq_40985985/article/details/119117405
猜你喜欢
- 调用bianli()函数,这里是遍历F:盘,bianli("F:\")'这里设置文件夹路径,你可以改为其它文件夹
- 本文实例讲述了Python实现的排列组合计算操作。分享给大家供大家参考,具体如下:1. 调用 scipy 计算排列组合的具体数值>&g
- 本文实例讲述了Python常见MongoDB数据库操作。分享给大家供大家参考,具体如下:MongoDB 是一个基于分布式文件存储的数据库。由
- 本文实例为大家分享了python创建tcp服务端和客户端的具体代码,供大家参考,具体内容如下1.服务端serverfrom socket i
- 如下所示:import numpy as npx = [1,2] #横坐标y = [3,4] #第一个纵坐标y1 =
- argparse是python标准库里面用来处理命令行参数的库命令行参数分为位置参数和选项参数:位置参数就是程序根据该参数出现的位置来确定的
- 目录问题描述解决方案讨论总结问题描述怎样在数据字典中执行一些计算操作(比如求最值、排序等)?解决方案有如下字典:stocks = { &nb
- 本文实例为大家分享了python通过输入联系人首字母查询联系人的具体代码,供大家参考,具体内容如下# -*- coding:utf-8 -*
- 前言提到太阳系,大家可能会想到哥白尼和他的日心说,或是捍卫、发展日心说的斗士布鲁诺,他们像一缕光一样照亮了那个时代的夜空,对历史感兴趣的小伙
- 本文实例总结了php随机取mysql记录方法。分享给大家供大家参考。具体分析如下:在php中要随机取mysql记录我们可以直接使用mysql
- phpinfo() 功能描述:输出 PHP 环境信息以及相关的模块、WEB 环境等信息。 危险等级:中 passthru() 功能描述:允许
- 先给出结论:要替换的字符数量不多时,可以直接链式replace()方法进行替换,效率非常高;如果要替换的字符数量较多,则推荐在 for 循环
- 介绍:pyenv-virtualenv是pyenv的一个插件,作用如同virtualenv一样,是用来管理虚拟环境的,配合pyenv主体使用
- #!/usr/bin/env python##-*- coding: utf-8 -*- import os print
- 本文为大家分享了python字典DICT类型合并的方法,供大家参考,具体内容如下我要的字典的键值有些是数据库中表的字段名, 但是有些却不是,
- 99bill: 1.md5.asp 代码如下:<% '''''''&
- 设计首页的第一步是设计版面布局。就象传统的报刊杂志编辑一样,我们将网页看作一张报纸,一本杂志来进行排版布局。虽然 * 页技术的发展使得我们开
- 本文实例讲述了Python2.7+pytesser实现简单验证码的识别方法。分享给大家供大家参考,具体如下:首先,安装Python2.7版本
- 1 使用Flask处理表单什么是表单(Form)? 表单是搜集用户数据信息的各种表单元素的集合区域。它的作用是实现用户和服务器的数据交互。通
- 感谢AKA及作者。Perl 中的正则表达式正则表达式的三种形式正则表达式中的常用模式正则表达式的 8 大原则 &nbs