您的位置:首页 > 其它

3D Camera->双目标定关键函数解析

2017-09-13 11:08 691 查看
//标定一个立体摄像头的,也就是同时标定两个摄像头。标定的结果除了能够求出
//两个摄像头的内外参数矩阵,跟能够得出两个摄像头的位置关系R,T。
//R-输出型,第一和第二个摄像机之间的旋转矩阵
//T-输出型,第一和第二个摄像机之间的平移矩阵
//E-输出型,基本矩阵
//F-输出型,基础矩阵
// CV_CALIB_FIX_INTRINSIC 如果该标志被设置,那么就会固定输入的cameraMatrix和distCoeffs不变,只求解R,T,E,F
// CV_CALIB_USE_INTRINSIC_GUESS 根据用户提供的cameraMatrix和distCoeffs为初始值开始迭代
// CV_CALIB_FIX_PRINCIPAL_POINT 迭代过程中不会改变主点的位置
// CV_CALIB_FIX_FOCAL_LENGTH 迭代过程中不会改变焦距
// CV_CALIB_SAME_FOCAL_LENGTH 强制保持两个摄像机的焦距相同
// CV_CALIB_ZERO_TANGENT_DIST 切向畸变保持为零
// CV_CALIB_FIX_K1,...,CV_CALIB_FIX_K6 迭代过程中不改变相应的值。如果设置了 CV_CALIB_USE_INTRINSIC_GUESS 将会使用用户提供的初始值,否则设置为零
// CV_CALIB_RATIONAL_MODEL 畸变模型的选择,如果设置了该参数,将会使用更精确的畸变模型,distCoeffs的长度就会变成8
double rms = stereoCalibrate(objectPoints, imagePoints[0], imagePoints[1],
cameraMatrix[0], distCoeffs[0],
cameraMatrix[1], distCoeffs[1],
imageSize, R, T, E, F,
TermCriteria(CV_TERMCRIT_ITER + CV_TERMCRIT_EPS, 100, 1e-5),
CV_CALIB_FIX_INTRINSIC
);

//为每个摄像头计算立体校正的映射矩阵。所以其运行结果并
//不是直接将图片进行立体矫正,而是得出进行立体矫正所需要的映射矩阵。
//R1-输出矩阵,第一个摄像机的校正变换矩阵(旋转变换)
//R2-输出矩阵,第二个摄像机的校正变换矩阵(旋转矩阵)
//P1-输出矩阵,第一个摄像机在新坐标系下的投影矩阵
//P2-输出矩阵,第二个摄像机在想坐标系下的投影矩阵
//Q-4*4的深度差异映射矩阵
//flags-可选的标志有两种零或者 CV_CALIB_ZERO_DISPARITY ,如果设置 CV_CALIB_ZERO_DISPARITY 的话,该函数会让两幅校正后的图像的主点有相同的像素坐标。否则该函数会水平或垂直的移动图像,以使得其有用的范围最大
//alpha-拉伸参数。如果设置为负或忽略,将不进行拉伸。如果设置为0,那么校正后图像只有有效的部分会被显示(没有黑色的部分),如果设置为1,那么就会显示整个图像。设置为0~1之间的某个值,其效果也居于两者之间。
//newImageSize-校正后的图像分辨率,默认为原分辨率大小。
//validPixROI1-可选的输出参数,Rect型数据。其内部的所有像素都有效
//validPixROI2-可选的输出参数,Rect型数据。其内部的所有像素都有效
stereoRectify(cameraMatrix[0], distCoeffs[0],
cameraMatrix[1], distCoeffs[1],
imageSize, R, T, R1, R2, P1, P2, Q,
0, 0.9, cv::Size(0,0), &validRoi[0], &validRoi[1]);

//该函数功能是计算畸变矫正和立体校正的映射变换
//cameraMatrix-摄像机参数矩阵
//distCoeffs-畸变参数矩阵
//R- stereoCalibrate() 求得的R矩阵
//newCameraMatrix-矫正后的摄像机矩阵(可省略)
//Size-没有矫正图像的分辨率
//m1type-第一个输出映射的数据类型,可以为 CV_32FC1 或 CV_16SC2
//map1-输出的第一个映射变换
//map2-输出的第二个映射变换
initUndistortRectifyMap(cameraMatrix[0], distCoeffs[0], R1, P1,
cv::Size(2000, 2000), CV_32FC1, rmap[0][0], rmap[0][1]);

//几何变换函数
//src-原图像
//dst-几何变换后的图像
//map1-第一个映射,无论是点(x,y)或者单纯x的值都需要是CV_16SC2 ,CV_32FC1 , 或 CV_32FC2类型
//map2-第二个映射,y需要是CV_16UC1 , CV_32FC1类型。或者当map1是点(x,y)时,map2为空。
//interpolation-插值方法,但是不支持最近邻插值
remap(img, rimg, rmap[k][0], rmap[k][1], CV_INTER_LINEAR);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