opencv 坐标转换常用的函数solvePnP()、 projectPoints()、stereoRectify()、stereoCalibrate()

1. Finds an object pose from 3D-2D point correspondences.

bool solvePnP(InputArray objectPoints, InputArray imagePoints, 
               InputArray cameraMatrix, InputArray distCoeffs, 
               OutputArray rvec, OutputArray tvec, bool useExtrinsicGuess=false, 
               int flags=ITERATIVE )

函数solvepnp接收一组对应的3D坐标和2D坐标,计算得到两组坐标对应的几何变换(旋转矩阵rvec,平移矩阵tvec


2.Projects 3D points to an image plane.

void projectPoints(InputArray objectPoints, InputArray rvec, InputArray tvec,
                   InputArray cameraMatrix, InputArray distCoeffs, 
                   OutputArray imagePoints, OutputArray jacobian=noArray(), 
                   double aspectRatio=0 )

函数projectPoints()根据所给的3D坐标和已知的几何变换来求解投影后的2D坐标。


3. 

 void stereoRectify(InputArray cameraMatrix1, InputArray distCoeffs1, 
                    InputArray cameraMatrix2, InputArray distCoeffs2, Size imageSize, 
                    InputArray R, InputArray T,OutputArray R1, OutputArray R2, 
                    OutputArray P1, OutputArray P2,OutputArray Q, 
                    int flags=CALIB_ZERO_DISPARITY, double alpha=-1,
                    Size newImageSize=Size(), Rect* validPixROI1=0, 
                    Rect* validPixROI2=0 )

立体矫正,该函数计算每个摄像机(实际上)的旋转矩阵,从而使两个摄像机图像平面成为同一平面。因此,这使得所有的外极线平行,从而简化了稠密立体对应问题。

输出:R1是把第一个相机校正后的坐标系转换为校正前的坐标系所用的旋转矩阵,即把校正前坐标系点坐标转换为校正后的点坐标所需的旋转矩阵。即pafter = R1 * pbefore。而返回去则需要pbefore = R1.inverse() * pafter

R2同上;

P1:第一台相机矫正后坐标系的投影矩阵;

P2:第二台相机矫正后坐标系的投影矩阵;

Q:重投影误差。


4.

double stereoCalibrate(InputArrayOfArrays objectPoints, InputArrayOfArrays imagePoints1,
             InputArrayOfArrays imagePoints2, 
                       InputOutputArray cameraMatrix1,InputOutputArray distCoeffs1, 
                       InputOutputArray cameraMatrix2, InputOutputArray distCoeffs2, 
                       Size imageSize,OutputArray R,OutputArray T, OutputArray E, 
                       OutputArray F,
                       TermCriteria  criteria=TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 1e-6),
                       int flags=CALIB_FIX_INTRINSIC )

stereoCalibrate() 是用来标定一个立体摄像头的,也就是同时标定两个摄像头。标定的结果除了能够求出两个摄像头的内外参数矩阵,跟能够得出两个摄像头的位置关系R,T

objectPoints- vector<point3f> 型的数据结构,存储标定角点在世界坐标系中的位置

imagePoints1- vector<vector<point2f>> 型的数据结构,存储标定角点在第一个摄像机下的投影后的亚像素坐标

imagePoints2- vector<vector<point2f>> 型的数据结构,存储标定角点在第二个摄像机下的投影后的亚像素坐标

cameraMatrix1-输入/输出型的第一个摄像机的相机矩阵。如果CV_CALIB_USE_INTRINSIC_GUESS , CV_CALIB_FIX_ASPECT_RATIO ,CV_CALIB_FIX_INTRINSIC , or CV_CALIB_FIX_FOCAL_LENGTH其中的一个或多个标志被设置,该摄像机矩阵的一些或全部参数需要被初始化

distCoeffs1-第一个摄像机的输入/输出型畸变向量。根据矫正模型的不同,输出向量长度由标志决定

cameraMatrix2-输入/输出型的第二个摄像机的相机矩阵。参数意义同第一个相机矩阵相似

distCoeffs2-第一个摄像机的输入/输出型畸变向量。根据矫正模型的不同,输出向量长度由标志决定

imageSize-图像的大小

R-输出型,第一和第二个摄像机之间的旋转矩阵

T-输出型,第一和第二个摄像机之间的平移矩阵

E-输出型,本质矩阵,其物理意义是左右图像坐标系相互转换的矩阵,描述的是同一空间点投影在左右摄像机图像平面上对应点之间的关系,单位为mm

F-输出型,基础矩阵,同一物理点在左右摄像机图像平面上投影在像素坐标系下的关系: 

  1. PTpixrFPpixl=0

term_crit-迭代优化的终止条件

flag-

    •  CV_CALIB_FIX_INTRINSIC 如果该标志被设置,那么就会固定输入的cameraMatrixdistCoeffs不变,只求解R,T,E,F
    •  CV_CALIB_USE_INTRINSIC_GUESS 根据用户提供的cameraMatrixdistCoeffs为初始值开始迭代
    •  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
展开阅读全文

没有更多推荐了,返回首页