双目视觉_标定

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

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

双目视觉的标定,(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。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值