您的位置:首页 > 其它

立体校正相关函数

2016-01-05 20:18 316 查看
做立体标定的时候,opencv涉及的函数不少,且各个函数的参数又十分复杂,很容易搞混乱,把几个常见的函数总结在一起,方便以后查找。

1.cvStereoCalibrate

用于标定立体相机

函数形式

C++:

cvStereoCalibrate( const CvMat* object_points, const CvMat* image_points1,

const CvMat* image_points2, const CvMat* npoints,

CvMat* camera_matrix1, CvMat* dist_coeffs1,

CvMat* camera_matrix2, CvMat* dist_coeffs2,

CvSize image_size, CvMat* R, CvMat* T,

CvMat* E CV_DEFAULT(0), CvMat* F CV_DEFAULT(0),

CvTermCriteria term_crit CV_DEFAULT(cvTermCriteria(

CV_TERMCRIT_ITER+CV_TERMCRIT_EPS,30,1e-6)),

int flags CV_DEFAULT(CV_CALIB_FIX_INTRINSIC));

参数

o objectPoints– 校正的图像点向量组.

o imagePoints1–通过第一台相机观测到的图像上面的向量组.

o imagePoints2–通过第二台相机观测到的图像上面的向量组.

npoints–角点数

o cameraMatrix1– 输入或者输出第一个相机的内参数矩阵

o distCoeffs1– 输入/输出第一个相机的畸变系数向量

o cameraMatrix2– 输入或者输出第二个相机的内参数矩阵

o distCoeffs2– 输入/输出第二个相机的畸变系数向量

o imageSize– 图像文件的大小——只用于初始化相机内参数矩阵。

o R– 输出第一和第二相机坐标系之间的旋转矩阵。

o T– 输出第一和第二相机坐标系之间的旋转矩阵平移向量

o E–输出本征矩阵。

o F–输出基础矩阵。

o term_crit– 迭代优化算法终止的标准。

o flags–

不同的FLAG,可能是零或以下值的结合:

§ CV_CALIB_FIX_INTRINSIC要确认cameraMatrix? and distCoeffs?所以只有R, T, E , 和F矩阵被估计出来

§ CV_CALIB_USE_INTRINSIC_GUESS根据指定的FLAG优化一些或全部的内在参数。初始值是由用户提供。

§ CV_CALIB_FIX_PRINCIPAL_POINT在优化过程中确定主点。

§ CV_CALIB_FIX_FOCAL_LENGTH确定和 .

§ CV_CALIB_FIX_ASPECT_RATIO优化 . 确定的比值.

§ CV_CALIB_SAME_FOCAL_LENGTH执行以及 .

§ CV_CALIB_ZERO_TANGENT_DIST设置每个相机切向畸变系数为零并且设为固定值。

§ CV_CALIB_FIX_K1,…,CV_CALIB_FIX_K6在优化中不改变相应的径向畸变系数. 如果设置CV_CALIB_USE_INTRINSIC_GUESS , 使用distCoeffs矩阵提供的系数。否则将其置零.

§ CV_CALIB_RATIONAL_MODEL能够输出系数k4,k5,k6。提供向后兼容性,这额外FLAG应该明确指定校正函数使用理性模型和返回8个系数。如果FLAG没有被设置,该函数计算并只返回5畸变系数。

说明

该函数计算了两个摄像头进行立体像对之间的转换关系。如果你有一个立体相机的相对位置,并且两个摄像头的方向是固定的,以及你计算了物体相对于第一照相机和第二照相机的姿态,(R1,T1)和(R2,T2),各自(这个可以通过solvepnp()做到)通过这些姿态确定。这意味着,给定予(:数学:t_1),就可以计算(:数学:t_2)。你只需要知道第二相机相对于第一相机的位置和方向。

除了立体的相关信息,该函数也可以两个相机的每一个做一个完整的校准。然而,由于在输入数据中的高维的参数空间和噪声的,可能偏离正确值。如果每个单独的相机内参数可以被精确估计(例如,使用calibratecamera()),建议您这样做,然后在本征参数计算之中使用CV_CALIB_FIX_INTRINSIC的功能。否则,如果一旦计算出所有的参数,它将会合理的限制某些参数,例如,传递CV_CALIB_SAME_FOCAL_LENGTH and CV_CALIB_ZERO_TANGENT_DIST,这通常是一个合理的假设。

