OpenCV中feature2D学习——Shi-Tomasi角点检测
概述
除了之前文章所说的利用Harris进行角点检测,还可以利用Shi-Tomasi方法(相关论文)进行角点检测,该方法也可以用于初始化基于特征点的目标跟踪。
函数实现
该方法在opencv中的具体实现是在函数goodFeaturesToTrack()中,其原型为:
C++: void goodFeaturesToTrack(InputArray image, OutputArray corners, int maxCorners, double qualityLevel, double minDistance,
InputArray mask=noArray(), int blockSize=3, bool useHarrisDetector=false, double k=0.04 )
C: void cvGoodFeaturesToTrack(const CvArr* image, CvArr* eig_image, CvArr* temp_image, CvPoint2D32f* corners, int* corner_count,
double quality_level, double min_distance, const CvArr* mask=NULL, int block_size=3, int use_harris=0, double k=0.04 )
函数参数说明如下:
image:输入8-bit或浮点型32-bit图像,要求单通道;
eig_image和temp_image被忽略;
corners:检测到角点的输出矩阵;
maxCorners:角点个数的最大值,如果检测到的角点数目超过这个值,则取其中最显著的角点输出;
qualityLeve:用来表征可接受角点的最差质量。该参数值乘以最佳角点的质量数值得到的乘积(即最小的特征值,参考cornerMinEigenVal()函数,或者是Harris函数的响应值,参考cornerHarris()函数)是一个阈值,所有质量数值小于这个阈值的角点将被忽略。举例来说,如果最佳角点的质量数值为1500,qualityLevel设为0.01,那么所有质量数值小于15的角点都会被忽略。
minDistance:返回角点间最小的欧氏距离。
mask:可选的感兴趣区域。如果输入图像非空(此时mask必须为CV_8UC1并且大小和输入图像一致),它制定了角点被检测到的那个区域。
blockSize:在每个像素的邻域中计算导数协方差矩阵时的平均块大小(参考cornerEigenValsAndVecs()函数)。
useHarrisDetector:是否使用Harris检测算法(参考cornerHarris()函数)或者Shi-Tomasi检测算法(参考cornerMinEigenVal()函数)。
k:Harri角点检测自由参数。
函数功能
该函数在图像或选定的区域中检测最显著的角点,的功能介绍如下:
(1)该函数在输入图像的每个像素点上使用cornerHarris()函数和cornerMinEigenVal()函数计算角点质量数值。
(2)该函数使用非极大值抑制算法(non-maximumsuppression),3*3邻域内的局部极大值被保留。
(3)像上面参数解释内容所述的,角点的最小特征值如果小于
,则被忽略。
(4)步骤(3)筛选后剩下的角点按照质量数值从高到低排序。
(5)在每个检测到的角点周围minDistance的范围内,如果有更显著的角点被检测到,则这个角点被忽略。这样也是为了保证最显著的角点被保留下来。
代码示例
代码示例如下:
/**
* @使用Shi-Tomasi方法进行角点检测
* @author holybin
*/#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace cv;
using namespace std;/// 全局变量
Mat src, srcGray;
int maxCorners = 23; //角点个数的最大值
int maxCornersThresh = 1000; //角点个数最大值的上限(滑动条范围0-1000)RNG rng(12345);
char* sourceWindow = "src";/// 角点检测函数声明
void doGoodFeaturesToTrack( int, void* );int main( int argc, char** argv )
{/// 载入图像并灰度化src = imread( "D:\\opencv_pic\\house_small.jpg", 1 );cvtColor( src, srcGray, CV_BGR2GRAY );/// 创建显示窗口以及滑动条namedWindow( sourceWindow, CV_WINDOW_AUTOSIZE );createTrackbar( "max num:", sourceWindow, &maxCorners, maxCornersThresh, doGoodFeaturesToTrack ); imshow( sourceWindow, src );doGoodFeaturesToTrack( 0, 0 );waitKey(0);return(0);
}/// 角点检测函数实现:标示出每个角点位置
void doGoodFeaturesToTrack( int, void* )
{if( maxCorners < 1 )maxCorners = 1;/// Shi-Tomasi的参数设置vector<Point2f> corners;double qualityLevel = 0.01;double minDistance = 10;int blockSize = 3;bool useHarrisDetector = false; //不使用Harris检测算法double k = 0.04;/// 深度拷贝原图像用于绘制角点Mat srcCopy = src.clone();/// 应用角点检测算法goodFeaturesToTrack( srcGray, corners,maxCorners,qualityLevel,minDistance,Mat(), //未选择感兴趣区域blockSize,useHarrisDetector,k );/// 当maxCorners的值较小时,以下两个值基本是一样的;/// 当maxCorners的值较大时,实际检测到的角点数目有可能小于maxCorners,以下两个值不一样。cout<<"* detected corners : "<<corners.size()<<endl;cout<<"** max corners: "<<maxCorners<<endl;/// 绘制出角点int r = 4;for( int i = 0; i < corners.size(); i++ )circle( srcCopy, corners[i], r, Scalar(0,255,0), -1, 8, 0 );/// 显示结果namedWindow( sourceWindow, CV_WINDOW_AUTOSIZE );imshow( sourceWindow, srcCopy );
}
运行结果:
从结果可以看出当角点个数阈值太大时,检测到的角点个数固定在434,也就是最多能检测出434个角点。
OpenCV中feature2D学习——Shi-Tomasi角点检测相关推荐
- OpenCV与图像处理学习十三——Harris角点检测(含代码)
OpenCV与图像处理学习十三--Harris角点检测(含代码) 一.角点的概念 二.Harris角点检测的实现过程 三.Harris代码应用 一.角点的概念 角点: 在现实世界中, 角点对应于物体的 ...
- OpenCV for Ios 学习笔记(4)-标记检测1
本文原始地址:OpenCV for Ios 学习笔记(4)-标记检测1 简单的标记经常是以白色块和黑色块构成的规则图形.因为我们预先知道这些因素,所以我们可以很容易检测标记. 如图: 首先,我们需要找 ...
- opencv学习_13 (trajkovic 角点检测)
来源:http://blog.csdn.net/songzitea/article/details/13614977 背景引言 本节主要内容来源于是由 Miroslav Trajkovic和Mark ...
- 《OpenCV3编程入门》学习笔记10 角点检测(三)亚像素级角点检测
10.3 亚像素级角点检测 10.3.1 亚像素级角点检测原理 1.原理: 假设起始角点在实际亚像素角点附近,检测所有q-p向量,下面两种情况点p梯度与q-p向量的点积均为0:(1)点p附近图像均 ...
- 《OpenCV3编程入门》学习笔记10 角点检测(二)Shi-Tomasi角点检测
10.2 Shi-Tomasi角点检测 10.2.1 Shi-Tomasi角点检测:goodFeaturesToTrack()函数 1.定义: Harris算法改进,若矩阵M行列式的值与M的迹中较 ...
- 《OpenCV3编程入门》学习笔记10 角点检测(一)Harris角点检测
第10章 角点检测 10.1 Harris角点检测 10.1.1 角点 1.图像特征类型: (1)边缘 (2)角点(感兴趣点) (3)斑点(感兴趣区域) 2.角点定义: (1) 一阶导数(灰度的梯度) ...
- OpenCV中感兴趣区域的选取与检测(一)
1.感兴趣区域的选取 感兴趣区域(Region of Interest, ROI)的选取,一般有两种情形:1)已知ROI在图像中的位置:2)ROI在图像中的位置未知. 1)第一种情形 很简单,根据RO ...
- opencv (五十一)Harris角点检测
小白学视觉,笔记,扩展 #include <opencv2/opencv.hpp> #include<iostream>using namespace cv; using na ...
- 【OpenCV3】角点检测——cv::goodFeaturesToTrack()与cv::cornerSubPix()详解
一提到角点检测,最常用的方法莫过于Harris角点检测,opencv中也提供了Harris角点检测的接口,即cv::cornerHarris(),但是Harris角点检测存在很多缺陷(如角点是像素级别 ...
- 角点检测和匹配之Harris与FAST角点检测
这一章主要内容: 1. Harris角点检测 2. FAST特征检测 3. 尺度不变的SURF特征检测 4.SURF检测描述 一.引言 在计算机视觉中,特征点或称兴趣点,角点(即图像的极值点,线段的终 ...
最新文章
- 【分享】计算机视觉方向必备opencv基础知识总览
- 为什么我们需要给 Angular library 创建多重入口 multiple entry point
- mysql查看binlog日志内容
- vue 修改标题栏_VUE动态修改titile的三种方法
- 最优乘车(信息学奥赛一本通-T1377)
- 朱晔和你聊Spring系列S1E5:Spring WebFlux小探
- Ghost xp NetMeeting不能共享桌面的解决办法
- Java实现网页滑动验证与短信验证码案例精析
- 数据采集的目的是什么
- loadRunner之中文语言包安装
- 代码的坏味道之二十一 :Refused Bequest(被拒绝的遗贈)
- Http Status 500
- 四大因素使二三线城市楼市泡沫难救?
- 多线程基础之四:Linux提供的原子锁类型atomic_t
- iBeacon距离测量误差有多大
- 我是如何从流水线工人到程序员?(2008-2018)
- 广义相对论-学习记录7-第三章-张量分析与黎曼几何4
- 【MySQL】DML,DQL
- android 矢量图片使用方法,Android中的矢量图
- SpringBoot + Shiro 实现微博登录