Opencv之角点 Harris、Shi-Tomasi 检测详解

这篇具有很好参考价值的文章主要介绍了Opencv之角点 Harris、Shi-Tomasi 检测详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • 角点,即图像中某些属性较为突出的像素点

  • 常用的角点有以下几种:

    • 梯度最大值对应的像素点
    • 两条直线或者曲线的交点
    • 一阶梯度的导数最大值和梯度方向变化率最大的像素点
    • 一阶导数值最大,但是二阶导数值为0的像素点

Opencv之角点 Harris、Shi-Tomasi 检测详解,# C++ - opencv,opencv,人工智能,计算机视觉,深度学习,c++

  • API简介:
void  cornerHarris (
    InputArray      src,   // 输入图像 (单通道,8位或浮点型)
    OutputArray     dst,   // 输出图像 (类型 CV_32FC1,大小同 src)
    int      blockSize,    // 邻域大小
    int      ksize,        // Sobel 算子的孔径大小
    double   k,            // 经验参数,取值范围 0.04 ~ 0.06
    int      borderType = BORDER_DEFAULT    // 边界模式
)     
void  goodFeaturesToTrack (     
        InputArray      image,     // 输入图像 (单通道,8位或浮点型32位)
        OutputArray     corners,   // 检测到的角点
        int         maxCorners,    // 最多允许返回的角点数量
        double      qualityLevel,  //  质量水平
        double      minDistance,   // 角点间的最小欧拉距离
        InputArray  mask = noArray(), //
        int         blockSize = 3,    //
        bool        useHarrisDetector = false,  //
        double      k = 0.04  // 
    )     
void  cornerSubPix(
        InputArray          image,  // 输入图象(单通道,8位或浮点型)
        InputOutputArray  corners,  // 亚像素精度的角点坐标
        Size              winSize,  // 搜索窗口尺寸的 1/2
        Size             zeroZone,  //
        TermCriteria     criteria   // 迭代终止准则
)     

1. Harris角点

  • 主要用于检测图像中线段的端点或者两条线段的交点

  • 在图像中定义一个局部小窗口,然后沿各个方向移动这个窗口,则会出现 a) b) c) 三种情况,分别对应平坦区、边缘和角点,下图给出了检测思路:

    • 窗口内的图像强度,在窗口向各个方向移动时,都没有发生变化,则窗口内都是 “平坦区”,不存在角点
    • 窗口内的图像强度,在窗口向某一个 (些) 方向移动时,发生较大变化;而在另一些方向不发生变化,那么,窗口内可能存在 “边缘”
    • 窗口内的图像强度,在窗口向各个方向移动时,都发生了较大的变化,则认为窗口内存在 “角点”

Opencv之角点 Harris、Shi-Tomasi 检测详解,# C++ - opencv,opencv,人工智能,计算机视觉,深度学习,c++

  • 其主要理论如下:
    Opencv之角点 Harris、Shi-Tomasi 检测详解,# C++ - opencv,opencv,人工智能,计算机视觉,深度学习,c++
    Opencv之角点 Harris、Shi-Tomasi 检测详解,# C++ - opencv,opencv,人工智能,计算机视觉,深度学习,c++
  • demo
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;
Mat src, src_gray;
int thresh = 200;
int max_thresh = 255;
const char* source_window = "Source image";
const char* corners_window = "Corners detected";
void cornerHarris_demo( int, void* );
int main( int argc, char** argv )
{
 CommandLineParser parser( argc, argv, "{@input | building.jpg | input image}" );
 src = imread( samples::findFile( parser.get<String>( "@input" ) ) );
 if ( src.empty() )
 {
 cout << "Could not open or find the image!\n" << endl;
 cout << "Usage: " << argv[0] << " <Input image>" << endl;
 return -1;
 }
 cvtColor( src, src_gray, COLOR_BGR2GRAY );
 namedWindow( source_window );
 createTrackbar( "Threshold: ", source_window, &thresh, max_thresh, cornerHarris_demo );
 imshow( source_window, src );
 cornerHarris_demo( 0, 0 );
 waitKey();
 return 0;
}
void cornerHarris_demo( int, void* )
{
 int blockSize = 2;
 int apertureSize = 3;
 double k = 0.04;
 Mat dst = Mat::zeros( src.size(), CV_32FC1 );
 cornerHarris( src_gray, dst, blockSize, apertureSize, k );
 Mat dst_norm, dst_norm_scaled;
 normalize( dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat() );
 convertScaleAbs( dst_norm, dst_norm_scaled );
 for( int i = 0; i < dst_norm.rows ; i++ )
 {
 for( int j = 0; j < dst_norm.cols; j++ )
 {
 if( (int) dst_norm.at<float>(i,j) > thresh )
 {
 circle( dst_norm_scaled, Point(j,i), 5, Scalar(0), 2, 8, 0 );
 }
 }
 }
 namedWindow( corners_window );
 imshow( corners_window, dst_norm_scaled );
}

