OpenCV checkVector()在其他有效向量<vector <point3f>&gt; </vector <point3f>上抛出的断言

时间:2013-04-24 14:15:57

标签: c++ opencv assert camera-calibration

整晚都在追逐这个错误,所以请原谅任何不连贯。

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

我将整个shebang传递给double rms = calibrateCamera(worldPoints, pixelPoints, src.size(), intrinsic, distCoeffs, rvecs, tvecs);

Assertion failed (ni >= 0) in unknown function, file ...\calibration.cpp, line 3173

抛出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; } ...

拉起这个文件给我们

Point3f

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

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

是否可能在它之后的checkVector()像素点上调用它?我已经过了很多错误,我愿意相信任何事情。

修改 因此,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 的文档并没有真正的帮助

{{1}}

2 个答案:

答案 0 :(得分:1)

问题可能出在你的一个InputArrayOfArrays参数中(如果从你问题中粘贴的行中抛出断言,则精确地在worldPoints中)。 Mat:s应该在这里工作得很好。

我通过在完全填充的条目中使所有3个InputArrayOfArrays(或矢量&gt;和vector&gt;在我的情况下)相同的长度向量解决了我的代码中的相同断言错误。所以我的问题出在我的架构中:我的objectPoints向量包含空条目(即使现有数据有效),而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));
            }
        }
    }

” 希望它有所帮助!

答案 1 :(得分:-1)

我同意FSaccilotto - 调用checkVector并确保传递大小为Mat 1x1:{3 channel}的向量而不是向量Mat 1 x n:{3 channel}或更低Mat 1 x n:{2 channel}的向量,这是MatOfPoint吐出的。这通常可以解决90%的断言失败问题。自己明确地声明Mat。

对象模式有点奇怪,因为x y z coords在通道中而不是Mat尺寸。