本博客参考两位前辈的实验记录角点检测与FindChessboardCorners函数 和 OpenCV学习笔记(33)棋盘格角点检测练习程序,总结整理而成。

实验历程:

我在前几天的实验中,总是检测不到角点,很郁闷。来来回回测了七八组数据,都没有第一次测量的那种效果。因为标定板的原因,要贴掉一部分的标定板才可以使用。第一次做的实验图片有点暗,所以想把图片再重新拍一下,就随便贴了一下,这一随便拍就出现问题了,导致角点提取不出来,然后又以为是曝光问题,图片太暗了,导致图片角点提取不出来,又去调整曝光,拍了几组照片还是找不到角点,后来感觉是透明胶带的问题,改用纸胶带,用纸胶带可以去除透明胶带的一些问题,比如透明胶带放时间长了,拉出来透明胶带边缘有些黑边,也会影响后面的角点提取,用新的透明胶带,好好贴,应该也没啥问题。纸透明一点不会影响角点的提取,只要被纸覆盖住了,基本就不会被检测到角点。下面是我实验中因为胶带的原因检测不到的角点实验结果输出图:

透明胶带贴到内角点上,影响角点的提取

结合上面实验阐述——

反思实验拍照和贴纸注意事项:

  • 如果因为学校的标定板,不适用OpenCV算法,就需要贴掉一部分来使用,毕竟买一块新的精度高点的标定板代价还是很大的,能用学校已经有的,尽量利用已经有的资源。
  • pattern_size参数传递内点数,内点是黑色方块相互连通的位置。为了便于辨识方向,每行每列对应的角点数不能相同 。如果行列数相同,那么函数每次画出来的角点起始位置会变化,不利于标定。
  • 要学会将能提取出来角点在图片上显示出来,这样有利于找到原因,而不是去盲目的去猜测原因是啥,在这要特别感谢OpenCV学习笔记(33)棋盘格角点检测练习程序这位博主的博客。
  • 在拍摄图片的时候应注意减少干扰,例如灯光、背景、自然光等。
  • 如果需要贴纸的话,可以选择纸胶带减少反光。
  • 如果不需要贴纸,在将打印的棋盘格贴在平整的板子上时,透明胶带不要贴到内角点上,不然可能影响到角点检测,如上图中我提取不到完整的角点以及下面的原图与运行结果图中的图2。
  • 提取不到角点,和贴纸的厚度没啥关系。正常的A4纸放上去,就算能看到里面的格子的影子,但它格子的边缘,你可以试试苗一下,根本苗不清楚的,所以FindChessboardCorners函数应该也会忽略它,我猜是这样的。哈哈哈。你也可以这样想,普通的透明胶带都可以影响它提取角点,那可是透明的呀,更何况纸都把角点覆盖住了,看的非常模糊了。所以贴上的纸不会因为角点行数和列数不对的原因影响角点提取。
  • 试验表明,棋盘图像不能收到干扰,换言之就是不能干扰到程序判定棋盘内角点的Size,否则检测失败。具体参见findChessboardCorners函数学习笔记。

目的:

在研究坐标映射的相关问题时,遇到棋盘坐标匹配出错的问题。其中涉及到一个关键函数FindChessboardCorners。以下将对其做一定的介绍和分析。

函数介绍:

FindChessboardCorners是opencv的一个函数,可以用来寻找棋盘图的内角点位置。

函数形式

int cvFindChessboardCorners( const void* image, CvSize pattern_size, CvPoint2D32f* corners, int* corner_count = NULL, int flags = CV_CALIB_CB_ADAPTIVE_THRESH );

