【问题标题】:Assembly explanation about stereoCalibrate error with OutputArray::Create assertion error关于带有 OutputArray::Create assertion 错误的 stereoCalibrate 错误的汇编说明
【发布时间】:2017-03-02 23:28:24
【问题描述】:

我在 Opencv 2.4.11 中执行 stereoCalibrate 时遇到了一个错误,上面写着:

OpenCV Error: Assertion failed (!fixedSize() || ((Mat*)obj)->size.operator()() == Size(cols, rows)) in cv::_OutputArray::create,

我认为这一定是这些参数之间的一些大小误差,它们一一经过。但是还是有错误。我希望有人能从下面的汇编代码中找到错误。这是我代码中的方法调用。

double error = cv::stereoCalibrate(
        objPoints, cali0.imgPoints, cali1.imgPoints,
        camera0.intr.cameraMatrix, camera0.intr.distCoeffs,
        camera1.intr.cameraMatrix, camera1.intr.distCoeffs,
        cv::Size(1920,1080), m.rvec, m.tvec, m.evec, m.fvec,
        cv::TermCriteria(CV_TERMCRIT_ITER + CV_TERMCRIT_EPS, 100, 1e-5)
        ,CV_CALIB_FIX_INTRINSIC + CV_CALIB_USE_INTRINSIC_GUESS
    );

在我的代码中,m.rvec 是 (3,3,CV_64F),m.tvec 是 (3,1,CV_64F),m.evec 和 m.fvec 没有预先分配,这与 stereoCalibrate 示例相同。 intr.cameraMatrix 是 (3,3,CV_64F),intr.distCoeffs 是 (8,1,CV_64F),objPoints 是从存储角点 3d 位置的棋盘计算出来的,点的所有 z 值都为零。

在阅读了@Josh 的建议后,我将代码修改为 CV_64F 中的普通输出 mat 对象,但它仍然抛出此断言。

cv::Mat R, t, e, f;
    double error = cv::stereoCalibrate(
        objPoints, cali0.imgPoints, cali1.imgPoints,
        camera0.intr.cameraMatrix, camera0.intr.distCoeffs,
        camera1.intr.cameraMatrix, camera1.intr.distCoeffs,
        cali0.imgSize, R, t, e, f,
        cv::TermCriteria(CV_TERMCRIT_ITER + CV_TERMCRIT_EPS, 100, 1e-5));

终于解决了这个问题,提醒一下,确保你传入的相机参数不是const类型....

【问题讨论】:

  • 您显示的程序集似乎与您的问题无关。您需要展示一个完整的源代码示例来演示该问题,特别是一个最小的、完整的和可验证的示例。猜测太冒险了,断言失败消息似乎是在说您的 _OutputArray 对象之一没有它应该具有的大小。
  • 谢谢你,罗斯,你的建议真的很有帮助,这让我开始搜索源代码。这实际上与程序集无关,程序集仅向我显示导致断言的参数的位置。下次我会更加关注这个帖子。 :)

标签: opencv assembly camera-calibration stereo-3d


【解决方案1】:

为什么要去组装? OpenCV 是开源的,你可以在这里查看你调用的代码:https://github.com/opencv/opencv/blob/master/modules/calib3d/src/calibration.cpp#L3523

如果您在 OpenCV 中获得断言失败,通常是因为您传递了一个形状不正确的矩阵。 OpenCV 非常挑剔。断言失败在 OutputArray 上,因此检查函数签名有四个可能的罪魁祸首:

OutputArray _Rmat, OutputArray _Tmat, OutputArray _Emat, OutputArray _Fmat

大小在cv::stereoCalibrate 内完成:

https://github.com/opencv/opencv/blob/master/modules/calib3d/src/calibration.cpp#L3550

_Rmat.create(3, 3, rtype);
_Tmat.create(3, 1, rtype);

<-- snipped -->

if( _Emat.needed() )
{
    _Emat.create(3, 3, rtype);
    p_matE = &(c_matE = _Emat.getMat());
}
if( _Fmat.needed() )
{
    _Fmat.create(3, 3, rtype);
    p_matF = &(c_matF = _Fmat.getMat());

}

断言在这些调用之一中被触发,代码在这里:

https://github.com/opencv/opencv/blob/master/modules/core/src/matrix.cpp#L2241

尝试在不预先分配形状的情况下传入普通的 Mat 对象。

【讨论】:

  • 非常感谢乔希!!!我只是认为相机参数也属于 outputArray,这让我意识到我不能将相机参数作为 const 对象传递。那么问题就解决了!非常感谢您的详细解释,这对我很有帮助,并为我提供了如何从源代码调试的线索:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-08
  • 1970-01-01
  • 2020-01-07
  • 1970-01-01
  • 2013-10-24
  • 1970-01-01
  • 2019-11-01
相关资源
最近更新 更多