关于用OpenCV的CalibrateCamera标定相机的内参和外参的一些问题的探讨

最近尝试用OpenCV来标定工业相机,先下载了OpenCV自带的的标定的例程camera_calibration.cpp,建立了一个同名的win32空项目,把代码拷进去,然后设置项目的include属性,lib库,反正是项目编译成功了!借鉴博文https://blog.csdn.net/App_12062011/article/details/52045531 很快就实现了对棋盘标定图案,以及对不对称圆图案,和对称圆的标定图案三种标定图案的标定,但后面反复试验我发现了两个让我非常疑惑的问题:

第一:每次标定处理的内参矩阵cameraMatrix, 和畸变系数的distCoeffs的值都不一样,而且相差的非常巨大;

第二:如果是棋盘标定图还好,如果是圆形的标定图案当标定图像与图像平面成角度放置时用findCirclesGrid函数找到圆点中心的成功率就非常的低。

         这就使我对OpenCV对相机标定的准确性发生了很大的怀疑,理论上,

相机内参数是与相机自身特性相关的参数,比如相机的焦距、像素大小等;

相机外参数是在世界坐标系中的参数,比如相机的位置、旋转方向等

这两个参数如果相机的安装位置确定,焦距不变,就应该是基本恒定的,但实际我用同样的拍摄条件下拍摄不同的标定板得到的这两个参数完全不同,大小值和正负都不同,这也太离谱了。我用同样的标定图像反复标定,得到的值大小和正负也不同。不知道有没有发现和我一样情况的,如果有的话希望可以一起探讨一样原因。

    

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
相机标定是用于确定相机内参外参的过程,它是计算机视觉和机器人视觉中的重要步骤。在Python中,我们可以使用OpenCV库来进行相机标定。 以下是相机标定的大致步骤: 1. 收集相机标定所需的图像数据,这些图像应该包括不同位置和角度下的棋盘格图像。 2. 使用OpenCV中的findChessboardCorners函数来检测每个棋盘格角点的位置。 3. 使用calibrateCamera函数来计算相机内参和畸变系数。该函数需要输入棋盘格图像的坐标和实际世界坐标。 4. 使用solvePnP函数来计算每个棋盘格图像的外参。该函数需要输入棋盘格图像的坐标和实际世界坐标。 下面是一个示例代码,用于标定相机并获取内参外参: ```python import cv2 import numpy as np # 收集相机标定所需的图像数据 images = [...] # 棋盘格图像列表 objpoints = [] # 实际世界坐标列表 imgpoints = [] # 图像坐标列表 # 设置棋盘格的大小 pattern_size = (9, 6) # 遍历每张图像 for img in images: # 寻找棋盘格的角点 ret, corners = cv2.findChessboardCorners(img, pattern_size, None) # 如果找到棋盘格 if ret == True: objpoints.append(...) # 将实际世界坐标添加到列表中 imgpoints.append(corners) # 将图像坐标添加到列表中 # 计算相机内参和畸变系数 ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, img.shape[::-1], None, None) # 计算每张棋盘格图像的外参 rmatrices = [] for i in range(len(objpoints)): ret, rmat, tvec = cv2.solvePnP(objpoints[i], imgpoints[i], mtx, dist) rmatrices.append(rmat) ``` 在上面的代码中,我们首先使用findChessboardCorners函数来检测每张棋盘格图像中的角点位置,并将它们存储在imgpoints列表中。然后,我们构建一个实际世界坐标列表objpoints,该列表包含每个棋盘格的实际世界坐标。接下来,我们使用calibrateCamera函数计算相机内参和畸变系数。最后,我们使用solvePnP函数来计算每个棋盘格图像的外参,将结果存储在rmatrices列表中。 通过运行上面的代码,我们可以得到相机内参矩阵mtx和畸变系数dist,以及每个棋盘格图像的旋转矩阵rmatrices和平移向量tvecs。这些数可以在后续的计算机视觉和机器人视觉应用中使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值