OpenCV立体相机标定Stereo Calibration与校准检验Rectification详述
来源:互联网 发布:mac截图 编辑:程序博客网 时间:2024/05/18 20:53
立体相机标定与校准对于需要获取深度信息应用场景的重要性不言而喻。
双目视觉可通过两摄像头成像所产生的视差信息来确定现实世界中物体所在准确位置(三维坐标),如果双目未经过标定校准,其精度将会损失,甚至所获取深度的意义将会丧失。
双目视觉系统经过校准后,现实世界中任一点或者物体在左右视图中应位于同一水平线上,即常说的极线对齐(epipolar alignment),一旦极线对齐后,只需要在同一水平线上对左右视图中的同一物体进行搜索匹配,得到视差信息后根据三角关系便可得到该物体在三维空间中的位置(坐标)。
1. 关于立体相机标定的操作流程
前提:OpenCV stereo_calib.cpp --> VS Solution is done.
代码框架:
int main(int argc, char** argv){ Size boardSize; float squareSize; string imagelistfn; bool showRectified = true; ... vector<string> imagesname; char *filePath = ".\\calibration image pairs"; getFiles(filePath, imagesname); ... StereoCalib(imagesname, boardSize, squareSize, true, showRectified)}static void StereoCalib(const vector<string>& imagelist, Size boardSize, float squareSizeTmp, bool useCalibrated=true, bool showRectified=true);void getFiles(string path, vector<string>& files);
> 获取标定图像对前,需在合适距离处调节lens(若可调)至最佳状态,即保证此处双目设备捕捉的棋盘格角点最为清晰;且在该距离时,棋盘格所占图像面积在30%-40%为宜;
> 获取标定图像对时,保证左右图像中的棋盘格完整出现,不断移动并调整棋盘格姿态,使其尽可能多的遍历双目设备所有视场范围内的区域;由于边缘畸变较大,应该尽量多获取边缘处的图相对;
> 获取标定图像对后,筛选合适数量满足条件的图像,最终用于标定的图像对应该大于20对为宜。
注意:
> 左图中的同一目标比右图中的同一目标偏右,即左右图命名不要弄反,与人眼视觉一致;
> 标定图像格式可为 bmp/png 等;
> 标定程序需指定棋盘格参数,附件1 棋盘格宽度 -w 9 高度 -h 6,真实物理边长 -s 为打印后的方格宽度。
1-1 棋盘格标定板与角点检测(角点检测是否精确至关重要)
1-2 立体标定校准后的图像对
1-3 立体标定均方根误差以及重投影误差(一般认为小于0.3pixel时,结果可接受)
2. 关于标定结果校准检验
前提: VS Rectification Solution is done.
代码框架:
int main(){ String extrinsic_filename = "extrinsics.yml"; String intrinsic_filename = "intrinsics.yml"; ... initUndistortRectifyMap(M1, D1, R1, P1, img_size, CV_16SC2, map11, map12); initUndistortRectifyMap(M2, D2, R2, P2, img_size, CV_16SC2, map21, map22); string imagelistfn = "imageList.xml"; vector<string> imagelist; bool ok = readStringList(imagelistfn, imagelist); ... remap(imgL, rimgL, map11, map12, INTER_LINEAR); remap(imgR, rimgR, map21, map22, INTER_LINEAR);}static bool readStringList(const string& filename, vector<string> list);> 将标定好的内外参文件(intrinsics.yml extrinsics.yml)放入工程目录下;
> imageList.xml文件内放入带校准的图像名,由于左右相机参数只能校准对应相机出图,故左右图顺序应放好;
> 输出生成校准后的图像,使用画图工具打开,可观察验证同一目标点是否处于同一水平线上。
其实,通过观察内外参文件里面部分参数指标即可大致验证标定的准确性,如果已知设备图像分辨率,焦距,基线距离等,可与下述参数进行对比验证:
2-1 立体标定内参外参文件与真实参数比较(真实的焦距 f = Focal length * Pixel size)
附件1. Calibration Chessboard: Size(9, 6)
- OpenCV立体相机标定Stereo Calibration与校准检验Rectification详述
- opencv 3.0 相机校准 Calibration Calib
- Camera Calibration 相机标定:Opencv应用方法
- OpneCV_Camera Calibration and Rectification under QT creator( 相机标定及矫正 | QT creator环境 )
- Camera Calibration 相机标定
- Camera Calibration 相机标定
- Camera Calibration 相机标定
- 相机标定 Camera Calibration
- 相机标定(Camera calibration)
- 学习OpenCV进行Camera Calibration 和 Rectification
- 基于OpenCV的立体相机标定StereoCalibration与目标三维坐标定位
- opencv 相机标定与矫正
- 双目相机标定以及立体测距原理及OpenCV实现
- 双目相机标定以及立体测距原理及OpenCV实现
- 【opencv】相机模型与相机标定
- wide angle lens stereo calibration with opencv
- OpenCV-CameraClabration 相机校准
- 8.MIL中相机标定(Calibration)
- RabbitMQ消息队列(一): Detailed Introduction 详细介绍
- 比较Java不同压缩算法的性能
- css3常用属性animation-play-state的使用技巧
- 深入理解sizeof
- AsyncSocket
- OpenCV立体相机标定Stereo Calibration与校准检验Rectification详述
- Linux修改系统时间
- 21条最佳实践Mysql数据库调优和性能优化的
- QBXT DAY1
- 1038. Recover the Smallest Number (30)
- 心得 - 面向对象和面向过程的区别
- picasso使用
- SQL Server数据类型转换方法
- java.net.SocketTimeoutException: 60000 millis timeout while waiting for channel to be ready for read