Opencv之角点 Harris、Shi-Tomasi 检测详解,# C++ - opencv,opencv,人工智能,计算机视觉,深度学习,c++

2. Shi-Tomasi 角点

  • 后来在1994年,J. Shi和C. Tomasi在他们的论文Good Features to Track中对其进行了小的修改,与Harris Corner Detector相比,显示出更好的结果。哈里斯角探测器中的评分函数由下式给出:
    Opencv之角点 Harris、Shi-Tomasi 检测详解,# C++ - opencv,opencv,人工智能,计算机视觉,深度学习,c++

  • OpenCV有一个函数 cv.goodFeaturesToTrack()。它通过Shi-Tomasi方法(或Harris角点检测,如果您指定的话)在图像中找到N个最强的角落。首先图像是灰度图像。提前指定要查找的角点数,然后,指定质量值,该值介于 0-1 之间,表示角的最低质量,低于该质量,每个都被拒绝。然后,我们提供检测到的拐角之间的最小欧氏距离。

  • 有了所有这些信息,该函数就会在图像中找到角落。所有低于质量水平的角落都将被剔除。然后,它根据质量按降序对剩余的角进行排序。然后函数取第一个最强角,丢弃最小距离范围内的所有附近角,并返回 N 个最强角。

在下面的示例中,我们将尝试找到 25 个最佳角:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('blox.jpg')
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
corners = cv.goodFeaturesToTrack(gray,25,0.01,10)
corners = np.int0(corners)
for i in corners:
 x,y = i.ravel()
 cv.circle(img,(x,y),3,255,-1)
plt.imshow(img),plt.show()

Opencv之角点 Harris、Shi-Tomasi 检测详解,# C++ - opencv,opencv,人工智能,计算机视觉,深度学习,c++

  • 使用实例:
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;
Mat src, src_gray;
int maxCorners = 23;
int maxTrackbar = 100;
RNG rng(12345);
const char* source_window = "Image";
void goodFeaturesToTrack_Demo( int, void* );
int main( int argc, char** argv )
{
 CommandLineParser parser( argc, argv, "{@input | pic3.png | input image}" );
 src = imread( samples::findFile( parser.get<String>( "@input" ) ) );
 if( src.empty() )
 {
 cout << "Could not open or find the image!\n" << endl;
 cout << "Usage: " << argv[0] << " <Input image>" << endl;
 return -1;
 }
 cvtColor( src, src_gray, COLOR_BGR2GRAY );
 namedWindow( source_window );
 createTrackbar( "Max corners:", source_window, &maxCorners, maxTrackbar, goodFeaturesToTrack_Demo );
 imshow( source_window, src );
 goodFeaturesToTrack_Demo( 0, 0 );
 waitKey();
 return 0;
}
void goodFeaturesToTrack_Demo( int, void* )
{
 maxCorners = MAX(maxCorners, 1);
 vector<Point2f> corners;
 double qualityLevel = 0.01;
 double minDistance = 10;
 int blockSize = 3, gradientSize = 3;
 bool useHarrisDetector = false;
 double k = 0.04;
 Mat copy = src.clone();
 goodFeaturesToTrack( src_gray,
 corners,
 maxCorners,
 qualityLevel,
 minDistance,
 Mat(),
 blockSize,
 gradientSize,
 useHarrisDetector,
 k );
 cout << "** Number of corners detected: " << corners.size() << endl;
 int radius = 4;
 for( size_t i = 0; i < corners.size(); i++ )
 {
 circle( copy, corners[i], radius, Scalar(rng.uniform(0,255), rng.uniform(0, 256), rng.uniform(0, 256)), FILLED );
 }
 namedWindow( source_window );
 imshow( source_window, copy );
}

