OpenCV calibrateCamera断言失败

时间:2015-07-17 19:15:57

标签: c++ opencv camera-calibration

所以我在去年this帖子中描述的基本相同的问题,并没有解决它的任何问题。我正在调用calibrateCamera并收到错误“断言失败(nimages> 0&& nimages ==(int)imagePoints1.total()&&(!imgPtMat2 || nimages ==(int)imagePoints2.total ())在cv :: collectCalibrationData“。

获得此错误的代码行是:

double rms = calibrateCamera(objectPoints, imagePoints, imageSize, cameraMatrix,
    distCoeffs, rvecs, tvecs, s.flag | CALIB_FIX_K4 | CALIB_FIX_K5);

我检查了objectPoints和imagePoints的大小,它们是相同的,如下图所示。

imagePoints objectPoints

imagePoints和objectPoints都包含有意义的点 - 它们没有填充不正确的值或为空。我看一下collectCalibrationData代码,因为那是断言失败的地方,似乎我的问题是函数本身似乎错误地计算了每个向量的大小,或者至少以不给出一致大小的方式。函数collectcalibrationData的相关部分的代码如下所示:

static void collectCalibrationData( InputArrayOfArrays objectPoints,
                                InputArrayOfArrays imagePoints1,
                                InputArrayOfArrays imagePoints2,
                                Mat& objPtMat, Mat& imgPtMat1, Mat* imgPtMat2,
                                Mat& npoints )
{
int nimages = (int)objectPoints.total();
int i, j = 0, ni = 0, total = 0;
CV_Assert(nimages > 0 && nimages == (int)imagePoints1.total() &&
    (!imgPtMat2 || nimages == (int)imagePoints2.total()));

for( i = 0; i < nimages; i++ )
{
    ni = objectPoints.getMat(i).checkVector(3, CV_32F);
    if( ni <= 0 )
        CV_Error(CV_StsUnsupportedFormat, "objectPoints should contain vector of vectors of points of type Point3f");
    int ni1 = imagePoints1.getMat(i).checkVector(2, CV_32F);
    if( ni1 <= 0 )
        CV_Error(CV_StsUnsupportedFormat, "imagePoints1 should contain vector of vectors of points of type Point2f");
    CV_Assert( ni == ni1 );

    total += ni;
}

似乎每个向量的大小都是使用nimages = (int)objectPoints.total()nimages == (int)imagePoints.total()计算的。我打印出这两行产生的值(将矢量转换为InputArrayofArrays b / c,这是collectCalibrationData所做的):

cv::InputArrayOfArrays IMGPOINT = imagePoints; std::cout << (int) IMGPOINT.total() << std::endl;
cv::InputArrayOfArrays OBJPOINT = objectPoints; std::cout << (int) OBJPOINT.total() << std::endl;   

这些语句在每次运行程序时都会产生一个看似随机的整数 - 它们不一致,并且永远不会彼此相等。此时,我被困住了。我不确定为什么collectCalibrationData为我的向量大小得到了错误的值,为什么将向量转换为InputArrayofArrays似乎改变了它们的大小。有小费吗?我之前曾经看过一次或两次这个问题,但从来没有得到答案。

我正在使用VS 2013和OpenCV 3.0.0。

0 个答案:

没有答案