OpenCV学习笔记:cornerSubPix与find4QuadCornerSubpix函数的区别

2023-11-17

一、cornerSubPix()函数

调用格式

void cv::cornerSubPix ( InputArray image,
InputOutputArray corners,
Size winSize,
Size zeroZone,
TermCriteria criteria 
)
image Input single-channel, 8-bit or float image.
corners Initial coordinates of the input corners and refined coordinates provided for output.
winSize Half of the side length of the search window. For example, if winSize=Size(5,5) , then a (5∗2+1)×(5∗2+1)=11×11 search window is used.
zeroZone Half of the size of the dead region in the middle of the search zone over which the summation in the formula below is not done. It is used sometimes to avoid possible singularities of the autocorrelation matrix. The value of (-1,-1) indicates that there is no such a size.
criteria Criteria for termination of the iterative process of corner refinement. That is, the process of corner position refinement stops either after criteria.maxCount iterations or when the corner position moves by less than criteria.epsilon on some iteration.

头文件

#include <opencv2/imgproc.hpp>

作用

优化角点位置,获得棋盘格上的亚像素角点。

该函数进行迭代以查找角或径向鞍点的亚像素精确位置,如下图所示。

二、find4QuadCornerSubpix()函数

格式

bool cv::find4QuadCornerSubpix ( InputArray img,
InputOutputArray corners,
Size region_size 
)

第一个参数img,为输入的Mat矩阵,最好是8位灰度图像,检测效率更高;

第二个参数corners,初始的角点坐标向量,同时作为亚像素坐标位置的输出,所以需要是浮点型数据,一般用元素是Pointf2f/Point2d的向量来表示:vector<Point2f/Point2d> iamgePointsBuf;

第三个参数region_size,角点搜索窗口的尺寸;

头文件

#include <opencv2/calib3d.hpp>

作用

查找棋盘角的亚像素精确位置。尝试近似分隔棋盘格字段(“四边形”)的线并返回这些线的交叉点。

对每个角点进行如下操作:

1. 根据输入的搜索窗口的尺寸,确定以该角点为中心的ROI区域,并计算该区域的直方图

2. 找出直方图中最大的一段segment_hist_max,据此进行图像二值化,之后进行腐蚀操作,共进行两次

3. 对两幅图使用findContours进行轮廓提取,对于轮廓根据到该角点的最小距离排序

4. 以每幅图最小的两个轮廓为研究对象,先进行多边形逼近approxPolyDP,并使用findCorner找到轮廓中到该角点最近的点

5. 对找到的四个点使用findLinesCrossPoint,获取精确的角点位置

三、总结

虽然二者的作用都是获得棋盘格上的亚像素角点,但可以明显看出二者实现的原理不同。

cornerSubPix()函数作为一个较为经典的函数,效果已经得到检验,事实上在使用 findChessboardCorners 时,就会自动使用一个 2x2 的小窗口执行cornerSubPix ,因此您已经获得了一些亚像素精度的坐标。

find4QuadCornerSubpix()函数函数作为新版本添加的函数,效果理应得到升级,但事实上,根据

opencv - find4QuadCornerSubpix vs cornerSubPix - Stack Overflow

这个问题下面的回答可以看到,find4QuadCornerSubpix的精度似乎还不如cornerSubPix。

而我的建议是,既然这是两种原理不同的方法,自然有各自的适用场景。但我也并无意探究究竟各自适合哪种场景,毕竟这仅仅是换一个函数的事,在使用时分别试试,看哪个函数得到的结果更好,即可。

四、实操

自己也试了试,运行代码如下:

提取角点:

findChessboardCorners(imageInput, board_size, image_points_buf)
Mat view_gray;
cvtColor(imageInput, view_gray, COLOR_BGR2GRAY);

find4QuadCornerSubpix() 参数如下:

find4QuadCornerSubpix(view_gray, image_points_buf, Size(5, 5));

cornerSubPix() 参数如下:

cornerSubPix(view_gray, image_points_buf, Size(5, 5), Size(-1, -1), TermCriteria(TermCriteria::COUNT + TermCriteria::EPS, 30, 0.1));

projectPoints() 重投影结果如下:

1、findChessboardCorners结果

