马春杰杰博客
致力于深度学习经验分享!

python-opencv进行相机标定步骤讲解(多图,附完整代码及测试图片)

最新目录

再来一个可用的,这个代码计算了反投影误差。

1 准备工作

OpenCV使用棋盘格板进行标定,如下图所示。为了标定相机,我们需要输入一系列三维点和它们对应的二维图像点。在黑白相间的棋盘格上,二维图像点很容易通过角点检测找到。而对于真实世界中的三维点呢?由于我们采集中,是将相机放在一个地方,而将棋盘格定标板进行移动变换不同的位置,然后对其进行拍摄。所以我们需要知道(X,Y,Z)的值。但是简单来说,我们定义棋盘格所在平面为XY平面,即Z=0。对于定标板来说,我们可以知道棋盘格的方块尺寸,例如30mm,这样我们就可以把棋盘格上的角点坐标定义为(0,0,0),(30,0,0),(60,0,0),···,这个结果的单位是mm。

3D点称为object points,2D图像点称为image points。

2 检测棋盘格角点

为了找到棋盘格模板,我们使用openCV中的函数cv2.findChessboardCorners()。我们也需要告诉程序我们使用的模板是什么规格的,例如8*8的棋盘格或者5*5棋盘格等,建议使用x方向和y方向个数不相等的棋盘格模板。下面实验中,我们使用的是10*7的棋盘格,每个方格边长是20mm,即含有9*6的内部角点。这个函数如果检测到模板,会返回对应的角点,并返回true。当然不一定所有的图像都能找到需要的模板,所以我们可以使用多幅图像进行定标。除了使用棋盘格,我们还可以使用圆点阵,对应的函数为cv2.findCirclesGrid()。

找到角点后,我们可以使用cv2.cornerSubPix()可以得到更为准确的角点像素坐标。我们也可以使用cv2.drawChessboardCorners()将角点绘制到图像上显示。

3 标定

通过上面的步骤,我们得到了用于标定的三维点和与其对应的图像上的二维点对。我们使用cv2.calibrateCamera()进行标定,这个函数会返回标定结果、相机的内参数矩阵、畸变系数、旋转矩阵和平移向量。

4 去畸变

第三步我们已经得到了相机内参和畸变系数,在将图像去畸变之前,我们还可以使用cv.getOptimalNewCameraMatrix()优化内参数和畸变系数,通过设定自由自由比例因子alpha。当alpha设为0的时候,将会返回一个剪裁过的将去畸变后不想要的像素去掉的内参数和畸变系数;当alpha设为1的时候,将会返回一个包含额外黑色像素点的内参数和畸变系数,并返回一个ROI用于将其剪裁掉。

然后我们就可以使用新得到的内参数矩阵和畸变系数对图像进行去畸变了。有两种方法进行去畸变:

4.1 使用cv2.undistort()

这是一个最直接的办法,只用直接调用函数就可以得到去畸变的图像,使用上面的ROI可以对其进行剪裁。代码如下:

4.2 使用remmaping

这是一个分两步的方法,首先计算一个从畸变图像到非畸变图像的映射,然后使用这个映射关系对图像进行去畸变。

代码如下:

5 反投影误差

通过反投影误差,我们可以来评估结果的好坏。越接近0,说明结果越理想。通过之前计算的内参数矩阵、畸变系数、旋转矩阵和平移向量,使用cv2.projectPoints()计算三维点到二维图像的投影,然后计算反投影得到的点与图像上检测到的点的误差,最后计算一个对于所有标定图像的平均误差,这个值就是反投影误差。

 

赞(283) 打赏
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《python-opencv进行相机标定步骤讲解(多图,附完整代码及测试图片)》
文章链接:https://www.machunjie.com/deeplearning/visual/63.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 16

  1. #10

    感谢各位大佬

    马春杰杰9个月前 (07-23)回复
  2. #9

    后续

    1111个月前 (06-09)回复
  3. #8

    1感谢代码

    感谢分享啊1年前 (2025-03-16)回复
  4. #7

    的开发商

    1231年前 (2024-12-25)回复
  5. #6

    的开发商

    说二十2年前 (2024-10-15)回复
  6. #5

    感谢021234513

    1234562年前 (2024-08-20)回复
  7. #4

    感谢分享

    12年前 (2024-06-24)回复
  8. #3

    韩信带净化

    感谢代码2年前 (2024-06-03)回复
  9. #2

    感谢楼主的代码

    sklf7年前 (2019-10-19)回复
  10. #1

    很有帮助 谢谢!

    xddpanda7年前 (2019-06-16)回复
    • 喜欢常来哦~~

      马春杰杰7年前 (2019-06-17)回复
      • 好的!最近在做HoloLens的项目,设计到这一块东西,有问题可以咨询你么?

        xddpanda7年前 (2019-06-17)回复
        • 谷歌的ar眼镜吗?我对这个不了解呢 :smile: :smile: 相机标定是之前一个项目用到的,主要用于测距。。

          马春杰杰7年前 (2019-06-17)回复
          • 为什么标定的时候,报错呢,说我的gray没有定义?

            xddpanda7年前 (2019-06-24)回复

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

:smile: :sad: :arrow: :cool: :confused: :cry: :eek: :evil: :exclaim: :idea: :lol: :mad: :mrgreen: :neutral: :question: :razz: :redface: :rolleyes: :surprised: :wink: :biggrin: :twisted: