《OpenCV:相机标定(自带Demo)》

 

 

测试环境


OpenCV版本:OpenCV342

VS版本:VS2015

操作系统:Windows10

代码为OpenCV自带的Demo,需要在命令行界面输入命令。

 

 测试准备


OpenCV自带相机标定Demo:calibration.cppcalibration_artificial.cpp,这两个cpp文件都位于opencv\sources\samples目录下的cpp文件夹中,官方自带的定标图片位于opencv\sources\samples目录下data文件夹中,一共28张,left和right各14张。
calibration.cpp 是通过用户输入可选参数进行摄像机标定的程序。
calibration_artificial.cpp 是程序模拟模拟摄像机标定的过程,即程序创建棋盘然后自主标定。

 

测试步骤 


1、要使用官方Demo,需要先使用imagelist_creator.cpp生成图像列表 。打开VIsual Studio 2015,新建一个空项目,然后把imagelist_creator.cpp添加到项目中,在opencv\sources\samples目录下的cpp文件夹中找到imagelist_creator.cpp,编译运行代码,生成可执行文件exe。

2、同时按WIN+R,输入cmd,打开命令行界面,进入exe所在的目录,输入以下命令,将图像文件名写入yaml文件中,系统会在exe所在的目录下自动生成imagelist.yaml文件。

opencv_相机标定 imagelist.yaml  left01.jpg left02.jpg left03.jpg left04.jpg left05.jpg left06.jpg left07.jpg left08.jpg left09.jpg left010.jpg left11.jpg left12.jpg left13.jpg left14.jpg right01.jpg right02.jpg right03.jpg right04.jpg right05.jpg right06.jpg right07.jpg right08.jpg right09.jpg right10.jpg right11.jpg right12.jpg right13.jpg right14.jpg

imagelist.yaml

3、相机标定。图像列表文件有了,就可以开始相机标定了。同样是打开VIsual Studio 2015,新建一个空项目,然后把calibration.cpp添加到项目中,在opencv\sources\samples目录下的cpp文件夹中找到calibration.cpp,编译运行代码,生成可执行文件exe,然后把imagelist.yaml和28张棋盘格图片跟可执行文件exe放在一起。同时按WIN+R,输入cmd,打开命令行界面,进入exe所在的目录,输入以下命令,开始检测棋盘格的交点,系统会自动生成out_camera_data.yml存储着相机标定参数。

opencv_相机标定2 -w=6 -h=9 -s=0.025 -op -oe imagelist.yaml

效果图

 

相关文章


1、相机标定到底在标定什么?

2、相机参数标定(camera calibration)及标定结果如何使用