每幅图像的标定误差:
第1幅图像的平均误差:0.0233192像素
第2幅图像的平均误差:0.0215262像素
第3幅图像的平均误差:0.0240675像素
第4幅图像的平均误差:0.0235293像素
第5幅图像的平均误差:0.027864像素
第6幅图像的平均误差:0.0261229像素
第7幅图像的平均误差:0.0240523像素
第8幅图像的平均误差:0.0237376像素
第9幅图像的平均误差:0.0231385像素
第10幅图像的平均误差:0.0239434像素
第11幅图像的平均误差:0.0230342像素
第12幅图像的平均误差:0.0199533像素
第13幅图像的平均误差:0.0305514像素
第14幅图像的平均误差:0.0211515像素
第15幅图像的平均误差:0.0282532像素
第16幅图像的平均误差:0.0230023像素
第17幅图像的平均误差:0.0251575像素
第18幅图像的平均误差:0.0227478像素
第19幅图像的平均误差:0.0208485像素
第20幅图像的平均误差:0.0239624像素
总体平均误差:0.0239981像素

2、cornerSubPix结果

每幅图像的标定误差:
第1幅图像的平均误差:0.0205961像素
第2幅图像的平均误差:0.0167655像素
第3幅图像的平均误差:0.0198881像素
第4幅图像的平均误差:0.0217979像素
第5幅图像的平均误差:0.0254504像素
第6幅图像的平均误差:0.0229617像素
第7幅图像的平均误差:0.0219139像素
第8幅图像的平均误差:0.0203488像素
第9幅图像的平均误差:0.0174941像素
第10幅图像的平均误差:0.0216017像素
第11幅图像的平均误差:0.0206446像素
第12幅图像的平均误差:0.0186505像素
第13幅图像的平均误差:0.0299463像素
第14幅图像的平均误差:0.019161像素
第15幅图像的平均误差:0.026709像素
第16幅图像的平均误差:0.0213648像素
第17幅图像的平均误差:0.0219541像素
第18幅图像的平均误差:0.0193053像素
第19幅图像的平均误差:0.019192像素
第20幅图像的平均误差:0.0224608像素
总体平均误差:0.0214103像素

3、find4QuadCornerSubpix结果

每幅图像的标定误差:
第1幅图像的平均误差:0.0431348像素
第2幅图像的平均误差:0.0437477像素
第3幅图像的平均误差:0.0461382像素
第4幅图像的平均误差:0.0461999像素
第5幅图像的平均误差:0.0491188像素
第6幅图像的平均误差:0.0451074像素
第7幅图像的平均误差:0.0496093像素
第8幅图像的平均误差:0.0388985像素
第9幅图像的平均误差:0.0455664像素
第10幅图像的平均误差:0.0462306像素
第11幅图像的平均误差:0.043354像素
第12幅图像的平均误差:0.0454551像素
第13幅图像的平均误差:0.0444246像素
第14幅图像的平均误差:0.0408052像素
第15幅图像的平均误差:0.0453343像素
第16幅图像的平均误差:0.0403672像素
第17幅图像的平均误差:0.0443846像素
第18幅图像的平均误差:0.0488975像素
第19幅图像的平均误差:0.0452479像素
第20幅图像的平均误差:0.0450223像素
总体平均误差:0.0448522像素


和链接里帖子得到的结论相仿,使用find4QuadCornerSubpix进行亚像素精确化的重投影结果竟然还不如不用。晕~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCV学习笔记:cornerSubPix与find4QuadCornerSubpix函数的区别 的相关文章