参数说明

  • Image:     输入的棋盘图,必须是8位的灰度或者彩色图像。
  • pattern_size:    棋盘图中每行和每列角点的个数。
  • Corners:     检测到的角点
  • corner_count:     输出,角点的个数。如果不是NULL,函数将检测到的角点的个数存储于此变量。
  • Flags:    各种操作标志,可以是0或者下面值的组合:
    • CV_CALIB_CB_ADAPTIVE_THRESH - 使用自适应阈值(通过平均图像亮度计算得到)将图像转换为黑白图,而不是一个固定的阈值。
    • CV_CALIB_CB_NORMALIZE_IMAGE - 在利用固定阈值或者自适应的阈值进行二值化之前,先使用cvNormalizeHist来均衡化图像亮度。
    • CV_CALIB_CB_FILTER_QUADS - 使用其他的准则(如轮廓面积,周长,方形形状)来去除在轮廓检测阶段检测到的错误方块。

补充说明

函数cvFindChessboardCorners试图确定输入图像是否是棋盘模式,并确定角点的位置。如果所有角点都被检测到且它们都被以一定顺序排布,函数返回非零值,否则在函数不能发现所有角点或者记录它们地情况下,函数返回0。例如一个正常地棋盘图右8x8个方块和7x7个内角点,内角点是黑色方块相互联通的位置。这个函数检测到地坐标只是一个大约的值,如果要精确确定它们的位置,可以使用函数cvFindCornerSubPix。

函数测试:

测试图像(左)和运行结果(右)

图像均为640*360的8*8黑白格棋盘图,7*7个内点。

  • 图1.计算机图像,成功检测出所有49个角点,顺序以行从左上到右下
  • 图2.正面实拍图像,检测出48个角点,其中正确47个,错误一个,没有标记顺序,只标记位置
  • 图3.正面实拍图像,成功检测出所有49个角点,顺序以行从左上到右下
  • 图4.侧面实拍图像,成功检测出所有49个角点,顺序以列从右上到左下

结果分析:

  • 1图与3图,角特性良好,正面拍摄,函数顺利找到角点位置
  • 2图中,未检测出的右上角两个角点可能是由于胶带干扰,角特征变的不明显。检测到的错误点是因为背景图像中有黑色物体,导致计算机误认为其为黑色方格。
  • 4图中,由于拍摄角度倾斜,棋盘图像发生变形,角点查找顺序发生变化。可以通过重新排列矩阵Corners的大小来得到1图与3图同样的效果

反思与函数应用注意事项:

  • pattern_size参数传递内点数,8*8的棋盘只有7*7内点。
  • 图像选取应注意减少干扰,例如光照与背景等。
  • Corners中的角点坐标顺序排列规律不一定是以行从左上到右下。使用坐标计算映射关系时应提高警惕,对坐标进行重新排列。

运行环境:win7 + VS2010 + OpenCV2.4.9

我是在我相机标定程序里面直接修改的,借鉴一些下面的代码和想法进行需要的修改。你们也可以根据需要进行相应的修改。

#include "opencv2/opencv.hpp"#define m 9
#define n 6using namespace std;
using namespace cv;void main()
{Mat srcimage;Mat grayimage;vector<Point2f> corners;Size PatSize;PatSize.width = m;PatSize.height = n;srcimage = imread("a111.bmp");bool ret=findChessboardCorners(srcimage, PatSize, corners);//Mat viewGray;//cvtColor(srcimage, viewGray, COLOR_BGR2GRAY);//cornerSubPix(viewGray, corners, Size(11, 11),//  Size(-1, -1), TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 30, 0.1));drawChessboardCorners(srcimage, PatSize, Mat(corners), ret);namedWindow("chessboard corners");imshow("chessboard corners", srcimage);waitKey(0);
}

运行结果:

