• OpenCV(四十四):亚像素级别角点位置优化


    1.角点位置亚像素位置优化原理介绍

           亚像素优化的原理在于通过对初始角点位置的微小调整,利用更精确的灰度信息,来获取更准确的角点位置。传统的角点检测算法基于像素级别的灰度变化来定位角点,而亚像素优化则进一步利用图像灰度的局部变化进行更精细的插值,提高了角点位置的准确度。

    2.优化角点亚像素位置函数cornerSubPix()

    void cv::cornerSubPix( InputArray   image,

    InputOutputArray corners,

    Size   winSize,

    Size   zeroZone,

    TermCriteria    criteria

    • image:输入图像,必须是CV 8U或者CV 32F的单通道灰度图像。
    • corners: 角点坐标,既是输入的角点坐标又是精确后的角点坐标。
    • winSize: 搜索窗口尺寸的一半,必须是整数。实际的搜索窗口尺寸比该参数的2倍大1。
    • zeroZone: 搜索区域中间死区大小的一半,即不提取像素点的区域,(-1.-1)表示没有死区。
    • criteria:终止角点优化迭代的条件。

    示例代码:

    1. void cornerSubPix_f(Mat mat){
    2. //彩色图像转成灰度图像
    3. Mat gray;
    4. cvtColor(mat,gray,COLOR_BGR2GRAY);
    5. //提取角点
    6. int maxCorners=100;//检测角点数目
    7. double quality_level=0.01;//质量等级
    8. double minDistance=0.04;//两个角点之间的最小欧式距离
    9. vector<Point2f> corners;
    10. goodFeaturesToTrack(gray,corners,maxCorners,quality_level,minDistance,Mat(),3, false);
    11. //计算亚像素级别角点坐标
    12. vector<Point2f> cornersSub=corners;//角点备份,防止被函数修改
    13. Size winSize=Size (5,5);
    14. Size zeroZone=Size(-1,-1);
    15. TermCriteria criteria = TermCriteria(TermCriteria::EPS+TermCriteria::COUNT,40,0.001);
    16. cornerSubPix(gray,cornersSub,winSize,zeroZone,criteria);
    17. //输出初始化坐标和精细坐标
    18. for(size_t i=0;i<corners.size();i++){
    19. ostringstream ss;
    20. string str= to_string(i);
    21. str="第"+str+"个角点初始坐标:";
    22. ss<<str<<corners[i]<<" 精细后坐标:"<<cornersSub[i]<<endl;
    23. LOGD("%s",ss.str().c_str());
    24. }
    25. }

  • 相关阅读:
    如何利用堆来模拟堆排序
    探索 Linux Namespace:Docker 隔离的神奇背后
    【测开求职】面试题:计算机网络 精简版整理
    TypeScript的函数和类
    如何用JAVA写一个Windows服务
    自学Python06-学会Python中的while循环语句
    qemu侧 网络包发送调试记录(二)
    spring框架源码九、spring ioc xml与注解组合模式
    11 LRU缓存----来源于陈C同学(CC)
    C++ 静态成员变量与静态成员函数
  • 原文地址:https://blog.csdn.net/weixin_63357306/article/details/132896926