所以我在去年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都包含有意义的点 - 它们没有填充不正确的值或为空。我看一下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。