转自https://blog.csdn.net/guduruyu/article/details/69537083
cv::goodFeaturesToTrack()提取到的角点只能达到像素级别,在很多情况下并不能满足实际的需求,这时,我们则需要使用cv::cornerSubPix()对检测到的角点作进一步的优化计算,可使角点的精度达到亚像素级别。

具体调用形式如下:
    void cv::cornerSubPix(
        cv::InputArray image, // 输入图像
        cv::InputOutputArray corners, // 角点(既作为输入也作为输出)
        cv::Size winSize, // 区域大小为 NXN; N=(winSize*2+1)
        cv::Size zeroZone, // 类似于winSize,但是总具有较小的范围,Size(-1,-1)表示忽略
        cv::TermCriteria criteria // 停止优化的标准
    );

第一个参数是输入图像,和cv::goodFeaturesToTrack()中的输入图像是同一个图像。
第二个参数是检测到的角点,即是输入也是输出。

第三个参数是计算亚像素角点时考虑的区域的大小,大小为NXN; N=(winSize*2+1)。

第四个参数作用类似于winSize,但是总是具有较小的范围,通常忽略(即Size(-1, -1))。

第五个参数用于表示计算亚像素时停止迭代的标准,可选的值有cv::TermCriteria::MAX_ITER 、cv::TermCriteria::EPS(可以是两者其一,或两者均选),前者表示迭代次数达到了最大次数时停止,后者表示角点位置变化的最小值已经达到最小时停止迭代。二者均使用cv::TermCriteria()构造函数进行指定。

下面就通过一个示例看看cv::cornerSubPix()亚像素角点检测的具体效果。

cv::Mat image_color = cv::imread("image.jpg", cv::IMREAD_COLOR);
 
    //用于绘制亚像素角点
    cv::Mat image_copy = image_color.clone();
    //使用灰度图像进行角点检测
    cv::Mat image_gray;
    cv::cvtColor(image_color, image_gray, cv::COLOR_BGR2GRAY);
 
    //设置角点检测参数
    std::vector<cv::Point2f> corners;
    int max_corners = 100;
    double quality_level = 0.01;
    double min_distance = 10;
    int block_size = 3;
    bool use_harris = false;
    double k = 0.04;
 
    //角点检测
    cv::goodFeaturesToTrack(image_gray,
        corners,
        max_corners,
        quality_level,
        min_distance,
        cv::Mat(),
        block_size,
        use_harris,
        k);
 
    //将检测到的角点绘制到原图上
    for (int i = 0; i < corners.size(); i++)
    {
        cv::circle(image_color, corners[i], 5, cv::Scalar(0, 0, 255), 2, 8, 0);
    }
 
    //指定亚像素计算迭代标注
    cv::TermCriteria criteria = cv::TermCriteria(
                    cv::TermCriteria::MAX_ITER + cv::TermCriteria::EPS,
                    40,
                    0.01);
 
    //亚像素检测
    cv::cornerSubPix(image_gray, corners, cv::Size(5, 5), cv::Size(-1, -1), criteria);
 
    //将检测到的亚像素角点绘制到原图上
    for (int i = 0; i < corners.size(); i++)
    {
        cv::circle(image_copy, corners[i], 5, cv::Scalar(0, 255, 0), 2, 8, 0);
    }
 
    cv::imshow("corner", image_color);
    cv::imshow("sub pixel corner", image_copy);
 
    cv::imwrite("corner.jpg", image_color);
    cv::imwrite("corner_sub.jpg", image_copy);
    cv::waitKey(0);
    return;

直接角点检测和亚像素角点检测的结果分别如下,从检测的效果来看,使用亚像素角点检测后角点的精细度确实得到了显著的提升。