与calibratecamera()类似,该函数最大限度地减少了从相机中所有可用的视图的所有点的总的重投影误差。该函数返回的重投影误差最终值。

2.cvStereoRectify

cvStereoRectify()函数是用来计算校正的参数项,而不是真事的对立体图像进行校正

void cvStereoRectify(const CvMat* camera_matrix1, const CvMat* camera_matrix2, const CvMat* dist_coeffs1, const CvMat* dist_coeffs2, CvSize image_size, const CvMat* R, const CvMat* T, CvMat* R1, CvMat* R2, CvMat* P1, CvMat* P2, CvMat* Q=0, int flags=CV_CALIB_ZERO_DISPARITY)

参数说明:

@Input camera_matrix1,camera_matrix2由cvStereoCalibrate()返回的摄像机矩阵

@Input dist_coeffs1,dist_coeffs2由cvStereoCalibrate()返回的畸变向量

@Input image_size棋盘图像的大小

@Input R,T 由cvStereoCalibrate()返回的左右摄像机间旋转矩阵和平移向量

@Output R1和R2为左右摄像机平面间的行对准的校正旋转矩阵

@Output Pl和Pr 3*4 的左右投影方程

@Output Q 可选参数,4*4 的重投影矩阵

3.cvStereoRectifyUncalibrated

非标定立体校正算法:Hartley算法

int cvStereoRectifyUncalibrated(const CvMat* points1, const CvMat* points2, const CvMat* F, CvSize img_size, CvMat* H1, CvMat* H2, double threshold=5 )

这个函数不是校正非标定立体图像,而是计算可以用于校正的单应矩阵

函数说明:

@Input points1,points2为左右图像间的2*K的匹配点数组

@Input F 基础矩阵

@Input img_size标定中使用的图像的宽和高

@Output H1,H2返回校正的单应性矩阵

@Input threshold 点和对应极限之间的距离,如果大于该值,算法会删除该对应点

4.cvInitUndistortRectifyMap

一旦有了立体标定项,可以调用cvInitUndistortRectifyMap计算左右视图的校正查找映射表

void cvInitUndistortRectifyMap(const CvMat* camera_matrix, const CvMat* dist_coeffs, const CvMat* R, const CvMat* new_camera_matrix, CvArr* mapx, CvArr* mapy)

@input camera_matrix 3*3的摄像机矩阵

@input dist_coeffs 5*1的相机畸变参数

@input R 校正后的旋转矩阵

@input new_camera_matrix 校正后的3 *3摄像机矩阵

@output mapx,mapy查找映射表

5.cvFindStereoCorrespondenceBM

块匹配立体算法cvFindStereoCorrespondenceBM

该函数是用来校正图像,并输出视觉映射,结构如下所示

void cvFindStereoCorrespondenceBM(const CvArr *leftImage,

const CvArr *rightImage,

CvArr *disparityResult,

Cv StereoBMState *BMState

)

参数说明:

@Input const CvArr *leftImage代表是输入左边图像,

@Input const CvArr *rightImage当然就是输入右边图像,

@Output disparityResult输出视觉映射,一啊不能定义是CvMat类型,并且长宽和输入的左右图像一致,为浮点型

@Output BMState状态结构信息

6.void cvUndistortPoints(const CvMat* src, CvMat* dst, const CvMat* camera_matrix, const CvMat* dist_coeffs, const CvMat* R=0, const CvMat* P=0 )

从原始点坐标变换的矫正后的坐标

@Input src 原始图像的二维点坐标 2 * N 类型 CV_32FC2 or CV_64FC2

@Output dst 矫正点坐标

@Input camera_matrix 摄像机矩阵

@Input dist_coeffs畸变向量

@Input R两个摄像机之间的旋转矩阵

@Input P 矫正后的摄像机矩阵,可以是3*3 或者3*4矩阵
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: