参考资料

https://blog.csdn.net/app_12062011/article/details/51953030
https://blog.csdn.net/gggttt222/article/details/92976511
https://blog.csdn.net/Ketal_N/article/details/88829741
https://docs.opencv.org/3.4.11/d9/d0c/group__calib3d.html#gad1205c4b803a21597c7d6035f5efd775


结论

本次博客就是一个缝合怪,把自己看到的与opencv圆点棋盘相关的资料整理一下。当然也会在其中加入一些自己的理解,不然就是真的缝合怪了。
本博客将简单介绍一下findCirclesGrid使用的一些注意事项和技巧。


findCirclesGrid

1 opencv api介绍

首先来看一下opencv api的,毕竟这是最权威的材料。

bool cv::findCirclesGrid (   InputArray  image, #输入图片,可以是单通道也可以是三通道Size   patternSize, # 棋盘格的大小,分别是每行有几个圆和每列有几个圆,后边会举例子OutputArray  centers, # 输出的圆心列表int   flags, # 共有三个参数,CALIB_CB_SYMMETRIC_GRID 表示棋盘格是对称的,CALIB_CB_ASYMMETRIC_GRID表示棋盘格是不对称的,CALIB_CB_CLUSTERING是一个特殊参数,在仿射变换比较严重时可以使用const Ptr< FeatureDetector > &  blobDetector, # 圆提取方法CirclesGridFinderParameters    parameters  # 一些额外参数,但是文档里未介绍如何使用
)

根据以上api,不难发现一共有2个主要的地方需要额外注意:

  1. 圆形格的类型和大小
  2. 圆形的提取方法

接下来将主要围绕这两个问题展开。

2 圆形格的类型和大小

首先展示两种常用的圆形格,如下图所示(来源于参考资料);其中第一种时非对称圆形格(对应CALIB_CB_ASYMMETRIC_GRID),图中也已经展示了如何读取其大小;第二种时对称圆形格(对应CALIB_CB_SYMMETRIC_GRID ),此时大小就很明显了,7*7。通常情况下,对称和非对称并没有太大的区别,但是明显发现对称圆形格旋转后可能还是一样的,此时可能会对后方交会等等操作带来一些误解,因此通常而言都推荐使用非对称;除非本身旋转角度不大,那就无所谓。

