计算机视觉--opencv圆点提取
参考资料
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个主要的地方需要额外注意:
- 圆形格的类型和大小
- 圆形的提取方法
接下来将主要围绕这两个问题展开。
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圆点提取相关推荐
- 【计算机视觉OpenCV基础】实验四 尺寸测量
实验四 尺寸测量 计算机视觉OpenCV基础实验合辑(实验1234+扩展) 资源下载地址: https://download.csdn.net/download/weixin_53403301 合辑: ...
- 图像处理库(fbc_cv):源自OpenCV代码提取
在实际项目中会经常用到一些基本的图像处理操作,而且经常拿OpenCV进行结果对比,因此这里从OpenCV中提取了一些代码组织成fbc_cv库.项目fbc_cv所有的代码已放到GitHub中,地址为 ...
- OpenCV PCA提取对象的方向的实例(附完整代码)
OpenCV PCA提取对象的方向的实例 OpenCV PCA提取对象的方向的实例 OpenCV PCA提取对象的方向的实例 #include "opencv2/core.hpp" ...
- python图片保存为txt文件_python + opencv实现提取png图像的像素信息并存储到txt文件中(附安装指导)...
相关库安装指导: 这里我们需要 opencv_python,numpy,matplotlib库,另外我用的是python3.6.1版本. 一般库大家都是用pip install命令安装的,不过不知道为 ...
- 检测单击鼠标左键并拖动的消息_计算机视觉OpenCV学习笔记(四):关于鼠标的相关事件函数...
(7)把鼠标当画笔 本篇目标: 学会使用OpenCV中的鼠标处理的相关事件,事件回调函数怎么去定义,参数有哪些,以及如何注册鼠标监听事件. 7.1 .1 回调函数的定义: 1 def name(eve ...
- OpenCV python 提取图像内的三色
OpenCV python 提取图像内的三色 原图 [opencv.jpg] import cv2 import numpy as npdef main():# 1.导入图片img_src = cv2 ...
- 我是如何转型走上计算机视觉OpenCV开发之路的
我是如何转型走上计算机视觉OpenCV开发之路的 2004年我大学毕业,学的是软件工程专业,第一份工作是在一家日资外包企业,无法忍受学习日语,忍无可忍无须再忍,干了八个月就跳槽啦,来到了第二家公司还是 ...
- 【中英双语】计算机视觉Opencv、Python大师班
[中英双语]计算机视觉Opencv.Python大师班 使用 Opencv 和 Python 学习计算机视觉的基础知识 此教程共4.0小时,中英双语字幕,画质清晰无水印,源码附件全 课程英文名:Com ...
- OpenCV实战——提取视频中的前景对象
OpenCV实战--提取视频中的前景对象 0. 前言 1. 提取视频中的前景对象 2. 混合高斯方法 3. 完整代码 相关链接 0. 前言 当固定摄像机观察场景时,背景基本保持不变.在这种情况下,我们 ...
最新文章
- java myeclipse jar 导出问题
- dede首页调用栏目内容{dedefield.content}的方法
- 鸿蒙系统平板界面,鸿蒙OS平板UI界面曝光:双Dock栏设计+超级终端互联功能
- Java 必看的 Spring 知识汇总!
- linux终端窗口玩法
- 【转】ARM 之七 主流编译器(armcc、iar、gcc for arm、LLVM(clang))详细介绍
- for循环、while循环、break跳出循环、continue结束本次循环、exit退出脚本
- 【数据分析】基于matlab焊缝边缘检测算法对比分析 【含Matlab源码 260期】
- 推荐系统实践 - 基于用户行为分析的推荐算法
- 数据仓库与数据挖掘知识点梳理
- 22种免费网络推广方式有哪些?
- OCCT示例学习笔记3--Modeling项目
- IC设计之CDC(跨时钟域)问题
- amcharts php,分享四个amCharts使用中的问题研究
- 《大话处理器》相关主题汇总
- SQl函数: 1.取整函数
- 智能电动车骑行头盔安全帽方案/APP/PCBA/小程序/开发
- Android最牛的开源收集
- Windows系统安装了虚拟机后,网络无法修复且无网络连接如何修复?跟随作者一起来寻找问题并解决吧
- Python做数据处理(二):贷款风险预测