双目相机标定 视差图
时间: 2024-12-29 10:25:11 浏览: 43
### 双目相机标定方法
对于双目相机系统的标定过程,主要分为几个阶段来完成整个流程。首先是获取用于标定的数据集,在此过程中需要准备棋盘格图案作为标定点,并确保该图案能够在不同位置和角度下被捕获到足够的图像样本。
#### 准备工作
为了获得高质量的结果,建议使用高分辨率的图片并保持良好的光照条件以减少噪声干扰。同时要保证两个摄像机同步采集相同视角下的画面以便后续处理步骤能顺利进行[^2]。
#### 立体校正(含消除畸变)
利用OpenCV库中的`cv::calibrateCamera()`函数分别对左、右两台摄像设备单独执行单应性变换矩阵求解操作;接着调用`cv::stereoCalibrate()`来进行联合优化得到更精确内参外参估计值。之后再通过`cv::stereoRectify()`计算新的投影矩阵(P1/P2),这一步骤会使得经过矫正后的左右图像对应像素点位于同一条扫描线上,极大简化了接下来立体匹配的任务难度[^3]。
```cpp
// C++ code snippet for stereo rectification using OpenCV
Mat R, T, E, F;
vector<Mat> rvecs, tvecs;
double rms = calibrateCamera(objectPoints, imagePointsL, imageSize,
cameraMatrixL, distCoeffsL, rvecs, tvecs);
rms = calibrateCamera(objectPoints, imagePointsR, imageSize,
cameraMatrixR, distCoeffsR, rvecs, tvecs);
stereoCalibrate(objectPoints, imagePointsL, imagePointsR,
cameraMatrixL, distCoeffsL, cameraMatrixR, distCoeffsR,
imageSize, R, T, E, F);
stereoRectify(cameraMatrixL, distCoeffsL, cameraMatrixR, distCoeffsR,
imageSize, R, T, R1, R2, P1, P2, Q);
```
### 生成视差图的方法
当完成了上述准备工作后就可以着手构建视差图了。这里推荐采用半全局块匹配算法(SGBM)因为它能在效率与准确性间取得较好平衡:
- 初始化SGBM对象时设定好各项参数如最小/最大视差范围、窗口尺寸等;
- 将之前已经过立体校正处理过的灰度化输入给sgbm.compute()方法即可输出一张表示每一对特征点之间相对位移量级的地图即为我们所说的“视差图”。
```python
import cv2 as cv
from matplotlib import pyplot as plt
# Python example of generating disparity map with SGBM
left_img = cv.imread('path_to_left_image',0)
right_img = cv.imread('path_to_right_image',0)
window_size = 3
min_disp = 16
num_disp = 192-min_disp
stereo = cv.StereoSGBM_create(minDisparity=min_disp,numDisparities=num_disp,
blockSize=16,P1=8*3*window_size**2,
P2=32*3*window_size**2,disp12MaxDiff=1,
uniquenessRatio=10,speckleWindowSize=100,
speckleRange=32)
disparity = stereo.compute(left_img,right_img).astype(np.float32)/16.0
plt.imshow(disparity,'gray')
plt.show()
```
阅读全文
相关推荐


















