iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >OpenCV图像特征提取之Shi-Tomasi角点检测算法详解
  • 223
分享到

OpenCV图像特征提取之Shi-Tomasi角点检测算法详解

2024-04-02 19:04:59 223人浏览 安东尼
摘要

目录一.Shi-Tomasi 角点检测算法二.Shi-Tomasi角点检测api函数接口一.Shi-Tomasi 角点检测算法 Harris角点检测基本数学公式如下: &n

一.Shi-Tomasi 角点检测算法

Harris角点检测基本数学公式如下:  

泰勒公式进行展开后,近似为:

对于局部微小的移动量[u,v],可以近似得到下面的表达:

其中M为2*2的矩阵,可由图像的导数求得:

矩阵M,将其对角化之后 ,特征值λ1, λ2 分别代表了X 和Y 方向的灰度变化率.

E(u,v)的椭圆形式如下:

Harris角点检测算法的角点响应函数为:

Harris角点检测算法就是对角点响应函数R进行阈值处理:R > threshold,即提取R的局部极大值。shi-Tomasi 算法是基于Harris 算法进行的改进,Harris算法最基础的数学定义是将矩阵 M 的行列式值与矩阵 M 的迹相减,再将差值与预先给定的阈值进行比较。若两个特征值中较小的一个大于最小阈值,则会得到强角点,这就是Shi-Tomasi角点检测算法。

Shi-Tomasi角点检测算法的角点响应函数为:

Shi-tomasi角点检测 和Harris 算法一样,如果该分数大于设定的阈值,我们就认为它是一个角点。可以看出来只有当 λ1 和 λ 2 都大于最小值时,才被认为是角点,即下图中的紫色区域。

二.Shi-Tomasi角点检测API函数接口

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 );

参数说明:

第一个参数image:输入图像,8位或浮点32比特,单通道图像;

第二个参数corners:输出参数,检测到的角点;表示返回角点的数目,如果检测出来角点数目大于最大数目则返回响应值最强前规定数目;

第三个参数corner_count:输出参数,检测到的角点数目;

第四个参数quality_level:最大最小特征值的乘法因子。定义可接受图像角点的最小质量因子;

第五个参数min_distance:限制因子。得到的角点的最小距离;使用 Euclidian 距离;

第六个参数mask:ROI感兴趣区域。函数在ROI中计算角点;如果 mask 为 NULL,则选择整个图像;

第七个参数block_size: 是计算导数的自相关矩阵时指定点的领域,采用小窗口计算的结果比单点 (也就是block_size为1)计算的结果要好;

第八个参数useHarrisDetector:当use_harris的值为非0,则函数使用Harris的角点定义;若为 0,则使用Shi-Tomasi的定义;

第九个参数K:用于设置Hessian自相关矩阵即对Hessian行列式的相对权重的权重系数;

代码实现

#include"stdafx.h"
#include <OpenCV2/opencv.hpp>
#include <iOStream>
 
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
 
using namespace cv;
using namespace std;
 
#define WIN_NAME "Shi-Tomasi角点检测"
 
Mat srcImage, grayImage;
int maxCornerNumber = 33;
int maxTrackbarNumber = 500;
RNG rng(12345);
 
void on_GoodFeatureToTrack(int, void *)
{
    if (maxCornerNumber <= 1)
    {
        maxCornerNumber = 1;
    }
    //Shi-Tomasi参数准备
    vector<Point2f> corners;
    double qualityLevel = 0.01; //角点检测可以接受的最小特征值
    double minDistance = 10; //角点间的最小像素距离设置
    int blockSize = 3;  //计算导数自相关矩阵时指定的领域范围
    double k = 0.04;   //权重系数
 
    Mat copy = srcImage.clone(); //复制原图到一个临时变量中,作为感兴趣区域
                                 //Shi-Tomasi Test
    goodFeaturesToTrack(grayImage, corners, maxCornerNumber, qualityLevel, minDistance, Mat(), blockSize, false, k);
 
    //输出文字信息
    cout << ">此次检测到的角点数量为: " << corners.size() << endl;
 
    //绘制检测到的角点
    for (unsigned int i = 0; i < corners.size(); i++)
    {
        circle(copy, corners[i], 5, Scalar(rng.unifORM(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)), -1, 8, 0);
    }
 
    imshow(WIN_NAME, copy);
}
 
int main(int arGC, char** argv)
{
    srcImage = imread("F:/photo/lj.jpg");
    cvtColor(srcImage, grayImage, COLOR_BGR2GRAY);
 
    namedWindow(WIN_NAME, WINDOW_AUTOSIZE);
 
    createTrackbar("最大角点数:", WIN_NAME, &maxCornerNumber, maxTrackbarNumber, on_GoodFeatureToTrack);
 
    //imshow(WIN_NAME, srcImage);
 
 
    on_GoodFeatureToTrack(0, 0);
 
 
    waiTKEy(0);
    return 0;
}

图像处理效果

到此这篇关于OpenCV图像特征提取之Shi-Tomasi角点检测算法详解的文章就介绍到这了,更多相关OpenCV角点检测算法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: OpenCV图像特征提取之Shi-Tomasi角点检测算法详解

本文链接: https://www.lsjlt.com/news/167687.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c语言怎么计算字符串长度
    在C语言中,可以使用内置的strlen()函数来计算字符串的长度。该函数位于string.h头文件中。以下是一个示例代码: #inc...
    99+
    2024-05-14
    c语言
  • c语言怎么判断三个数的大小
    可以通过比较三个数之间的大小关系来判断它们的大小。以下是一个示例代码: #include <stdio.h> int ...
    99+
    2024-05-14
    c语言
  • c++排序函数sort怎么使用
    在C++中,使用sort函数对容器中的元素进行排序,可以按照默认的升序排列,也可以自定义排序规则。 下面是一个简单的例子,对一个ve...
    99+
    2024-05-14
    c++
  • c++中string的compare函数怎么使用
    在C++中,可以使用string的compare函数来比较两个string对象的大小。该函数的原型如下: int compare(c...
    99+
    2024-05-14
    c++
  • c++中string的compare函数有什么用
    c++中string的compare函数用于比较两个字符串的大小关系。该函数返回一个整数值,表示两个字符串的比较结果。 具体来说,如...
    99+
    2024-05-14
    c++
  • c++中print函数的功能有哪些
    在C++中,通常使用std::cout来进行输出操作,而不是使用print函数。std::cout是C++标准库中的一个输出流对象,...
    99+
    2024-05-14
    c++
  • c语言数据结构怎么使用
    在C语言中,数据结构可以通过定义结构体来实现。以下是一些常见的数据结构的使用方法示例: 链表: #include <std...
    99+
    2024-05-14
    c语言
  • c++中print函数的用法是什么
    在C++中没有内置的print函数,但可以使用cout来输出内容到控制台。cout是C++标准库中的一个输出流对象,可以使用<...
    99+
    2024-05-14
    c++
  • c++中concept的用法是什么
    在C++20中,Concept是一种新的语言特性,用于定义类型要求和约束。Concept可以被用来约束函数模板、类模板和普通函数的参...
    99+
    2024-05-14
    c++
  • c++中concept的作用是什么
    在C++中,concept的作用是定义一种通用的约束,用于限制模板参数的类型范围。通过使用concept,可以在编译时对模板参数进行...
    99+
    2024-05-14
    c++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作