概述

除了之前文章所说的利用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角点检测相关推荐

  1. OpenCV与图像处理学习十三——Harris角点检测(含代码)

    OpenCV与图像处理学习十三--Harris角点检测(含代码) 一.角点的概念 二.Harris角点检测的实现过程 三.Harris代码应用 一.角点的概念 角点: 在现实世界中, 角点对应于物体的 ...

  2. OpenCV for Ios 学习笔记(4)-标记检测1

    本文原始地址:OpenCV for Ios 学习笔记(4)-标记检测1 简单的标记经常是以白色块和黑色块构成的规则图形.因为我们预先知道这些因素,所以我们可以很容易检测标记. 如图: 首先,我们需要找 ...

  3. opencv学习_13 (trajkovic 角点检测)

    来源:http://blog.csdn.net/songzitea/article/details/13614977 背景引言 本节主要内容来源于是由 Miroslav Trajkovic和Mark ...

  4. 《OpenCV3编程入门》学习笔记10 角点检测(三)亚像素级角点检测

    10.3 亚像素级角点检测 10.3.1 亚像素级角点检测原理 1.原理:   假设起始角点在实际亚像素角点附近,检测所有q-p向量,下面两种情况点p梯度与q-p向量的点积均为0:(1)点p附近图像均 ...

  5. 《OpenCV3编程入门》学习笔记10 角点检测(二)Shi-Tomasi角点检测

    10.2 Shi-Tomasi角点检测 10.2.1 Shi-Tomasi角点检测:goodFeaturesToTrack()函数 1.定义:   Harris算法改进,若矩阵M行列式的值与M的迹中较 ...

  6. 《OpenCV3编程入门》学习笔记10 角点检测(一)Harris角点检测

    第10章 角点检测 10.1 Harris角点检测 10.1.1 角点 1.图像特征类型: (1)边缘 (2)角点(感兴趣点) (3)斑点(感兴趣区域) 2.角点定义: (1) 一阶导数(灰度的梯度) ...

  7. OpenCV中感兴趣区域的选取与检测(一)

    1.感兴趣区域的选取 感兴趣区域(Region of Interest, ROI)的选取,一般有两种情形:1)已知ROI在图像中的位置:2)ROI在图像中的位置未知. 1)第一种情形 很简单,根据RO ...

  8. opencv (五十一)Harris角点检测

    小白学视觉,笔记,扩展 #include <opencv2/opencv.hpp> #include<iostream>using namespace cv; using na ...

  9. 【OpenCV3】角点检测——cv::goodFeaturesToTrack()与cv::cornerSubPix()详解

    一提到角点检测,最常用的方法莫过于Harris角点检测,opencv中也提供了Harris角点检测的接口,即cv::cornerHarris(),但是Harris角点检测存在很多缺陷(如角点是像素级别 ...

  10. 角点检测和匹配之Harris与FAST角点检测

    这一章主要内容: 1. Harris角点检测 2. FAST特征检测 3. 尺度不变的SURF特征检测 4.SURF检测描述 一.引言 在计算机视觉中,特征点或称兴趣点,角点(即图像的极值点,线段的终 ...

最新文章

  1. 【分享】计算机视觉方向必备opencv基础知识总览
  2. 为什么我们需要给 Angular library 创建多重入口 multiple entry point
  3. mysql查看binlog日志内容
  4. vue 修改标题栏_VUE动态修改titile的三种方法
  5. 最优乘车(信息学奥赛一本通-T1377)
  6. 朱晔和你聊Spring系列S1E5:Spring WebFlux小探
  7. Ghost xp NetMeeting不能共享桌面的解决办法
  8. Java实现网页滑动验证与短信验证码案例精析
  9. 数据采集的目的是什么
  10. loadRunner之中文语言包安装
  11. 代码的坏味道之二十一 :Refused Bequest(被拒绝的遗贈)
  12. Http Status 500
  13. 四大因素使二三线城市楼市泡沫难救?
  14. 多线程基础之四:Linux提供的原子锁类型atomic_t
  15. iBeacon距离测量误差有多大
  16. 我是如何从流水线工人到程序员?(2008-2018)
  17. 广义相对论-学习记录7-第三章-张量分析与黎曼几何4
  18. 【MySQL】DML,DQL
  19. android 矢量图片使用方法,Android中的矢量图
  20. SpringBoot + Shiro 实现微博登录

热门文章

  1. 我的IT之路2012(一)
  2. 阿里云开启ipv6通过appstore审核的方法
  3. 上班路上快一倍,长途出门快一半
  4. QuickCHM2.6出现不支持此接口 的两种解决办法(补充)
  5. DTD语法 (元素、属性、实体声明)
  6. 再爆hzhost6.5虚拟主机管理系统的SQL注入漏洞3
  7. 【转】精益看板核心实践大作战
  8. Keys配置及使用说明
  9. matlab 采样点数,信号频率、采样频率、采样点数
  10. wincap支持VC6.0的版本下载