python使用opencv实现相机外参标定

2 篇文章 0 订阅
2 篇文章 0 订阅

一、背景介绍

        我们在根据相机拍摄的图像,计算世界坐标,指引机器人执行各种操作。前提是需要知道相机的内外参数,这篇文章主要是讲解python使用opencv实现相机外参标定的代码,如果想了解更详细的原理,可以参考其他的文章。

二、标定工具

1、棋盘格标定板,标定板的尺寸根据具体情况来定,推荐标定板在线生成网站:Camera Calibration Pattern Generator – calib.io,在这个网站设置好标定板的参数,左侧会自动生成相应的标定板,可以下载保存成PDF,自己可以打印(1:1),也可以将此文件发送给标定版制作的人。

2、因为要求取相机当前姿态,即旋转和平移向量,所以相机位置是固定的,标定板也固定在一个位置,且能出现在相机的视野范围内。一旦相机或标定板移动,就需要重新标定。

三、详细代码

1、主要用到的函数:

(1)retval, rvec, tvec = cv2.solvePnP(obj_points, img_points, mat_inter, coff_dis)

  • 函数功能:相机根据找到的标定板像素角点和真实坐标值以及相机的内参,得到相机当前姿态下的旋转和平移向量,分别为rvec、tvec;
  • 参数介绍:

        obj_points:标定板角点的世界坐标,左上角的角点为[0,0];

        img_points:检测到的标定板角点,是像素点(只需要一张带有标定板的图片);

        mat_inter:相机内参;

        coff_dis:相机的畸变系数,与mat_inter都是可以在相机标定内参时获取到。

2、执行过程:

(1)固定相机和标定版,确保相机视野范围内能看到完整的标定板,执行1的函数,得到相机的姿态数据;

(2)可以根据计算出来的外参,再经过重投影,计算误差。

3、代码

相机内参标定可参考:https://download.csdn.net/download/u012803927/88251638

本链接详细代码可参考: https://download.csdn.net/download/u012803927/88251967

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BP网络相机外参标定代码是一种用于相机标定的算法。它主要针对相机外参参数进行标定,即确定相机在世界坐标系中的位置和姿态。 以下是一种可能的BP网络相机外参标定代码的伪代码实现: 1. 导入所需的库和模块 import numpy as np import cv2 2. 定义BP网络的结构 def create_bp_network(input_size, hidden_size, output_size): model = cv2.ml.ANN_MLP_create() model.setLayerSizes(np.array([input_size, hidden_size, output_size])) model.setActivationFunction(cv2.ml.ANN_MLP_SIGMOID_SYM, 1, 1) model.setTrainMethod(cv2.ml.ANN_MLP_BACKPROP, 0.001) return model 3. 定义训练数据 def generate_training_data(image_points, world_points): training_data = [] for i in range(len(image_points)): training_data.append([image_points[i][0], image_points[i][1], world_points[i][0], world_points[i][1], world_points[i][2]]) return np.array(training_data, dtype=np.float32) 4. 进行BP网络相机外参标定 def calibrate_camera_exterior_parameters(image_points, world_points, hidden_size): num_data = len(image_points) train_data = generate_training_data(image_points, world_points) input_size = 2 output_size = 3 # 世界坐标系中的位置(x, y, z) model = create_bp_network(input_size, hidden_size, output_size) # 训练BP网络 model.train(train_data, cv2.ml.ROW_SAMPLE, np.zeros((num_data, output_size), dtype=np.float32)) # 获取标定结果 exterior_parameters = model.getLayerSizes()[0][0:2] return exterior_parameters 其中,image_points和world_points分别是图像坐标系中的特征点和世界坐标系中的特征点的集合。通过将这些特征点输入到BP网络中进行训练,可以得到相机外参标定的结果。 以上是一种可能的BP网络相机外参标定代码的伪代码实现。实际实现中可能还需要进行参数调整和优化,以及对数据进行预处理和后处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值