cv::cornerSubPix()亚像素角点检测相关推荐

  1. OpenCV——Harris、Shi Tomas、自定义、亚像素角点检测

    在图像处理和与计算机视觉领域,兴趣点(interest points),或称作关键点(keypoints).特征点(feature points) 被大量用于解决物体识别,图像识别.图像匹配.视觉跟踪 ...

  2. OpenCV亚像素角点检测

    前言 我在做围棋盘的的四个角点检测时,试了几种角点检测,用来得到棋盘四个角的初始点,试了几种角点检测的方法,但在我所使用的环境下,亚像素的角点检测得到的结果比较理想. 代码 //亚像素角点检测 voi ...

  3. 《opencv学习笔记》-- 亚像素角点检测

    亚像素级角点检测的位置在摄像机标定.跟踪并重建摄像机的轨迹,或者重建被跟踪目标的三维结构时,是一个基本的测测量值. 将所求得的角点位置精确到亚像素级精度 .一个向量和与其正交的向量的点积为0,角点则满 ...

  4. OpenCV开发笔记(六十二):红胖子8分钟带你深入了解亚像素角点检测(图文并茂+浅显易懂+程序源码)

    若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/ ...

  5. 图像处理之角点检测与亚像素角点定位

    图像处理之角点检测与亚像素角点定位 角点是图像中亮度变化最强地方反映了图像的本质特征,提取图像中的角点可以有效提高图像处理速度与精准度.所以对于整张图像来说特别重要,角点检测与提取的越准确图像处理与分 ...

  6. opencv3/C++ Harris角点、Shi-Tomasi角点亚像素角点

    角点检测在图像匹配.目标识别.目标跟踪.运动估计与三维重建等CV领域起着非常重要的作用. 角点定义 关于角点的定义有以下几种: 1.角点是两条及两条以上的边缘的交点: 2.角点处的一阶导数最大,二阶导 ...

  7. opencv亚像素边缘精度_OpenCV亚像素角点cornerSubPixel()源代码分析

    上一篇博客中讲到了goodFeatureToTrack()这个API函数能够获取图像中的强角点.但是获取的角点坐标是整数,但是通常情况下,角点的真实位置并不一定在整数像素位置,因此为了获取更为精确的角 ...

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

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

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

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

最新文章

  1. pandas 修改 DataFrame 列名
  2. classpath详解
  3. 如何在fluid中添加自定义控件
  4. 开源的13个Spring Boot 优秀学习项目!超53K星,一网打尽!
  5. c语言查找星期几,新手做的日历表及查找日期是星期几
  6. SDNU 1280.就问你慌不慌(高精度)
  7. 两路语音 两路计算机数据综合,脉冲编码调制解调实验摘要.doc
  8. thinking in java -- notes-2
  9. c#异常处理_C#异常处理能力问题和解答 套装4
  10. Git检出指定的目录-稀疏检出
  11. 【Vue】—异步组件
  12. 怎么实现单点登录?面试必问!
  13. CF 504E Misha and LCP on Tree——后缀数组+树链剖分
  14. 30种EMC标准电路分享,再不收藏就晚了!
  15. ISO26262功能安全--产品开发过程
  16. python爬虫-scrapy基于selenium进行网页截图
  17. Guitar Pro8.0吉他打谱作曲中文版有哪些新功能?
  18. A - Multiplication Dilemma (思维)( 2018 ACM ICPC Arabella Collegiate Programming Contest)
  19. x77.be/bbs/index.php,试驾体验东风风行CM7 视频体验/外观内饰空间一览
  20. dok_matrix

热门文章

  1. Postgresql:本地化支持
  2. 背景图片,颜色变化脚本
  3. [转载] python学习笔记(三)- numpy基础:array及matrix详解
  4. leecode第三十题(串联所有单词的子串)
  5. 数据结构之链表及实现
  6. centos7-每天定时备份 mysql数据库
  7. mysql慢查询日志分析工具(python写的)
  8. 再谈System.arraycopy和Arrays.copyOf
  9. java 同步块(Java Synchronized Blocks)
  10. DotNetBar 教程