OpenCV相机标定calibrateCamera函数返回值的ret(重投影误差)

对于calibrateCamera函数返回值的ret不用太纠结和别人的对比,这个受影响的因素有挺多的。

1、拍摄环境变化

2、标板的平整程度

3、像素的大小

我用一组相机标定照片(4000,3000)像素的标定返回ret=1.2。相同的照片做了resize后是(400,300)像素,再进行标定得到的ret=0.2。这个实验得出的结论是像素越高返回的ret越大,但正向计算时却是精度较高的。

### 使用 OpenCV 实现相机标定并创建立方体投影效果 为了实现基于 OpenCV相机标定以及随后的立方体投影效果,需要遵循一系列特定的操作流程。首先,了解如何通过 `cv2.calibrateCamera` 函数获取内参矩阵和畸变系数是非常重要的[^1]。 #### 获取相机参数 在执行任何增强现实应用前,比如绘制虚拟物体(如立方体),必须先获得准确的相机内部参数(焦距、主点坐标)和外部参数(旋转和平移向量)。这可以通过拍摄棋盘格图案的照片来进行标定操作完成。一旦有了这些数据,就可以利用它们来纠正镜头失真,并计算出世界坐标系中的三维点映射到图像平面上的位置。 对于给定的一组图片,在调用了 `cv2.findChessboardCorners()` 来检测角点之后,再使用 `cv2.drawChessboardCorners()` 可视化结果以便确认检测准确性。接着就是实际的校准过程: ```python ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None) ``` 这里 `objpoints` 是已知的世界空间中的3D点位置列表;而 `imgpoints` 则是从每张照片里提取出来的对应二维图像上的特征点集合。函数返回值包括重投影误差 (`ret`) 和其他几个有用的变量——相机矩阵(`mtx`)、径向/切向畸变系数数组(`dist`)还有旋转向量(`rvecs`)与平移向量(`tvecs`)。 #### 应用无畸变变换 当拥有了上述所有必要的信息后,下一步便是消除原始捕获帧中存在的几何扭曲现象。为此目的服务的一个有效工具即为 `cv2.initUndistortRectifyMap()` 方法联合 `cv2.remap()` 或者直接采用更简便的方式 —— 调用 `cv2.undistort()`: ```python h, w = image.shape[:2] newcameramtx, roi=cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),1,(w,h)) dst = cv2.undistort(img, mtx, dist, None, newcameramtx) ``` 这段代码片段展示了怎样依据先前得到的最佳新相机矩阵(`newcameramtx`)去除输入影像内的弯曲部分。注意这里的第二个参数设置成了 1 ,意味着保留全部像素区域即使某些地方会出现黑色填充区。 #### 绘制立方体 最后一步涉及到了将一个简单的线框结构投射至场景之中。假设已经定义好了顶点座标表及其连接边的关系,则只需遍历每一个面片并将之转换成屏幕坐标的多边形即可显示出来。下面给出了一种可能的方法用于构建这样的立体图形: ```python axis = np.float32([[0,0,0], [0,3,0], [3,3,0], [3,0,0], [0,0,-3],[0,3,-3],[3,3,-3],[3,0,-3]]) def draw_cube(img, corners, imgpts): corner = tuple(corners[0].ravel()) for i in range(4): img = cv2.line(img, tuple(imgpts[i].ravel()), tuple(imgpts[(i+1)%4].ravel()), (255,0,0), 5) img = cv2.line(img, tuple(imgpts[i].ravel()), tuple(imgpts[i+4].ravel()), (0,255,0), 5) img = cv2.line(img, tuple(imgpts[i+4].ravel()), tuple(imgpts[((i+1)%4)+4].ravel()), (0,0,255), 5) return img for frame in video_frames: ret, rvecs, tvecs = cv2.solvePnP(objp, corners2, mtx, dist) imgpts, jac = cv2.projectPoints(axis, rvecs, tvecs, mtx, dist) img = draw_cube(frame.copy(), corners2, imgpts) ``` 此段脚本先是设定了八个代表正方体各个角落的空间矢量,紧接着定义了一个辅助性的绘图子程序负责渲染线条颜色各异的不同侧面。循环体内则重复着求解姿态估计问题的过程,从而能够动态更新每次迭代期间所观察到的目标方位变化情况;最终把经过处理后的每一帧画面送入可视化管道中去呈现预期的效果。
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值