opencv自带标定算法解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lxy_2011/article/details/67637186
                                        <div class="markdown_views prism-atom-one-dark">
                        <!-- flowchart 箭头图标 勿删 -->
                        <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg>
                        <h1 id="procedure"><a name="t0"></a>Procedure</h1>

1.Dilation of the white squares by 1 pixel, so that the black squares don’t touch.

2.Thresholding with a value beneath the medium intensity.

3.Contour extraction and approximation to a rectangle. This extract the black squares.

4.Selection of the inner corners by rejecting the points which don’t belong to the two extracted rectangles.

I noticed that this is not working very well for images taken using a camera with a flash, due to non uniform illumination. But i managed to extract the correct corners by running the contour extraction several times, using several different thresholds, even adaptive thresholding, different combinations of Dilate/Erode and rejecting duplicate rectangles prior to step 4.

Loacation of chessboard

整个棋盘定位过程是一个循环过程,先对读入的棋盘图像直方图均衡化,接着自适应(取决于flag参数)二值化,再对二值化后的图像膨胀。为了定位的鲁棒性,自适应二值化和膨胀所采用核的大小不能是唯一的,故不断的循环用不同的参数用对棋盘图像处理,膨胀所采用核的大小逐渐变大。

在每次的循环过程都需要,经过以下步骤。

1、在二值化后图像外围画一白色的矩形框(方便轮廓提取),然后进行轮廓提取cvFindContours。经过膨胀后的二值图像,每个黑色的方格已经被分开,轮廓提取后可以得到每个方格的轮廓,当然还有很多干扰轮廓。对轮廓进行多边形拟合cvApproxPoly,排除不是矩形的轮廓,利用矩形的其他性质,再排除一些干扰轮廓。这些工作主要由icvGenerateQuads函数完成。

2、寻找每个方格的相邻方格,并记相邻方格的个数,连同相邻方格的信息存在相应CvCBQuad结构体中。二值图像在膨胀后原本相邻的方格,分开了,原来相连部分有一个公共点,现在分开变成了两个点。找到相邻的方格之后,计算出原来的公共点,用公共点替代膨胀后分开的点。这主要由icvFindQuadNeighborhors函数完成。

3、对所有“方格”(包括被误判的)分类,分类的原则是类内所有方格是相邻的。由icvFindConnectedQuads函数完成。

4、根据已知所求的角点个数,判别每个类中方格是否为所求的棋盘方格,并对棋盘方格排序,即该方格位于哪行那列。在这个过程中,可以添加每类方格总缺少的方格,也可以删除每类方格中多余的方格。icvOrderFoundConnetedQuads函数完成该过程。

5、icvCleanFoundConnectedQuads函数、icvCheckQuadGroup函数根据已知棋盘的方格个数(由棋盘的角点数计算出来)确认方格位置及个数是否正确,并确定粗略强角点的位置(两个方格的相连位置)。icvCheckBoardMonotony再次检验棋盘方格是否提取正确。

6、以上如果有一步所有方格都不符合要求,则进入一个新的循环。若循环结束,还尚未找到符合要求的方格,则棋盘定位失败,退出函数。
最后,cvFindCornerSubpix()根据上步的强角点位置,确定强角点的精确位置。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: OpenCV中的9点标定算法是一种用于计算相机的内外参数的方。它根据相机的一组已知的图像点和相应的物理世界点,通过构建相机的投影矩阵来计算相机的内参矩阵和外参矩阵。以下是该算法的步骤: 1. 收集一组至少9个已知的图像点和相应的物理世界点。这些图像点和物理世界点之间应该具有已知的对应关系。 2. 根据收集到的图像点和物理世界点,使用cv2.findHomography()函数计算单应性矩阵。单应性矩阵可以将物理世界点映射到图像坐标系。 3. 将单应性矩阵分解为相机的旋转矩阵和平移矩阵。根据这两个矩阵可以计算相机的外参矩阵。 4. 使用cv2.calibrateCamera函数计算相机的内参矩阵、畸变系数和旋转平移矩阵。该函数将输入所有的图像点和物理世界点,并根据9点标定算法进行计算。 5. 根据计算得到的内外参数,可以进行相机校正和图像修正等操作。 9点标定算法通过使用最小二乘来最小化图像点和重投影点之间的误差,从而得到最佳的相机参数估计。该算法在相机标定中广泛应用,可以用于计算相机的焦距、主点和畸变系数等重要参数,为计算机视觉应用提供支持。 ### 回答2: OpenCV 9点标定算法是一种计算机视觉中常用的摄像机标定,用于确定摄像机的内外参数。该算法基于摄像机的几何特性和投影原理,通过将物体上的9个已知的二维点与其对应的三维点进行匹配,求解摄像机的内外参数矩阵。 具体步骤如下: 1. 收集标定棋盘图像。在不同的角度和位置下,拍摄多张包含标定棋盘的图像。 2. 检测角点。使用OpenCV提供的角点检测算法,找到每张图像中标定棋盘上的角点。 3. 提取角点。将每张图像中检测到的角点坐标保存下来,与标定棋盘上真实的三维坐标进行对应。 4. 根据已知的内外参数,计算像平面到物体平面的投影矩阵。 5. 使用求解器进行标定。将所有图像中的像素坐标与物体平面上的三维坐标进行匹配,使用OpenCV的求解器对内外参数矩阵进行求解。 6. 评估标定结果。使用重投影误差等指标评估标定结果的准确性。 7. 保存标定结果。将求解得到的摄像机内外参数矩阵保存下来,以备后续使用。 总的来说,OpenCV 9点标定算法通过收集多个不同角度和位置下的标定图像,找到图像中的角点,并与真实的三维坐标进行对应,最终通过求解器计算出摄像机的内外参数矩阵,用于后续的图像处理、目标检测等计算机视觉任务。 ### 回答3: OpenCV中的9点标定算法是用于相机姿态估计和相机校正的一种方。该算法使用了至少9个已知空间点和它们在图像中的对应点来计算相机的内参矩阵和外参矩阵。 首先,我们需要准备一个已知的3D棋盘格形状,并将其固定在一个平面上。然后,我们需要采集不同位置和角度下棋盘格在图像中的对应点。为了增加精度,我们最好采集至少10个不同角度下的图像。 接下来,我们将使用OpenCV的`findChessboardCorners`函数来检测图像中的棋盘格角点,并使用`cornerSubPix`函数进行子像素精确化。然后,我们使用`calibrateCamera`函数来计算摄像机的内参矩阵和畸变系数。 最后,我们使用`solvePnP`函数来计算相机在3D空间中的姿态。这个函数将根据9个或更多的已知3D点和它们在图像中的对应点,计算相机的旋转向量和平移向量。 使用这些计算得到的内参矩阵和外参矩阵,我们可以校正畸变图像,获得准确的图像尺寸和坐标。此外,我们还可以使用相机的外参矩阵来估计相机在三维空间中的位置和朝向。 总的来说,OpenCV的9点标定算法是一种常用的相机校正和姿态估计方,可以用于计算相机的内参矩阵和外参矩阵,以及校正畸变图像并估计相机在三维空间中的位置和姿态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值