gpt4 book ai didi

c++ - 断言由 OpenCV checkVector() 在其他有效 vector> 上抛出

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:57:30 24 4
gpt4 key购买 nike

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

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

我将整个 shebang 传递给 calibrateCamera() ,

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 之前看到双 vector 中的良好数据。

知道这里会发生什么吗? calibrateCamera()需要 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

最佳答案

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

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

在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com