整晚都在追这个bug,所以请原谅任何不连贯的地方。
我正在尝试使用 OpenCVcalibrateCamera()
从一组 15 张图片中提取内在和外在参数,这些图片的对象点和世界点都已给出。从调试中可以看出,我正在从输入文件中获取有效点并将它们放在 avector<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;
}
...
据我所知,aPoint3f
具有CV_32F
深度,并且在调用 calibrateCamera 之前,我可以在双向量中看到良好的数据。
有什么想法可能在这里发生吗?calibrateCamera()
需要 a vector<vector<Point3f>>
,如http://aishack.in/tutorials/calibrating-undistorting-with-opencv-in-c-oh-yeah/和文档所述;希望 getMat(i) 不会因此而失败。
它可能vector<vector<Point2f>>
在它之后的像素点上被调用吗?我经历了太多的错误,我愿意相信任何事情。
编辑:
因此,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