整夜都在追踪这个错误,因此请原谅。

我正在尝试使用OpenCV的calibrateCamera()从一组提供了对象点和世界点的15张图片中提取内部参数和外部参数。从调试中可以看出,我正在从输入文件中获取有效点,并将它们放置在vector<Point3f>中,而vector本身又放置在另一个calibrateCamera()中。

我将整个shebang传递给Assertion failed (ni >= 0) in unknown function, file ...\calibration.cpp, line 3173

double rms = calibrateCamera(worldPoints, pixelPoints, src.size(), intrinsic, distCoeffs, rvecs, tvecs);

抛出Point3f
拉起这个文件给我们
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);
    CV_Assert( ni >= 0 );
    total += ni;
}
...

据我所知,CV_32F的深度为calibrateCamera(),在调用calibrateCamera之前,我可以在double vector 中看到良好的数据。

任何想法可能在这里发生什么? vector<vector<Point3f>>需要vector<vector<Point2f>>,如http://aishack.in/tutorials/calibrating-undistorting-with-opencv-in-c-oh-yeah/和文档所述;希望getMat(i)不会因此而失败。

可能刚刚在像素点的checkVector()上调用了它吗?我经历了太多的错误,我愿意相信任何事情。

编辑:
因此,ojit_code的文档并没有真正的帮助
int cv::Mat::checkVector    (int elemChannels, int  depth = -1, bool RequireContinuous = true) const

returns N if the matrix is 1-channel (N x ptdim) or ptdim-channel (1 x N) or (N x 1); negative number otherwise

最佳答案

问题可能出在您的InputArrayOfArrays参数之一中(确切地说,在worldPoints中,如果从问题中粘贴的行抛出了断言)。 Mat:s在这里应该可以正常工作。

通过使所有3个InputArrayOfArrays(在我的情况下为vector>和vector>)具有完全填充的条目的相同长度的 vector ,我解决了代码中的相同断言错误。所以我的问题出在我的体系结构上:我的objectPoints vector 包含空条目(即使现有数据有效),并且calibrate.cpp要求在3个InputArrayOfArrays中都不存在空条目。顺便说一句,我正在使用灰度图像进行校准,因此使用单通道数据。

在calib3d源中,如果您检查数据类型匹配,则引发错误的最可能原因是空值。您可以尝试仔细检查有效的输入数据:

1)从您选择的结构中计算有效校准图像的数量validCalibImages = (int)goodCalibrationImages.size()
2)将worldPoints定义为vector<vector<Point3f> > worldPoints
3)重要提示:调整大小以适应每个校准条目的数据worldPoints.resize(validCalibImages)
4)用数据填充

for(int k = 0; k < (int)goodCalibImages.size(); k++){
for(int i = 0; i < chessboardSize.height; i++){
for(int j = 0; j < chessboardSize.width; j++){
                objectPoints[k].push_back(Point3f(i*squareSize, j*squareSize, 0));
            }
        }
    }

'
希望能帮助到你!

关于c++ - 由OpenCV checkVector()在其他有效 vector <vector <Point3f >>上抛出的断言,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16194373/

10-12 22:53
查看更多