【OpenCV-Python】教程:4-3 Shi-Tomasi 角点检测
OpenCV Python Shi-Tomasi 角点检测器
【目标】
- Shi-Tomasi 角点检测器
- cv2.goodFeaturesToTrack
【理论】
上一个章节中学习了Harris角点,J. Shi and C. Tomasi 做了一些修改,Good Features to Track显示了比Harris角点更好的效果。
Harris 角点检测器分数函数如下:
R = λ 1 λ 2 − k ( λ 1 + λ 2 ) 2 R=\lambda_1 \lambda_2 -k(\lambda_1+\lambda_2)^2 R=λ1λ2−k(λ1+λ2)2
而 Shi-Tomasi 用:
R = m i n ( λ 1 , λ 2 ) R=min(\lambda_1,\lambda_2) R=min(λ1,λ2)
如果 R R R大于一个阈值,就认为是角点。
如上图,绿色部分的取值就被认为是角点。
【代码】
Harris角点和Shi-Tomasi角点效果对比
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread("assets/blox.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# #############################################
# harris 角点检测
gray_harris = np.float32(gray)
# dst 为角点相应,并没有直接返回角点位置
dst = cv2.cornerHarris(gray_harris, 2, 3, 0.04)
# 角点响应,消除一些噪声,所以要做膨胀和腐蚀
dst = cv2.dilate(dst, None)
dst = cv2.erode(dst, None)
ret, dst = cv2.threshold(dst, 0.01 * dst.max(), 255, cv2.THRESH_BINARY)
dst = np.uint8(dst)
# 取连通区域
ret, labels, stats, centroids = cv2.connectedComponentsWithStats(dst)
# print(len(centroids))
# print(centroids)
img_harris = img.copy()
for xy in centroids:
x, y = int(xy[0]), int(xy[1])
cv2.circle(img_harris, (x, y), 3, (0, 255, 255), -1)
cv2.imshow("img_harris", img_harris)
###########################################
# shi-Tomasi 角点检测
# corners = cv2.goodFeaturesToTrack(gray, 25, 0.01, 10)
# 这里为了统一对比,也选择56个角点
corners = cv2.goodFeaturesToTrack(gray, 56, 0.01, 10)
corners = np.int0(corners)
img_goodfeatures = img.copy()
for i in corners:
x, y = i.ravel()
cv2.circle(img_goodfeatures, (x, y), 3, (0, 0, 255), -1)
cv2.imshow("img_goodfeatures", img_goodfeatures)
cv2.waitKey(0)
cv2.destroyAllWindows()
【接口】
- goodFeaturesToTrack
cv.goodFeaturesToTrack( image, maxCorners, qualityLevel, minDistance[, corners[, mask[, blockSize[, useHarrisDetector[, k]]]]] ) -> corners
cv.goodFeaturesToTrack( image, maxCorners, qualityLevel, minDistance, mask, blockSize, gradientSize[, corners[, useHarrisDetector[, k]]] ) -> corners
cv.goodFeaturesToTrackWithQuality( image, maxCorners, qualityLevel, minDistance, mask[, corners[, cornersQuality[, blockSize[, gradientSize[, useHarrisDetector[, k]]]]]] ) -> corners, cornersQuality
寻找图像中强的角点
- image: 输入的单通道8位或浮点图像
- corners: 输出的角点列表
- maxCorners: 返回的最多的角点数量,如果检测数量较多,返回最强的那个数量即可。如果要返回所有的,设置为
0
即可,测试发现设置负数运行报错。- qualityLevel: 最小可接受角点等级。该参数会与最好的角点响应值相乘,比如说最好的响应为1500,如果设置为0.01,则小于15的角点都不会接受。
- minDistance: 返回的角点之间的最小欧式距离。
- mask: 感兴趣区域
- cornersQuality: 输出角点的质量
- blockSize: 计算梯度和特征值的小窗口
- gradientSize: sobel 梯度窗口直径
- useHarrisDetector: 是否使用 harris 的检测算子
- k: Harris角点检测器的参数
【参考】
- OpenCV 官方文档
- Jianbo Shi and Carlo Tomasi. Good features to track. In Computer Vision and Pattern Recognition, 1994. Proceedings CVPR’94., 1994 IEEE Computer Society Conference on , pages 593–600. IEEE, 1994.
相关文章
- python的安装教程_Python的安装
- pycharm自带python环境吗_Python IDE环境之 新版Pycharm安装详细教程[通俗易懂]
- 在pycharm中如何新建Python文件?_github下载的python源码项目怎么用
- 一口气用Python写了13个小游戏(附源码)
- python人工智能学习笔记_[Python] 人工智能与自然语言处理学习笔记(1)[通俗易懂]
- python教程:用简单的Python编写Web应用程序
- python 多线程测试_【Python】多线程网站死链检测工具
- Python元组_python元组的定义方式
- Python: 判断数组arr中是否有一组数字加起来等于s(动态规划法)
- 【说站】python输入数字变成月份
- python分析人口出生率代码_国家统计局居然也能用的上Python?人口数据Python脚本了解一下?…[通俗易懂]
- python抓包代理库mitmproxy
- python判断文件后缀_Python 判断文件后缀是否被篡改
- python使用opencv如何保存图片_OpenCV Python 保存图片
- opencv(4.5.3)-python(十三)--平滑化图像
- 基于Python的OpenCV有关像素的操作
- 搭建python开发环境-c++教程 如何搭建Python开发环境?
- 【测试开发】python系列教程:Python 推导式
- Python读execl之xlrd库函数详解一:工作簿相关
- python设置报错
- Python玩转Redis:提升缓存效率(python使用redis)
- 利用Neo4j和Python进行无缝图形数据库支持(neo4j python)
- 25 行 Python 代码实现人脸检测——OpenCV 技术教程