<think>好的,我现在需要帮用户写一个双目相机图像校正的代码,要求消除左右拉长畸变,并进行极线矫正,还要可视化结果。首先,我得先理清楚双目相机校正的基本步骤,确保自己理解正确。 用户提到的左右拉长畸变,这可能是指图像的径向畸变或切向畸变,通常相机标定可以解决。而极线矫正属于立体校正的一部分,目的是让对应的极线在同一水平线上,方便立体匹配。 首先,我需要确定使用什么工具库。OpenCV应该是首选,因为它有丰富的计算机视觉函数。Python的话,用户可能更倾向于用cv2库。 接下来,步骤应该是这样的:相机标定获取相机参数,然后进行立体校正,最后应用校正映射并显示结果。但用户可能没有标定数据,所以可能需要提供一个示例流程,包括生成标定数据或使用虚拟数据,但实际应用中用户需要自己用棋盘格标定。 不过,用户可能希望直接看到代码结构,所以可能需要分步骤处理。首先,读取左右相机的图像,然后加载相机参数,接着进行校正,应用校正映射,最后显示结果。 需要注意的是,实际应用中,用户必须先用棋盘格进行相机标定,获取相机的内参和畸变系数,以及双目的旋转矩阵、平移向量等。然后才能进行立体校正。如果用户没有这些数据,代码可能无法直接运行,但可以作为框架参考。 所以,代码的大致结构应该是: 1. 加载左右相机的内参、畸变系数、旋转矩阵和平移向量(这部分需要用户自己提供)。 2. 进行立体校正,计算校正映射矩阵。 3. 使用重映射函数对左右图像进行校正。 4. 显示校正前后的图像对比,以及极线对齐的效果。 在写代码的时候,要使用cv2.stereoRectify来获取校正矩阵,然后cv2.initUndistortRectifyMap生成映射表,最后用cv2.remap应用映射。 可能的误区是用户可能没有标定数据,所以需要提醒用户必须先进行相机标定。此外,左右图像的拉长畸变可能在标定后通过去畸变步骤解决,而立体校正处理极线对齐。 另外,可视化部分可能需要水平排列左右图像,并绘制水平线以展示极线对齐的效果。 现在,需要考虑代码的完整性和正确性,比如参数是否正确传递,函数的使用是否正确。例如,stereoRectify需要相机矩阵、畸变系数、图像大小、R和T等参数,并返回校正变换和投影矩阵。 在测试时,如果用户没有实际数据,可能需要用虚拟数据或示例数据,比如OpenCV自带的示例数据,但用户需要替换为自己的数据。 最后,代码要包含必要的注释,解释每个步骤的作用,方便用户理解。</think>以下是一个基于OpenCV的双目相机图像校正实现方案。使用前需提前完成相机标定并获取参数(代码需要标定文件支持): ```python import cv2 import numpy as np import matplotlib.pyplot as plt # 1. 载入相机参数(需替换为实际标定数据) cameraMatrixL = np.load('cam_matrix_left.npy') # 左相机内参矩阵 distCoeffsL = np.load('dist_coeffs_left.npy') # 左相机畸变系数 cameraMatrixR = np.load('cam_matrix_right.npy') # 右相机内参矩阵 distCoeffsR = np.load('dist_coeffs_right.npy') # 右相机畸变系数 R = np.load('rotation_matrix.npy') # 相机间旋转矩阵 T = np.load('translation_vector.npy') # 相机间平移向量 # 2. 读取原始图像 imgL = cv2.imread('left_img.jpg') imgR = cv2.imread('right_img.jpg') h, w = imgL.shape[:2] # 3. 立体校正 (R1, R2, P1, P2, Q, roi1, roi2) = cv2.stereoRectify( cameraMatrix1=cameraMatrixL, cameraMatrix2=cameraMatrixR, distCoeffs1=distCoeffsL, distCoeffs2=distCoeffsR, imageSize=(w, h), R=R, T=T, flags=cv2.CALIB_ZERO_DISPARITY, alpha=0.9 ) # 4. 计算校正映射表 mapL1, mapL2 = cv2.initUndistortRectifyMap( cameraMatrixL, distCoeffsL, R1, P1, (w, h), cv2.CV_16SC2) mapR1, mapR2 = cv2.initUndistortRectifyMap( cameraMatrixR, distCoeffsR, R2, P2, (w, h), cv2.CV_16SC2) # 5. 应用校正映射 rectifiedL = cv2.remap(imgL, mapL1, mapL2, cv2.INTER_LINEAR) rectifiedR = cv2.remap(imgR, mapR1, mapR2, cv2.INTER_LINEAR) # 6. 可视化对比 plt.figure(figsize=(16, 9)) # 原始图像 plt.subplot(221) plt.imshow(cv2.cvtColor(np.hstack((imgL, imgR)), cv2.COLOR_BGR2RGB)) plt.title('原始图像') plt.axis('off') # 校正后图像 plt.subplot(222) plt.imshow(cv2.cvtColor(np.hstack((rectifiedL, rectifiedR)), cv2.COLOR_BGR2RGB)) plt.title('校正后图像') plt.axis('off') # 极线对齐验证(绘制水平线) demo_img = rectifiedL.copy() for y in range(50, h, 50): cv2.line(demo_img, (0, y), (w, y), (0, 255, 0), 1) plt.subplot(212) plt.imshow(cv2.cvtColor(np.hstack((demo_img, rectifiedR)), cv2.COLOR_BGR2RGB)) plt.title('极线对齐验证(绿色为参考线)') plt.axis('off') plt.tight_layout() plt.show() ``` 实施步骤说明: 1. **标定准备**: - 使用棋盘格标定板获取相机参数 - 保存为`.npy`文件:相机内参矩阵、畸变系数、相机间旋转矩阵和平移向量 2. **畸变校正**: - `stereoRectify`计算校正参数 - `initUndistortRectifyMap`生成映射表 - `remap`应用几何变换消除畸变 3. **极线矫正**: - 使对应点位于同一水平线上 - 通过绘制水平线验证对齐效果 关键参数说明: - `alpha=0.9`:控制校正后图像的有效区域占比(0-1) - `cv2.CV_16SC2`:优化映射表存储格式 - `INTER_LINEAR`:保持图像插值质量 实际应用时需: 1. 替换标定文件路径 2. 调整`stereoRectify`参数适配硬件 3. 优化图像处理流水线实现实时处理 建议通过棋盘格标定获取准确的相机参数(可使用OpenCV的`cv2.calibrateCamera`和`cv2.stereoCalibrate`函数生成所需数据)。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值