手眼标定问题排查_1_棋盘格相机内参标定姿态数据

f3c9d15dd57034b085dd935d444c7302.png

之前手眼标定数据不对,要分析找问题原因,这个过程还是有意思的。正值出差,搞起来也费劲。所以只能趁有兴致的时候多看点儿。总体思路是先参考别人已经成功的。本身opencv官方是有相机标定例程的,官方出版的。

这次使用的是在网上找到的,网址如下:https://blog.youkuaiyun.com/wanggao_1990/article/details/81435660。

选择它的原因是作者放了成功的视频,是可信的。代码是Windows上的,而且是18年的,但是不过时。我改了改初步相机标定在Linux上能跑了,有些也是官方修改的。示例图片像素被修改成了640*480.

用了7张图片,数据如下:

第1幅图像的旋转向量 Rodrigues :

[-0.05149355932689637;

 0.01487833518464866;

 3.000488603770798]

第1幅图像的旋转矩阵:    

[-0.9895425854003568, -0.1403092547286335, -0.03344823936581949;

 0.1399706477971569, -0.9900796227727321, 0.01227022108394291;

 -0.03483804578936621, 0.007460134563130718, 0.9993651269470419]

第1幅图像的平移向量:

[-36.91372736334754;

 8.308291589584055;

 709.3787803956336]

第2幅图像的旋转向量 Rodrigues :

[0.488974592478346;

 -0.1205156983785633;

 -2.512690656116714]

第2幅图像的旋转矩阵:

[-0.7701657829120021, 0.5199764602562721, -0.3694173082178207;

 -0.552944861407021, -0.8329851868150883, -0.01968905254710909;

 -0.3179569893477939, 0.1891035677241178, 0.9290550003088601]

第2幅图像的平移向量:

[33.82383794619571;

 105.7304336901306;

 846.0021591946745]

第3幅图像的旋转向量 Rodrigues :

[0.2705388033740696;

 -0.238012525429542;

 -2.882226983696673]

第3幅图像的旋转矩阵:

[-0.9549559208185002, 0.217854243821622, -0.2014912349026618;

 -0.2479557639049546, -0.9588222445643874, 0.1384840874426391;

 -0.1630249319582769, 0.1822071123129372, 0.9696511949059717]

第3幅图像的平移向量:

[32.87482589341693;

 150.718281593237;

 848.4698284338133]

第4幅图像的旋转向量 Rodrigues :

[0.531753786027314;

 -0.09672356397341729;

 2.851468015231541]

第4幅图像的旋转矩阵:    

[-0.9053077298242185, -0.2449665959252231, 0.3470004051889974;

 0.2208896397791463, -0.9693015098713142, -0.1079923608383;

 0.3628025376961398, -0.02111752452346379, 0.9316267325486327]

第4幅图像的平移向量:

[247.9691901639762;

 -30.94128684871647;

 648.6082496329917]

第5幅图像的旋转向量 Rodrigues :

[0.2179153933351702;

 -0.3995323075936519;

 2.86857095888208]

第5幅图像的旋转矩阵:

[-0.9609115993395618, -0.2523799542183938, 0.1138123761434008;

 0.2116745047609584, -0.9346972419455147, -0.2855432890712913;

 0.1784455163036843, -0.250290680226351, 0.9515838234769136]

第5幅图像的平移向量:

[59.35603152374988;

 -58.21706097339221;

 603.1997234607085]

第6幅图像的旋转向量 Rodrigues :

[0.249732350410164;

 -0.130863215738389;

 3.109924503800331]

第6幅图像的旋转矩阵:

[-0.9870306747789306, -0.02553802423816023, 0.1584874012767581;

 0.01213326682036443, -0.9963089958377741, -0.08497745965249839;

 0.1600725800432881, -0.08195238941444777, 0.9836974001122236]

第6幅图像的平移向量:

[219.6055698905182;

 133.1269932588722;

 577.1780282567129]

第7幅图像的旋转向量 Rodrigues :

[0.1118561938136054;

 0.1854284835005874;

 -2.891386129713436]

第7幅图像的旋转矩阵:    

[-0.9679015456747291, 0.2439427303959619, -0.06048588403448674;

 -0.2342180543321797, -0.962774166187418, -0.1349363107060891;

 -0.09115097863061308, -0.1164381776269498, 0.9890063952703215]

第7幅图像的平移向量:

[199.3678300837788;

 94.08135932029448;

 668.0345329568327]

经过对作者代码的学习,发现之前objectPoints数据有问题;初步修改后还不对。后续将之前的的相机标定流程改成和作者一样的,显示找到的角点,继续探索。目前也算是有了排查方向。加油,奥利给!

