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


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

         其中,(a)点p附近的图像是均匀的,其梯度为0;(b)边缘的梯度与沿边缘方向的q-p向量正交。在图中的两种情况下,p点梯度与q-p向量的点积均为0。
          假设起始角点q在实际亚像素级角点的附近。检测所有的q-p向量。若点p位于一个均匀的区域,则点p处的梯度为0。若q-p向量的方向与边缘的方向一致,则此边缘上p点处的梯度与q-p向量正交,在这两种情况下,p点处的梯度与q-p向量的点积为0。我们可以在p点周围找到很多组梯度以及相关的向量q-p,令其点集为0,然后可以通过求解方程组,方程组的解即为角点q的亚像素级精度的位置,也就是精确的角点位置。

    cornerSubPix()函数:寻找亚像素角点 (不是整数类型的位置,而是更精确的点类型位置)  

    1. void cornerSubPix(InputArray image, InputoutputArray corners,
    2. Size winSize, Size zeroZone, TermCriteria criteria)

    参数1,InputArray类型的image,输入图像。

    参数2,InputOutputArray类型的corners,提供输入角点的初始坐标和精确的输出坐标。

                (vector 类型

    参数3,Size类型的winSize,搜索窗口的一半尺寸。若winSize = Size(5, 5),

                 表示使用(5 * 2 + 1) × (5 * 2 + 1) = 11 × 11大小的搜索窗口。

    参数4,Size类型的zeroZone,表示死区的一半尺寸。而死区为不对搜索区的中央位置做

                求和运算的区域,用来避免自相关矩阵出现的某些可能的奇异性。

                值为(-1, -1)表示没有死区

    参数5,TermCriteria类型的criteria,求角点的迭代过程的终止条件。即角点位置的确定,

                 要么迭代数大于某个设定值,或者是精确度达到某个设定值。criteria可以是最大迭代

                 数目,或者是设定的精确度,也可以是它们的组合。

    TermCriteri迭代标注类的构造函数

    TermCriteria(int type, int maxCount, double epsilon);
    

    参数1,int类型的type,枚举为TermCriteria::Type类型,终止标准的类型

    枚举描述
    COUNT1要计算的最大迭代次数或则元素数
    MAX_ITER1要计算的最大迭代次数或则元素数
    EPS2迭代算法停止时所需的精度或者参数变化

    参数2,int类型的maxCount,最大迭代次数/元素数;

    参数3double类型的epsilon,所需的精度。

    1. TermCriteria criteria = TermCriteria(TermCriteria::EPS + TermCriteria::MAX_ITER,
    2. 40, 0.001);

    可以自己制作角点检测的函数,需要用到cornerMinEigenVal函数和 minMaxLoc函数。最后的特征点选取,判断条件要根据自己的情况编辑。如果对特征点,角点的精度要求更高,可以用cornerSubPix函数将角点定位到子像素。

  • 相关阅读:
    树莓派 交叉编译工具链的安装
    第21章 Spring事务管理之扩展篇(一)
    JVM-查看服务器JVM垃圾收集器类型
    Goland环境配置——Goland上的第一个Go语言程序
    Python 网页请求:requests库的使用
    Hive之DML操作
    仓颉语言HelloWorld内测【仅需三步】
    bp神经网络的拓扑结构,bp神经网络拓扑结构图
    GC(1):垃圾回收器基础:可达性分析、方法区的回收、垃圾回收算法和GC策略
    嵌入式Linux下运行 DotNet 应用简单示例
  • 原文地址:https://blog.csdn.net/qq_41653875/article/details/126575208