Opencv之角点 Harris、Shi-Tomasi 检测详解,# C++ - opencv,opencv,人工智能,计算机视觉,深度学习,c++

3. 角点检测器

  • 使用 OpenCV 函数 cv::cornerEigenValsAndVecs 查找特征值和特征向量,以确定像素是否为角。
  • 使用 OpenCV 函数 cv::cornerMinEigenVal 查找角检测的最小特征值。
  • 通过使用上述两个函数实现我们自己的哈里斯检测器版本以及 Shi-Tomasi 检测器。
  • 使用实例:
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;
Mat src, src_gray;
Mat myHarris_dst, myHarris_copy, Mc;
Mat myShiTomasi_dst, myShiTomasi_copy;
int myShiTomasi_qualityLevel = 50;
int myHarris_qualityLevel = 50;
int max_qualityLevel = 100;
double myHarris_minVal, myHarris_maxVal;
double myShiTomasi_minVal, myShiTomasi_maxVal;
RNG rng(12345);
const char* myHarris_window = "My Harris corner detector";
const char* myShiTomasi_window = "My Shi Tomasi corner detector";
void myShiTomasi_function( int, void* );
void myHarris_function( int, void* );
int main( int argc, char** argv )
{
 CommandLineParser parser( argc, argv, "{@input | building.jpg | input image}" );
 src = imread( samples::findFile( parser.get<String>( "@input" ) ) );
 if ( src.empty() )
 {
 cout << "Could not open or find the image!\n" << endl;
 cout << "Usage: " << argv[0] << " <Input image>" << endl;
 return -1;
 }
 cvtColor( src, src_gray, COLOR_BGR2GRAY );
 int blockSize = 3, apertureSize = 3;
 cornerEigenValsAndVecs( src_gray, myHarris_dst, blockSize, apertureSize );
 /* calculate Mc */
 Mc = Mat( src_gray.size(), CV_32FC1 );
 for( int i = 0; i < src_gray.rows; i++ )
 {
 for( int j = 0; j < src_gray.cols; j++ )
 {
 float lambda_1 = myHarris_dst.at<Vec6f>(i, j)[0];
 float lambda_2 = myHarris_dst.at<Vec6f>(i, j)[1];
 Mc.at<float>(i, j) = lambda_1*lambda_2 - 0.04f*((lambda_1 + lambda_2) * (lambda_1 + lambda_2));
 }
 }
 minMaxLoc( Mc, &myHarris_minVal, &myHarris_maxVal );
 /* Create Window and Trackbar */
 namedWindow( myHarris_window );
 createTrackbar( "Quality Level:", myHarris_window, &myHarris_qualityLevel, max_qualityLevel, myHarris_function );
 myHarris_function( 0, 0 );
 cornerMinEigenVal( src_gray, myShiTomasi_dst, blockSize, apertureSize );
 minMaxLoc( myShiTomasi_dst, &myShiTomasi_minVal, &myShiTomasi_maxVal );
 /* Create Window and Trackbar */
 namedWindow( myShiTomasi_window );
 createTrackbar( "Quality Level:", myShiTomasi_window, &myShiTomasi_qualityLevel, max_qualityLevel, myShiTomasi_function );
 myShiTomasi_function( 0, 0 );
 waitKey();
 return 0;
}
void myShiTomasi_function( int, void* )
{
 myShiTomasi_copy = src.clone();
 myShiTomasi_qualityLevel = MAX(myShiTomasi_qualityLevel, 1);
 for( int i = 0; i < src_gray.rows; i++ )
 {
 for( int j = 0; j < src_gray.cols; j++ )
 {
 if( myShiTomasi_dst.at<float>(i,j) > myShiTomasi_minVal + ( myShiTomasi_maxVal - myShiTomasi_minVal )*myShiTomasi_qualityLevel/max_qualityLevel )
 {
 circle( myShiTomasi_copy, Point(j,i), 4, Scalar( rng.uniform(0,256), rng.uniform(0,256), rng.uniform(0,256) ), FILLED );
 }
 }
 }
 imshow( myShiTomasi_window, myShiTomasi_copy );
}
void myHarris_function( int, void* )
{
 myHarris_copy = src.clone();
 myHarris_qualityLevel = MAX(myHarris_qualityLevel, 1);
 for( int i = 0; i < src_gray.rows; i++ )
 {
 for( int j = 0; j < src_gray.cols; j++ )
 {
 if( Mc.at<float>(i,j) > myHarris_minVal + ( myHarris_maxVal - myHarris_minVal )*myHarris_qualityLevel/max_qualityLevel )
 {
 circle( myHarris_copy, Point(j,i), 4, Scalar( rng.uniform(0,256), rng.uniform(0,256), rng.uniform(0,256) ), FILLED );
 }
 }
 }
 imshow( myHarris_window, myHarris_copy );
}

