stereo_calib原理篇

 

转自:http://sites.google.com/site/opencv123/sample_explain/stereo_calib_theory

关于立体视觉的傻瓜研究

vinjn @ 2009
 

立体视觉,又称双目视觉,即Stereo Vision,在机器人领域用于检测障碍物及感知周围环境。用两个摄像头对同一个场景进行拍摄,摄像头之间隔开一定距离,就和人眼一样。同一件物体在我们双眼中的成像是不同的,有一定的偏移量,这个量我们称之为视差(disparity)。即下图中的d。







d:视差
f:焦距
P:观察的物体
xl/xr:P在左右两个画面上的位置










有了视差,我们可以进一步计算深度Z:
  Z和d成反比关系
这是比较理想的情况,实际应用中需要解决很多问题。先对整个成像的过程来个感性的认识。
typedef struct CvCamera { float imgSize[2]; /* size of the camera view, used during calibration */ float matrix[9]; /* intinsic camera parameters: [ fx 0 cx; 0 fy cy; 0 0 1 ] */ float distortion[4]; /* distortion coefficients - two coefficients for radial distortion and another two for tangential: [ k1 k2 p1 p2 ] */ float rotMatr[9]; float transVect[3]; /* rotation matrix and transition vector relatively to some reference point in the space. */ } CvCamera; typedef struct CvStereoCamera { CvCamera* camera[2]; /* two individual camera parameters */ float fundMatr[9]; /* fundamental matrix */ /* New part for stereo */ CvPoint3D32f epipole[2]; CvPoint2D32f quad[2][4]; /* coordinates of destination quadrangle after epipolar geometry rectification */ double coeffs[2][3][3];/* coefficients for transformation */ CvPoint2D32f border[2][4]; CvSize warpSize; CvStereoLineCoeff* lineCoeffs; int needSwapCameras;/* flag set to 1 if need to swap cameras for good reconstruction */ float rotMatrix[9]; float transVector[3]; } CvStereoCamera;  

1.校正镜头,undistortion 

1.1 why
存在两种扭曲
1.2 how
得到一些值,如相机矩阵,镜片的扭曲参数。
单个摄像头的情况
两个摄像头的情况
校正只需要进行一次,校正中常用的物体是一个棋盘,产生的结果可以被重复使用。

2.对齐两幅图,rectification

2.1 why
2.2 how
根据校正获得的参数,进行计算。remap。 

3. 左右图像匹配,correspondence

这一步的目的是生成disparity map

输入的两张图是校正过并且对齐过的。
IplImage* srcLeft = cvLoadImage("left.jpg",1); IplImage* srcRight = cvLoadImage("right.jpg",1); IplImage* leftImage = cvCreateImage(cvGetSize(srcLeft), IPL_DEPTH_8U, 1); IplImage* rightImage = cvCreateImage(cvGetSize(srcRight), IPL_DEPTH_8U, 1); IplImage* depthImage = cvCreateImage(cvGetSize(srcRight), IPL_DEPTH_8U, 1); cvCvtColor(srcLeft, leftImage, CV_BGR2GRAY); cvCvtColor(srcRight, rightImage, CV_BGR2GRAY); cvFindStereoCorrespondence( leftImage, rightImage, CV_DISPARITY_BIRCHFIELD, depthImage, 50, 15, 3, 6, 8, 15 ); cvNormalize(depthImage,depthImage,0,255,CV_MINMAX,0 ); 

4. 三维成像,reprojection

这个比较麻烦了。

 

你可能感兴趣的:(OpenCV)