双目参数文件详解 (万能P2/Pr) 1 Camera.fx /fy.cx,cy ;2 Camera.bf ; 3 P2(4)/1000 ; 4 ThDepth=50/20
a. Camera.bf中的b指基线baseline(单位:米),
f是焦距fx(x轴和y轴差距不大),bf=b*f=T(1)*Camera.fx=P2(4)/1000,
和ThDepth一起决定了深度点的范围:
bf * ThDepth / fx
即大致为b * ThDepth。
基线在双目视觉中出现的比较多,
如ORB-SLAM中的双目示例中的EuRoC.yaml中的bf为47.9,ThDepth为35,fx为435.2,
则有效深度为bf * ThDepth / fx = 47.9*35/435.3=3.85米;
KITTI.yaml中的bf为387.57,ThDepth为40,fx为721.54,
则有效深度为387.57*40/721.54=21.5米。
这里的xtion的IR基线(其实也可以不这么叫)bf为40,
ThDepth为50,fx为558.34,则有效深度为3.58米(官方为3.5米)。
Camera.bf这个参数是个大坑,其为相机的基线×相机的焦距。
orbslam的参数文件中单位是m
而opencv标定文件中的单位是mm
# stereo baseline times fx
Camera.bf: 78.9108236
-1.6275078772819168e+03* 4.8485678458503560e+02 = -7.8911e+05
intrinsics.yml
M1: !!opencv-matrix
rows: 3
cols: 3
dt: d
data: [ 4.8485678458503560e+02, 0., 3.1984271341779277e+02, 0.,
4.7849342106773673e+02, 2.4258677342694295e+02, 0., 0., 1. ]
————————————————
extrinsics.yml
T: !!opencv-matrix
rows: 3
cols: 1
dt: d
data: [ -1.6275078772819168e+03, -2.3257053592704903e+01,
2.8278971161131913e+01 ]
————————————————
LEFT.P:=P1:
RIGHT.P:=P2:
RIGHT.P: !!opencv-matrix
rows: 3
cols: 4
dt: d
data: [ 3.9018919929094244e+02, 0., 3.3265590286254883e+02,-6.3519667606988060e+05, 0., 3.9018919929094244e+02, 2.3086411857604980e+02, 0., 0., 0., 1., 0. ]
__________ ,-6.3519667606988060e+05=T[1]*P2[1]=-1.6275078772819168e+03*3.9018919929094244e+02 = -6.3504e+05
------是EROC基线吧---------------
T: !!opencv-matrix
rows: 3
cols: 1
dt: d
data: [ -1.6275078772819168e+03, -2.3257053592704903e+01,
2.8278971161131913e+01 ]
————————————————
# Close/Far threshold. Baseline times.
ThDepth: 50
双目相机标定和orbslam2双目参数详解
一,对标orb_slam2 的双目摄像机标定程序(广角、平角都可)
经实测,opencv sample里面自带的双目标定程序(stereo_clib.cpp),对平角相机效果较好,如果你是平角相机跳过本段,直接查看ORBSLAM2的双目配置参数,而stereo_clib.cpp对广角相机效果奇差。
故十里桃园综合了很多帖子,再根据经验给出下述双目代码(基于opencv342测试 opencv3 vs各版本下载地址: 链接: https://pan.baidu.com/s/1f5oAFqs-u15vkD5LNTcxtw 提取码: 2qj9),另用vs19跑程序时有无相应现象,应为vs19bug,在linux下实测可行:
这里要强调的是,双目切勿左右搞反,可对照opencv给出的左右图像来确定自己是否搞反。
再说明一点:请保证图像序号的连续,还要保证图像序列中没有找不到角点的图像。程序会有提示没有成功找到角点的图像序号,删除,重新对图像编号。保证图像序号的连续。图像序号从 1 开始 ,代码中的frameNumber 设置为 你图像序号最大值 +1,如十里桃园一共用58图像序列,则设为59.
先自行标定左右相机的单目畸变参数,填入下面代码中的初始化参数,楼主用的kalibr标定的单目,opencv也可以标定,这个自己解决。
说明一点,单目预标定没必要标的很精确,差不多就成,当然标的精确更好,畸变参数4,5个都可以,单目的所有预标定参数将在下面的代码中进行迭代优化。
修改你的棋盘信息 纵横角点数 还有每个格子的大小 单位mm
广角双目标定代码如下:
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
#include <iterator>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <opencv2/opencv.hpp>
#include "cv.h"
#include <cv.hpp>
using namespace std;
using namespace cv;
const int imageWidth = 640;
const int imageHeight = 480;
const int boardWidth = 11;
//横向的角点数目
const int boardHeight = 8;
//纵向的角点数据
const int boardCorner = boardWidth * boardHeight;
//总的角点数据
//相机标定时需要采用的图像帧数
const int squareSize = 49.27;
//标定板黑白格子的大小单位mm
const int frameNumber = 59;
//图像命名 从1 ~ 58(59-1=58)
string folder_ = "./data/";
string format_R = "R";
string format_L = "L";
//例如: R1.jpg L58.jpg 置于工程目录的 data文件夹下,
const Size boardSi