之前项目利用单目+结构光进行三维测量。最近项目上有双目视觉,弄了下,写下这博客,相信很多类似的错误多可以在这里找得到
双目视觉很多博客都讲了,我简单的说下,对于双目如何能呈现三维的深度,其实机理和人的眼睛类似。当你闭左眼看向东西和闭右眼看向同一个东西时,距离会不同。这就是视差概念。近的物体视差会大(成像平面上的点距离中心远)。
双目视觉的标定,(opencv、matlab中)可以对左右相机分别标定,得到内参数,最后立体标定得到外参数(r和T)。matlab标定工具箱或者apps上都有,我其中利用matlab标定的参数,做矫正后发现左右图像不共行(思考很久),就换opencv的标定了、相信会有代码资源。
在这里我说下,你opencv标定时 如果出现Assertion failed (ni > 0 && ni == ni1) in collectCalibrationData这个错误。自己写下测试代码如下:
vector<Point3f> 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<vector<Point3f> > 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<std::vector<cv::Point3f> > objectPoint;
std::vector<std::vector<cv::Point2f> > imagePoint;
而你的初始化的内参矩阵是CV_32FC1
应该是:
instrisincMatrix=cv::Mat::eye(3,3,CV_64F);
distortionCoeff=cv::Mat::zeros(4,1,CV_64F);
std::vector<cv::Mat> RotationMatrix;
std::vector<cv::Mat> TransformationMatrix;
如果不行,请将cv进行cmake,加载cmake后的lib。