
双目视觉三维重建算法源代码及操作文档(Visual Studio平台开发,已整合相关文
献资料)
双目视觉三维重建就像给机器装上了人类的双眼。咱们今天直接上手一个能跑通的VS项目,掰开揉
碎看看代码怎么把两张平面图像变成三维点云。先别管那些复杂的数学公式,代码跑起来再聊原理。
打开工程看到calibration模块,这里藏着一组棋盘格标定代码:
```cpp
vector<vector<Point2f>> imagePoints;
for (int i=0; i<imageCount; i++) {
Mat view = imread(filenames[i], IMREAD_GRAYSCALE);
bool found = findChessboardCorners(view, boardSize, imagePoints[i], CALIB_CB_ADA
PTIVE_THRESH);
if(found) cornerSubPix(view, imagePoints[i], Size(11,11), Size(-1,-1), TermCrite
ria(TermCriteria::EPS+TermCriteria::MAX_ITER, 30, 0.1));
}
```
这段在干什么?其实就是在找棋盘格的角点坐标,cornerSubPix用亚像素级精度优化角点位置。注
意这里CALIB_CB_ADAPTIVE_THRESH参数特别关键——室内场景开这个能避免光照不均导致的标定翻车。
立体校正环节的remap函数是重头戏:
```cpp
initUndistortRectifyMap(cameraMatrix, distCoeffs, R, newCameraMatrix, size, CV_16SC2
, map1, map2);
remap(imgLeft, leftRemap, map1, map2, INTER_LINEAR);
```
这里生成的映射表相当于给左右眼镜头戴了隐形眼镜,把两个相机的成像平面拉到同一水平线上。
调试时如果发现校正后的图像出现大面积黑边,八成是newCameraMatrix的缩放系数没调好。
视差计算用SGBM算法实现:
```cpp
Ptr<StereoSGBM> sgbm = StereoSGBM::create(
minDisparity, numDisparities, blockSize,
P1=8*chn*blockSize*blockSize,
P2=32*chn*blockSize*blockSize);