Opencv之角点 Harris、Shi-Tomasi 检测详解,# C++ - opencv,opencv,人工智能,计算机视觉,深度学习,c++

4. 使用亚像素精度

  • 使用 OpenCV 函数 cv::cornerSubPix 查找更精确的角位置(比整数像素更精确)。
  • 使用实例:
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;
Mat src, src_gray;
int maxCorners = 10;
int maxTrackbar = 25;
RNG rng(12345);
const char* source_window = "Image";
void goodFeaturesToTrack_Demo( int, void* );
int main( int argc, char** argv )
{
 CommandLineParser parser( argc, argv, "{@input | pic3.png | input image}" );
 src = imread( samples::findFile( parser.get<String>( "@input" ) ) );
 if( src.empty() )
 {
 cout << "Could not open or find the image!\n" << endl;
 cout << "Usage: " << argv[0] << " <Input image>" << endl;
 return -1;
 }
 cvtColor( src, src_gray, COLOR_BGR2GRAY );
 namedWindow( source_window );
 createTrackbar( "Max corners:", source_window, &maxCorners, maxTrackbar, goodFeaturesToTrack_Demo );
 imshow( source_window, src );
 goodFeaturesToTrack_Demo( 0, 0 );
 waitKey();
 return 0;
}
void goodFeaturesToTrack_Demo( int, void* )
{
 maxCorners = MAX(maxCorners, 1);
 vector<Point2f> corners;
 double qualityLevel = 0.01;
 double minDistance = 10;
 int blockSize = 3, gradientSize = 3;
 bool useHarrisDetector = false;
 double k = 0.04;
 Mat copy = src.clone();
 goodFeaturesToTrack( src_gray,
 corners,
 maxCorners,
 qualityLevel,
 minDistance,
 Mat(),
 blockSize,
 gradientSize,
 useHarrisDetector,
 k );
 cout << "** Number of corners detected: " << corners.size() << endl;
 int radius = 4;
 for( size_t i = 0; i < corners.size(); i++ )
 {
 circle( copy, corners[i], radius, Scalar(rng.uniform(0,255), rng.uniform(0, 256), rng.uniform(0, 256)), FILLED );
 }
 namedWindow( source_window );
 imshow( source_window, copy );
 Size winSize = Size( 5, 5 );
 Size zeroZone = Size( -1, -1 );
 TermCriteria criteria = TermCriteria( TermCriteria::EPS + TermCriteria::COUNT, 40, 0.001 );
 cornerSubPix( src_gray, corners, winSize, zeroZone, criteria );
 for( size_t i = 0; i < corners.size(); i++ )
 {
 cout << " -- Refined Corner [" << i << "] (" << corners[i].x << "," << corners[i].y << ")" << endl;
 }
}

Opencv之角点 Harris、Shi-Tomasi 检测详解,# C++ - opencv,opencv,人工智能,计算机视觉,深度学习,c++

参考

1. https://blog.csdn.net/fengweichangzi/article/details/119001661?spm=1001.2014.3001.5506
2. https://docs.opencv.org/4.x/d9/d97/tutorial_table_of_content_features2d.html文章来源地址https://www.toymoban.com/news/detail-566233.html