需要Linux下原作者程序可以后台留言“官方相机标定流程”。

工程是Qt构建的。    

欢迎关注!记录学习!

e4963d111dc71dffd7e50279584efa4f.png

思考下面手眼标定的代码是否有什么问题:# 4. 手眼标定(使用OpenCV库函数) print("\n===== 步骤3:手眼标定 =====") if len(valid_robot_poses) < 3: # OpenCV建议至少3个位姿 print("有效位姿不足(需≥3),标定失败") else: # 准备OpenCV手眼标定所需的输入数据 R_gripper2base = [] # 机器人末端到基座的旋转矩阵列表 t_gripper2base = [] # 机器人末端到基座的平移向量列表 R_target2cam = [] # 标定板到相机的旋转矩阵列表 t_target2cam = [] # 标定板到相机的平移向量列表 for robot_pose, cam_pose in zip(valid_robot_poses, valid_camera_poses): # 解析机器人位姿(x,y,z,rx,ry,rz),其中旋转部分为欧拉角(单位:弧度) x, y, z, rx, ry, rz = robot_pose # 欧拉角转旋转矩阵(假设为XYZ顺序,需根据实际情况调整) R_robot = cv2.Rodrigues(np.array([rx, ry, rz]))[0] # 旋转向量→旋转矩阵 t_robot = np.array([[x], [y], [z]]) # 平移向量(单位:米) R_gripper2base.append(R_robot) t_gripper2base.append(t_robot) # 解析相机检测到的棋盘格位姿(假设[cx, cy, cz, 0,0,0],旋转部分为0) cx, cy, cz, _, _, _ = cam_pose # 棋盘格相机坐标系中默认姿态为正方向(旋转矩阵为单位矩阵) R_cam = np.eye(3) t_cam = np.array([[cx], [cy], [cz]]) # 平移向量(单位:米) R_target2cam.append(R_cam) t_target2cam.append(t_cam) # 调用OpenCV手眼标定函数(眼在手上模式:CAMERA_IN_HAND) # 若为眼在手外模式,使用CALIB_HAND_EYE_TARGET_IN_HAND R_cam2gripper, t_cam2gripper = cv2.calibrateHandEye( R_gripper2base=R_gripper2base, t_gripper2base=t_gripper2base, R_target2cam=R_target2cam, t_target2cam=t_target2cam, method=cv2.CALIB_HAND_EYE_TSAI # 可选方法:TSAI、PIpersen、HORAUD等 ) # 组合旋转矩阵和平移向量为4x4变换矩阵 X = np.eye(4) X[:3, :3] = R_cam2gripper X[:3, 3:] = t_cam2gripper print(f"手眼标定成功!相机到末端执行器的变换矩阵X:\n{X}") data_log["hand_eye_X"] = X.tolist() np.save(f"{config['save_dir']}/hand_eye_X.npy", X)
最新发布
12-19
Qt相机标定是一个涉及计算机视觉的过程,在Python中通常会结合OpenCV库和Qt框架来实现。OpenCV提供了一些用于摄像头标定的功能,而Qt则作为用户界面库,可以方便地展示和处理图像数据相机标定的主要步骤包括: 1. **拍摄棋盘图案**:你需要在一个场景中放置一个预先设计好的棋盘图案,这个图案包含一组固定的几何特征点。 2. **采集图像**:通过摄像头拍摄包含棋盘图案的多张照片。 3. **提取特征**:使用OpenCV的`findChessboardCorners`函数识别并提取图像中的角点。 4. **配准**:对每张图片中的角点进行匹配和校准,计算出相机内参矩阵和畸变系数。 5. **验证**:检查标定结果是否合理,例如通过重新检测棋盘图案并在新图像上应用内参。 在Python中,这样的过程可以用以下伪代码表示: ```python import cv2 import numpy as np from PyQt5.QtWidgets import QApplication, QLabel def calibrate_camera(images): gray_images = [cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) for img in images] pattern_size = (9, 6) # 棋盘格大小 criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) corners, _ = cv2.findChessboardCorners(gray_images[0], pattern_size, None) if corners is not None: # 标定过程... ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(prv_corners_list, gray_images, gray_image.shape[::-1], None, None) # 显示校正后的图像 corrected_img = cv2.cornerSubPix(gray_images[0], corners, (11, 11), (-1, -1), criteria) display_image(corrected_img) # 使用Qt显示校正后的图像 app = QApplication([]) label = QLabel() label.setPixmap(QPixmap.fromImage(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))) label.show()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值