python3+opencv4,相机标定

本文介绍了使用Python3和OpenCV4进行相机标定的详细步骤,包括原理、设定、寻找角点、校准、不失真处理、重映射、重投影误差计算,并提供了完整的代码示例。
摘要由CSDN通过智能技术生成

最近在做一个关于多目视觉测量的项目,现在先记录一下相机标定的方法及原理

原理部分

这一部分的内容,主要是相机标定的主要原理,具体的可以参照一下两个博主的博客:
张正友标定算法

设定

我使用的测试标定图片是opencv官方自带的图片进行标定测试。

寻找角点

在国际象棋棋盘中查找图案,我们可以使用函数cv.findChessboardCorners()。我们还需要传递所需的图案,例如8x8网格,5x5网格等。在此示例中,我们使用7x6网格。(通常,棋盘有8x8的正方形和7x7的内部角)。它返回角点和retval,如果获得图案,则为True。这些角将按顺序放置(从左到右,从上到下)。

此功能可能无法在所有图像中找到所需的图案。因此,一个不错的选择是编写代码,使它启动相机并检查每帧所需的图案。获得图案后,找到角并将其存储在列表中。另外,在阅读下一帧之前请提供一些时间间隔,以便我们可以在不同方向上调整棋盘。继续此过程,直到获得所需数量的良好图案为止。即使在此处提供的示例中,我们也不确定给出的14张图像中有多少张是好的。因此,我们必须阅读所有图像并仅拍摄好图像。
除了棋盘,我们还可以使用圆形网格。在这种情况下,我们必须使用函数cv.findCirclesGrid()来找到模式。较少的图像足以使用圆形网格执行相机校准。
找到角点后,可以使用cv.cornerSubPix()来提高其精度。我们还可以使cv.drawChessboardCorners()绘制图案。
3D 点称为 object points,2D 图像点称为 image points。

# termination criteria
criteria = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 30, 0.001)
# prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)
objp = np.zeros((6*7,3), np.float32)
objp[:,:2] = np.mgrid[0:7,0:6].T.reshape(-1,2)
# Arrays to store object points and image points from all the images.
objpoints = [] # 3d point in real world space
imgpoints = [] # 2d points in image plane.
images = glob.glob('E:/test/*.jpg')
for fname in images:
    img = cv.imread(fname)
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    # Find the chess board corners
    ret, corners = cv.findChessboardCorners(gray, (7,6), None)
    # If found, add object points, image points (after refining them)
    if ret == True:
        objpoints.append(objp)
        corners2 = cv.cornerSubPix(gray,corners, (11,11), (-1,-1), criteria)
PythonOpenCV(Open Source Computer Vision Library)结合常用于机器人视觉和机器臂应用中,包括手眼标定(Hand-Eye Calibration),这是一个关键步骤,用于同步机械臂末端执行器(如摄像头或传感器)和相机系统的位置。手眼标定有助于确保机械臂能准确地根据从摄像头捕获的图像来定位物体。 具体流程如下: 1. **安装依赖**:首先确保已安装 PythonOpenCV、NumPy 和相关库(如Scikit-image等)。 ```python pip install opencv-python numpy matplotlib ``` 2. **数据收集**:在实际环境中,让机械臂移动到固定位置,并在每个位置抓取一张目标点清晰的照片。这些照片将作为校准输入。 3. **特征检测**:使用 OpenCV 提供的关键点检测算法(如 SIFT, SURF 或 ORB)提取图像中的兴趣点。 ```python import cv2 orb = cv2.ORB_create() keypoints, descriptors = orb.detectAndCompute(image, None) ``` 4. **标记坐标**:为每个特征点标记真实世界的位置。这通常通过外部传感器(如激光测距仪或运动捕捉设备)完成。 5. **拍摄对应视图**:在相同的世界坐标系下,让机械臂模仿这些标记位置并再次拍照。 6. **匹配关键点**:通过比对两组图片的关键点描述符找到配对。 7. **拟合变换矩阵**:利用特征匹配计算出机械臂端部坐标与相机坐标之间的关系矩阵,通常是旋转和平移矩阵。 8. **验证标定结果**:在不同角度和姿态下重复上述步骤,检查校准是否稳定。 9. **保存和使用**:将校准参数存储起来,后续使用时可以通过读取参数直接调整机械臂的动作。 相关问题: 1. 手眼标定的具体应用场景有哪些? 2. 如何评估机械臂手眼标定的精度? 3. 在实际操作中如何处理手眼标定过程中可能出现的噪声或异常?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值