opencv立体声校准结果

时间:2017-05-18 10:23:33

标签: c++ opencv camera-calibration stereo-3d

好像我有两个网络摄像头,标记为cam1cam2。我想校准它们以获得它们之间的转换。

我使用cv::stereoCalibrate()进行校准。

我从cam1转换为cam2后,标记为RT。我想检查校准结果的准确性。

所以我用cam1cam2来拍摄棋盘图片,标记为pic1pic2。我得到了cam1&#39 ; cv::solvePnP()的外部参数。我在cam1中按cv::projectPoints()绘制了pic1的世界坐标系。

然后,我认为cam2的旋转矩阵= cam1的旋转矩阵* Rcam2&#39 ; s翻译矩阵= cam1&#39}的翻译矩阵+ T

我通过上述想法计算了cam2的外在参数。并且cam2的{​​{1}}世界坐标系在cv::projectPoints()中得出}}

但是pic2的来源并不是正确的位置。

以下是我使用的代码的一部分。

pic2

以下是我使用void check_res(const vector<string> &imgs_nm,const Mat &R,const Mat &T,const Mat &cam_c,const Mat &cam_h,const Mat &dist_c,const Mat &dist_h) { int imgs_cnt=imgs_nm.size()/2; vector<Point3f> obj_pts; for(int i=0;i<boardDimensions.height;i++) for(int j=0;j<boardDimensions.width;j++) obj_pts.push_back(Point3f(i*CHESS_LEN,j*CHESS_LEN,0.f)); for(int i=0;i<imgs_cnt;i++) { vector<Point2f> c_cners,h_cners; Mat imgc_gray,imgh_gray; Mat imgc=imread(imgs_nm[i*2],1); Mat imgc_rz=imgc.clone(); bool c_found,h_found; c_found=HasChessBoard(imgc_rz,imgc_gray,c_cners); if(c_found) cv::cornerSubPix(imgc_gray, c_cners, cv::Size(11, 11), cv::Size(-1, -1),cv::TermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 30, 0.1)); Mat imgh=imread(imgs_nm[i*2+1],1); h_found=HasChessBoard(imgh,imgh_gray,h_cners); if(h_found) cv::cornerSubPix(imgh_gray, h_cners, cv::Size(11, 11), cv::Size(-1, -1),cv::TermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 30, 0.1)); Mat rvec_c,rvec_h,tvec_c,tvec_h; cv::solvePnP(obj_pts,c_cners,cam_c,dist_c,rvec_c,tvec_c); cv::solvePnP(obj_pts,h_cners,cam_h,dist_h,rvec_h,tvec_h); Mat rrvec_c,rrvec_h; cv::Rodrigues(rvec_c,rrvec_c); cv::Rodrigues(rvec_h,rrvec_h); Mat r1=rrvec_c*R; Mat t1=tvec_c+T; Mat img1=imgh.clone(); draw_chess(imgh,rrvec_h,tvec_h,cam_h,dist_h); imshow("pic1",imgh); draw_chess(img1,r1,t1,cam_h,dist_h); imshow("pic2",img1); char resc=waitKey(0); if(resc=='q') exit(1); } } 中的示例测试的结果。

enter image description here

我认为校准精度不高,因为我使用opencv的样本且opencv返回rms小于1像素。

任何建议表示赞赏。 谢谢!

2 个答案:

答案 0 :(得分:2)

公式为:

  • 姿势为相机1(均匀矩阵):

formula1

  • 从相机1到相机2的均匀转换:

formula2

  • 姿势为相机2:

formula3

答案 1 :(得分:0)

为了检查立体声校准的准确性,我会考虑采用不同的方法:

  1. 使用功能stereoRectify进行相机的整流转换。使用从stereoCalibrate
  2. 获得的翻译和旋转矩阵
  3. 每台相机执行一次initUndistortRectifyMap。使用
  4. 使用remap来自两台摄像机的图像获得的结果。
  5. 如果您的校准进展顺利,输出图像应该被纠正并且不会失真。