到了这里,关于Opencv之角点 Harris、Shi-Tomasi 检测详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python Opencv实践 - Harris角点检测

    参考资料:https://blog.csdn.net/wsp_1138886114/article/details/90415190  

    2024年02月09日
    浏览(46)
  • OpenCV 入门教程: Harris角点检测

    Harris 角点检测是图像处理中常用的角点检测算法,用于寻找图像中的角点特征。角点是图像中具有明显边缘变化的位置,具有独特性和不变性,常用于图像匹配、目标跟踪和特征提取等应用。本文将以 Harris 角点检测为中心,为你介绍使用 OpenCV 进行角点检测的基本原理、步

    2024年02月16日
    浏览(45)
  • opencv进阶14-Harris角点检测-cv2.cornerHarris

    类似于人的眼睛和大脑,OpenCV可以检测图像的主要特征并将这 些特征提取到所谓的图像描述符中。然后,可以将这些特征作为数据 库,支持基于图像的搜索。此外,我们可以使用关键点将图像拼接起 来,组成更大的图像。(想象一下把很多图片放到一起组成一幅360°的全景

    2024年02月11日
    浏览(88)
  • 【C++】【Opencv】cv::Canny()边缘检测函数详解和示例

    Canny边缘检测是一种流行的边缘检测算法,由John F. Canny在1986年开发。它是一种多阶段过程,包括噪声滤波、计算图像强度的梯度、非最大值抑制以及双阈值检测。本文通过函数原型解读和示例对cv::Canny()函数进行详解,以帮助大家理解和使用。 Canny边缘检测的步骤如下: (

    2024年02月04日
    浏览(59)
  • Harris角点检测

    图像特征的分类:边缘、角点、纹理。 角点检测(准确来说角点不是特征,但检测出来的角点可以用来提取和表示总结为特征)也被称为特征点检测,Harris是基于角点的特征描述子,主要用于图像特征点的匹配,属于图像的局部特征。 在局部小范围里,如果在各个方向上移

    2024年02月08日
    浏览(55)
  • 基于Python手动实现Harris角点检测

    最近在上数字图像处理课程,需要使用Python手动编写Harris角点检测算法,但是网上几乎没有找到手动编写的,只能手敲。 同时作为自己的第一篇博客,在这里记录一下。 原理(略) 可以参考博主 拾牙慧者 的博客 角点检测(Harris角点检测法)_拾牙慧者的博客-CSDN博客_harri

    2023年04月14日
    浏览(46)
  • 基于MATLAB的Harris角点检测完成图片全景拼接

    目录 作业概要 1 原理及实现 1 2.1. 模块1 Harris角点检测 1 根据角点响应函数计算每个像素点的角点响应值; 2 2.2. 模块2 关键点的描述及其匹配 3 2.2.1. 生成描述向量 3 2.2.2. 匹配描述子 4 输出matched_points和匹配点对数count; 5 2.3. 模块3 转换矩阵的估计 5 输出仿射变换矩阵H。 6 2

    2024年01月17日
    浏览(48)
  • OpenCV基本图像处理操作(十)——图像特征harris角点

    角点 角点是图像中的一个特征点,指的是两条边缘交叉的点,这样的点在图像中通常表示一个显著的几角。在计算机视觉和图像处理中,角点是重要的特征,因为它们通常是图像中信息丰富的区域,可以用于图像分析、对象识别、3D建模等多种应用。 角点的识别可以帮助在进

    2024年04月23日
    浏览(64)
  • python数字图像处理基础(八)——harris角点检测、图像尺度空间、SIFT算法

    原理 Harris 角点检测是一种用于在图像中检测角点的算法。角点是图像中局部区域的交叉点或者突出的特征点。Harris 角点检测算法旨在寻找图像中对于平移、旋转和尺度变化具有不变性的角点。 该算法通过计算图像中每个像素点的灰度值的变化,来识别角点。具体来说,Ha

    2024年01月19日
    浏览(45)
  • 模式识别与图像处理课程实验一:图像处理实验(颜色算子实验、Susan、Harris角点检测实验、 sobel边缘算子检测实验)

    要求编写一个包含颜色算子,Susan,Harris,角点,sobel边缘算子的程。 实验的程序如下 运行结果如下 实验原图 实验结果图 实验的程序如下 运行结果如下 实验原图 实验结果图 实验的程序如下 运行结果如下 实验原图 实验结果图 Susan角点检测程序如下 运行结果如下 实验原图

    2024年02月02日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包