随机推荐

  • VRTK4 入门指南

    VRTK4 说明文档 VRTK Farm Yard 示例 Virtual Reality Toolkit 要求使用 Unity 2020 3 24f1 Beta 免责声明 简介 入门 下载项目 在 Unity 中打开下载的项目 使用 Uni
  • Disruptor(一)Disruptor概念和RingBuffer数据结构

    Disruptor是LMAX公司开源的一个高效的内存无锁队列 谈到并发程序设计 有几个概念是避免不了的 1 锁 锁是用来做并发最简单的方式 当然其代价也是最高的 内核态的锁的时候需要操作系统进行一次上下文切换 等待锁的线程会被挂起直至锁释放
  • Unity 3D控制角色运动的方法

    一 transform Translate 方法 1 Input GetKey KeyCode 按键 if Input GetKey KeyCode W transform Translate Vector3 forward Time de
  • Ubuntu 18.04 16.04 设置输入法切换方法 中文输入法

    新装的unbunu 18 04 16 04 也可以 默认应该有中文输入法 但是应该不太好用 我们安装一个搜狗输入法 下面的shell代码实现了更新软件 检查语言支持 然后下载搜狗输入法 并且安装 然后把fcitx设置为默认输入 然后重启系统
  • 谈一谈关于NLP的落地场景和商业价值

    欢迎大家关注微信公众号 baihuaML 白话机器学习 在这里 我们一起分享AI的故事 您可以在后台留言 关于机器学习 深度学习的问题 我们会选择其中的优质问题进行回答 本期的问题 你好 请问下nlp在现在的市场主要应用在哪些方面 什么是N
  • java调用onnx模型_微软宣布开源ONNX.js,可在浏览器上运行ONNX模型

    ONNX js是一个Java库 用于在浏览器和Node js上运行ONNX模型 ONNX js采用了WebAssembly和WebGL技术 为CPU和GPU提供优化的ONNX模型推理runtime 为何选择ONNX模型 在开放式神经网络交换
  • U盘分配单元大小建议设置多少?

    在对U盘进行格式化的时候 需要先进行单元分配 合理单元分配不仅可以提高U盘的读写速度还不会浪费储存空间 下面就来看看U盘分配单元大小设多少最佳的教程 具体解析如下 1 首先来说U盘的默认格式化的方式都是FAT32的 FAT32不支持大于4G
  • fatal error: Python.h: No such file or directory解决办法

    sudo apt get install scikit image 在安装scikit image时出现如下错误 Installing collected packages subprocess32 python dateutil back
  • Ubuntu连接不了网络的解决方法

    问题描述 突然发现Ubuntu连不上网络 右上角也没有网络图标 解决方案1 解决步骤 步骤一 sudo vim etc NetworkManager NetworkManager conf 1 将其中的managed false 改为 ma
  • python在终端输出不同颜色的打印,自定义日志和自定义log输出级别

    实现过程 终端的字符颜色是用转义序列控制的 是文本模式下的系统显示功能 和具体的语言无关 转义序列是以ESC开头 即用 033来完成 ESC的ASCII码用十进制表示是27 用八进制表示就是033 书写格式 开头部分 033 显示方式 前景
  • 关于对【Lambda表达式_java】的理解与简述

    版权声明 未经博主同意 谢绝转载 请尊重原创 博主保留追究权 https blog csdn net m0 69908381 article details 130522535 出自 进步 于辰的博客 坦白说 在我学会如何使用Lambda表
  • python获取变量名

    一 使用locals 方法 hello 123 loc locals def get variable name variable for k v in loc items if loc k variable return k print
  • lightGBM 回归模型代码

    lightGBM 回归模型代码 文章目录 lightGBM 回归模型代码 lightGBM K折验证效果 模型保存与调用 个人认为 K 折交叉验证是通过 K 次平均结果 用来评价测试模型或者该组参数的效果好坏 通过 K折交叉验证之后找出最优
  • 14.QueuedConnection和BlockingQueuedConnection连接方式源码分析

    QT信号槽直连时的时序和信号槽的连接方式已经在前面的文章中分析过了 见https blog csdn net Master Cui article details 109011425和https blog csdn net Master C
  • 微信小程序隐私指引完整填写范本

    背景 小程序提交的时候遇到了官方给的填空题 答案如下所示 建议直接crtl f搜索者看 为了分辨用户 开发者将在获取你的明示同意后 收集你的微信昵称 头像 为了显示距离 开发者将在获取你的明示同意后 收集你的位置信息 开发者收集你的地址 用
  • LabView编程基础:隧道和移位寄存器

    目录 一 隧道 二 隧道运行结果 三 移位寄存器添加方法1 从隧道替换为移位寄存器 四 移位寄存器方法1运行结果 五移位寄存器添加方法2 直接添加移位寄存器 六 移位寄存器方法2运行结果 七 切记 移位寄存器必定成对出现 否则程序会出现编译
  • 2.0 正式开始整理一下工训赛(全国大学生工程实践和创新能力大赛),智能垃圾桶的制作流程和参赛历程

    一点小说明 遗憾 致歉 首先 十分遗憾 由于第一年参赛 尤其是这个赛项 我们当时做的时候网上也完全找不到参考资料 所以最开始一抹黑 硬着头皮从头开始做 最后初赛全省第一 决赛全省第二 国赛选拔赛全省第三 赛制挺迷的 省奖只看决赛成绩 进国赛
  • 注解的增删改查

    package com kuang dao import com kuang pojo User import org apache ibatis annotations import org junit Test import java
  • JDK下载安装及环境变量配置的图文教程(详解)

    学习Java 需要下载并安装JDK Java Development Kit Java开发工具包 而为了能够快捷打开java程序 就需要按照操作系统的要求进行环境变量的配置 一 下载并安装JDK 一 下载JDK 搜索 jdk官方下载 或是直
  • OpenCV学习笔记:cornerSubPix与find4QuadCornerSubpix函数的区别

    一 cornerSubPix 函数 调用格式 void cv cornerSubPix InputArray image InputOutputArray corners Size winSize Size zeroZone TermCri