OpenCV中角点未检测到原因与FindChessboardCorners函数相关推荐

  1. OpenCV中霍夫圆检测

    OpenCV中霍夫圆检测 在直线检测中,变换后在r−θr-\thetar−θ空间内曲线交点,然后根据阈值来得到直线.在圆中需要有三个变量圆心坐标和半径,因此变换后的空间在三维空间,根据三维空间中的曲线 ...

  2. OpenCV中的内存泄漏检测

    转自:http://chaishushan.blog.163.com/blog/static/130192897200911685559809/ 内存泄漏时程序开发中经常遇到的问题. 而且出现内存泄漏 ...

  3. OpenCV中使用YOLO对象检测

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 OpenCV在3.3.1的版本中开始正 ...

  4. OpenCV中角点检测:Harris、Shi-Tomasi、亚像素级角点检测

    1.角点的定义 角点通常被定义为两条边的交点,或者说,角点的局部邻域应该具有两个不同区域的不同方向的边界.比如,三角形有三个角,矩形有四个角,这些就是角点,也是他们叫做矩形.三角形的特征. 角点是个很 ...

  5. OpenCV中SUFR、SIFT无法使用的原因及解决办法

    在写OpenCV程序时中SUFR.SIFT无法使用,会报错,类似的报错如下: 无法解析的外部符号"public:__thiscall cv::SURF::SURF(void)" ( ...

  6. shell脚本中export命令未生效,原因详解

    1.问题发现   安装 jemalloc 后,执行 /usr/bin/jemalloc.sh 脚本生效环境变量 LD_PRELOAD.执行过后发现环境变量并未生效.过程如下: [root@10-27- ...

  7. python计算不规则图形面积_python opencv中的不规则形状检测和测量

    正如我在评论中提到的那样,对于这个问题,分水岭似乎是一个很好的方法.但是当你回答时,定义标记的前景和背景是困难的部分!我的想法是使用形态梯度沿着冰晶获得良好的边缘并从那里开始工作;形态梯度似乎很有效. ...

  8. 相机模型与标定(五)--opencv棋盘格角点检测算法

    原文: http://blog.csdn.net/b5w2p0/article/details/18446961 很简单,作者写的差不多对,不高兴改了... 刚接触图像处理是从摄像机标定开始,一直好奇 ...

  9. opencv中的侧脸检测

    opencv中的侧脸检测 opencv中的haarcascade_profileface.xml检测时只能检测右侧脸 Opencv 2.4.3以后添加了侧脸检测,要想检测侧脸只需将加载的文件改为haa ...

最新文章

  1. 第一篇博客——ACM之路!
  2. python视频课程推荐-《Python从小白到大牛》全集视频课程介绍
  3. getElementById取得文本框中的值
  4. python学习(十八) 程序打包
  5. python接口测试第二期_python2 接口测试一般方法.
  6. unity 手机 模糊效果_GUI背景模糊效果优化
  7. Nancy 寄宿OWin
  8. QTP的那些事--终极项目脚本设计思路及其测试查询功能的一些实际项目体会
  9. linux postgres恢复数据库,从纯文本格式的备份文件恢复数据库
  10. JavaScript --- 解析Cookie
  11. 【华为云技术分享】HBase与AI/用户画像/推荐系统的结合:CloudTable标签索引特性介绍
  12. JavaScript函数声明提升
  13. LeetCode 63.不同路径II(动态规划)
  14. UVa140 - Bandwidth
  15. 海马模拟器linux,Droid4X Mac版-海马玩模拟器Mac版下载 V0.8.3Beta-PC6苹果网
  16. 用计算机谈我还是从前那个少年,我还是从前那个少年是什么歌-我还是从前那个少年抖音歌曲介绍...
  17. nova组件-launch,shut off,start,lock,reboot,terminate虚拟机
  18. 联想电脑如何关闭/开启windows自动更新
  19. Eclipse中的Lua插件 LDT
  20. 《编程之道》译者序(转载) (转)

热门文章

  1. 联想笔记本那些有手写功能_Windows 8 下笔记本如何实现手写输入
  2. JVM 01 走进JVM
  3. 网络安全运维流量攻击分析需要掌握的核心能力有什么
  4. WindowsPJSIP
  5. 不花一分钱,利用免费电脑软件将视频MV变成歌曲音频MP3
  6. javascript制作省市联动等类似二级目录
  7. Android RxJava操作符的学习---功能性操作符--(有条件)网络请求轮询(结合Retrofit)
  8. [230528] 托福阅读真题|TPO66|整卷得分22/30|9:45~10:45|15:40~16:40|6月1日14:30~15:20
  9. cad自动进行桩位编号
  10. HTTP、TCP、Socket、长连接、短连接的概念和原理及其区别