另外需要额外注意的时,findCirclesGrid最终需要输出的时grid。一般情况下,当影像的倾角比较大的时候,可能会难以寻找grid。此时可以利用CALIB_CB_CLUSTERING。
CALIB_CB_CLUSTERING 会以层次Kmean方式聚类检测值,并计算检测点围成的凸包角点,并排序外部角点。同时,会根据排序后的2D外部角点和理想估计点,计算单应性H,再计算出所有监测点的投影点,再根据Knn选取跟理想估计点近似最近点,作为实际输出的圆形中点。(来源参考文献

3 圆形的提取方法

通常,如果不加以特殊说明,findCirclesGrid提取圆形的时候使用默认const Ptr<FeatureDetector> &blobDetector = SimpleBlobDetector::create(),其默认参数列表如下:

 // 参考:https://blog.csdn.net/app_12062011/article/details/51953030thresholdStep = 10;    //二值化的阈值步长minThreshold = 50;   //二值化的起始阈值maxThreshold = 220;    //二值化的终止阈值 //重复的最小次数,只有属于灰度图像斑点的那些二值图像斑点数量大于该值时,该灰度图像斑点才被认为是特征点  minRepeatability = 2;     //最小的斑点距离,不同二值图像的斑点间距离小于该值时,被认为是同一个位置的斑点,否则是不同位置上的斑点  minDistBetweenBlobs = 10;  filterByColor = true;    //斑点颜色的限制变量  blobColor = 0;    //表示只提取黑色斑点;如果该变量为255,表示只提取白色斑点  filterByArea = true;    //斑点面积的限制变量  minArea = 25;    //斑点的最小面积  maxArea = 5000;    //斑点的最大面积  filterByCircularity = false;    //斑点圆度的限制变量,默认是不限制  minCircularity = 0.8f;    //斑点的最小圆度  //斑点的最大圆度,所能表示的float类型的最大值  maxCircularity = std::numeric_limits<float>::max();  filterByInertia = true;    //斑点惯性率的限制变量  //minInertiaRatio = 0.6;  minInertiaRatio = 0.1f;    //斑点的最小惯性率  maxInertiaRatio = std::numeric_limits<float>::max();    //斑点的最大惯性率  filterByConvexity = true;    //斑点凸度的限制变量  //minConvexity = 0.8;  minConvexity = 0.95f;    //斑点的最小凸度  maxConvexity = std::numeric_limits<float>::max();    //斑点的最大凸度

单纯看以上参数,不难发现几个参数设置其实不一定总是合理。包括:手工设定阈值进行二值分割,以及手工设定阈值确定圆形的大小等等。

额外资料整理

博主gggttt222分享了一些有意思的东西,即圆形经过仿射变换时会变成椭圆,进而干扰标定精度。参考一下,我列出了一些论文,有空可以看看:

Accurate calibration method for a structured light system
《光栅投影 三维精密测量》(达飞鹏)
Geometric Correction of Circular Fiducials
Valication Code for Circular Correction
https://github.com/opencv/opencv/wiki/GSoC_2019#for-students-interested-in-applying

计算机视觉--opencv圆点提取相关推荐

  1. 【计算机视觉OpenCV基础】实验四 尺寸测量

    实验四 尺寸测量 计算机视觉OpenCV基础实验合辑(实验1234+扩展) 资源下载地址: https://download.csdn.net/download/weixin_53403301 合辑: ...

  2. 图像处理库(fbc_cv):源自OpenCV代码提取

    在实际项目中会经常用到一些基本的图像处理操作,而且经常拿OpenCV进行结果对比,因此这里从OpenCV中提取了一些代码组织成fbc_cv库.项目fbc_cv所有的代码已放到GitHub中,地址为   ...

  3. OpenCV PCA提取对象的方向的实例(附完整代码)

    OpenCV PCA提取对象的方向的实例 OpenCV PCA提取对象的方向的实例 OpenCV PCA提取对象的方向的实例 #include "opencv2/core.hpp" ...

  4. python图片保存为txt文件_python + opencv实现提取png图像的像素信息并存储到txt文件中(附安装指导)...

    相关库安装指导: 这里我们需要 opencv_python,numpy,matplotlib库,另外我用的是python3.6.1版本. 一般库大家都是用pip install命令安装的,不过不知道为 ...

  5. 检测单击鼠标左键并拖动的消息_计算机视觉OpenCV学习笔记(四):关于鼠标的相关事件函数...

    (7)把鼠标当画笔 本篇目标: 学会使用OpenCV中的鼠标处理的相关事件,事件回调函数怎么去定义,参数有哪些,以及如何注册鼠标监听事件. 7.1 .1 回调函数的定义: 1 def name(eve ...

  6. OpenCV python 提取图像内的三色

    OpenCV python 提取图像内的三色 原图 [opencv.jpg] import cv2 import numpy as npdef main():# 1.导入图片img_src = cv2 ...

  7. 我是如何转型走上计算机视觉OpenCV开发之路的

    我是如何转型走上计算机视觉OpenCV开发之路的 2004年我大学毕业,学的是软件工程专业,第一份工作是在一家日资外包企业,无法忍受学习日语,忍无可忍无须再忍,干了八个月就跳槽啦,来到了第二家公司还是 ...

  8. 【中英双语】计算机视觉Opencv、Python大师班

    [中英双语]计算机视觉Opencv.Python大师班 使用 Opencv 和 Python 学习计算机视觉的基础知识 此教程共4.0小时,中英双语字幕,画质清晰无水印,源码附件全 课程英文名:Com ...

  9. OpenCV实战——提取视频中的前景对象

    OpenCV实战--提取视频中的前景对象 0. 前言 1. 提取视频中的前景对象 2. 混合高斯方法 3. 完整代码 相关链接 0. 前言 当固定摄像机观察场景时,背景基本保持不变.在这种情况下,我们 ...

最新文章

  1. java myeclipse jar 导出问题
  2. dede首页调用栏目内容{dedefield.content}的方法
  3. 鸿蒙系统平板界面,鸿蒙OS平板UI界面曝光:双Dock栏设计+超级终端互联功能
  4. Java 必看的 Spring 知识汇总!
  5. linux终端窗口玩法
  6. 【转】ARM 之七 主流编译器(armcc、iar、gcc for arm、LLVM(clang))详细介绍
  7. for循环、while循环、break跳出循环、continue结束本次循环、exit退出脚本
  8. 【数据分析】基于matlab焊缝边缘检测算法对比分析 【含Matlab源码 260期】
  9. 推荐系统实践 - 基于用户行为分析的推荐算法
  10. 数据仓库与数据挖掘知识点梳理
  11. 22种免费网络推广方式有哪些?
  12. OCCT示例学习笔记3--Modeling项目
  13. IC设计之CDC(跨时钟域)问题
  14. amcharts php,分享四个amCharts使用中的问题研究
  15. 《大话处理器》相关主题汇总
  16. SQl函数: 1.取整函数
  17. 智能电动车骑行头盔安全帽方案/APP/PCBA/小程序/开发
  18. Android最牛的开源收集
  19. Windows系统安装了虚拟机后,网络无法修复且无网络连接如何修复?跟随作者一起来寻找问题并解决吧
  20. Python做数据处理(二):贷款风险预测

热门文章

  1. Go语言-Go interface 接口的最佳实践
  2. Celeb数据集的介绍和使用
  3. 一系列有用的Python技巧
  4. php开发自动拨号,使用Asterisk manager API实现自动拨号
  5. PHP对接阿里云视频点播
  6. Win10安装you-get步骤+视频下载初步使用
  7. 抓住机遇 扶摇直上三千尺:中国企业软件的大风口
  8. 乐高大颗粒作品8:抽油机的搭建
  9. php 掷,jQuery+PHP实现的掷色子抽奖游戏实例
  10. element做树形下拉_一个基于 elementUi的vue树形下拉框组件