双目视觉_标定

之前项目利用单目+结构光进行三维测量。最近项目上有双目视觉,弄了下,写下这博客,相信很多类似的错误多可以在这里找得到

双目视觉很多博客都讲了,我简单的说下,对于双目如何能呈现三维的深度,其实机理和人的眼睛类似。当你闭左眼看向东西和闭右眼看向同一个东西时,距离会不同。这就是视差概念。近的物体视差会大(成像平面上的点距离中心远)。

双目视觉的标定,(opencv、matlab中)可以对左右相机分别标定,得到内参数,最后立体标定得到外参数(r和T)。matlab标定工具箱或者apps上都有,我其中利用matlab标定的参数,做矫正后发现左右图像不共行(思考很久),就换opencv的标定了、相信会有代码资源。

在这里我说下,你opencv标定时 如果出现Assertion failed (ni > 0 && ni == ni1) in collectCalibrationData这个错误。自己写下测试代码如下:

vector objectPoints_tmp(54);
 objectPoints_tmp.clear();
  for (int i = 0; i < 7; ++i)
  for (int j = 0; j < 6; ++j)
     objectPoints_tmp.push_back(Point3f(j * 50, i * 50, 0.0f));

 vector > objectPoints(7, objectPoints_tmp);
    InputArrayOfArrays OBJPOINT = objectPoints; std::cout << (int)OBJPOINT.total() << std::endl;
 for (int i = 0; i < 7; ++i)
   cout << OBJPOINT.getMat(i).checkVector(3, CV_32F) << endl;

看输出的结果是否一样,如果一样查看你的输入参数,一般

std::vector > objectPoint; 
std::vector > imagePoint; 


而你的初始化的内参矩阵是CV_32FC1 
应该是:

    instrisincMatrix=cv::Mat::eye(3,3,CV_64F);
    distortionCoeff=cv::Mat::zeros(4,1,CV_64F);
    std::vector RotationMatrix;
    std::vector TransformationMatrix;

如果不行,请将cv进行cmake,加载cmake后的lib。

 

你可能感兴趣的:(双目视觉_标定)