【问题标题】:OpenCV Mat::at line 537 Assertion Failed ErrorOpenCV Mat::at 第 537 行断言失败错误
【发布时间】:2014-11-25 08:11:11
【问题描述】:

我在 Mat::at 的第 537 行收到断言失败错误

OpenCV 错误:断言失败 (dims ::channels) > ((DataType<_tp>::depth) & ((1

我正在尝试填充将在函数 cv::remap 中使用的矩阵。 导致此断言失败的代码部分如下:

void Functions::PopulatedMapY(Mat image)
{
    mapy.create(image.rows, image.cols, CV_32FC1);
    for (int j = 0; j<image.rows; j++)
    {   
        float a = (image.rows - 1) - gazey;
        float b = (image.cols - 1) - gazex;
        for (int i = 0; i<image.cols; i++)
        {       
            mapy.at<float>(j,i) = map2y.at<float>(a+j,b+i);
        }   
    }
}

矩阵map2y在MapCreator函数中定义如下:

void Functions::MapCreator(Mat image, float const_a, float const_b)
{
    map2x.create(2*image.rows, 2*image.cols, CV_32FC1);
    map2y.create(2*image.rows, 2*image.cols, CV_32FC1);

    for (int m = 0; m<2*image.rows; m++)
    {
        ty = image.rows - m;
        for (int n = 0; n<2*image.cols; n++)
        {
            tx = image.cols - n;
            map2x.at<float>(m,n) = n;
            map2y.at<float>(m,n) = m +const_b*exp(-pow(tx,2)/pow(const_a, 2))*Signum(ty);

    }
    }

}

任何帮助将不胜感激!

【问题讨论】:

  • 您好,您能否提供更多信息,例如崩溃时的 i 和 j 的值以及gazey 和gazex 的值。
  • 嗨,gazey 和gazex 可以分别在0 和image.rows - 1 和image.cols - 1 之间变化。程序一运行就编译并崩溃。有没有办法在崩溃时找出 I 和 j 的值?谢谢!
  • btw a 和 b 应该是整数...您应该尝试访问索引而不是浮点数。 a + i 应该是一个 int。
  • 那么你做到了吗?

标签: c++ opencv


【解决方案1】:

从您的错误代码中,您可以发现在Mat::at 调用之后断言变为假,并且在此方法中,如果出现以下情况,您的代码变为假:
一种。编号。频道数小于 2。
湾。数据为空
C。 (无符号)i0 加上其他一些。
在你的情况下,我的建议是 nr。的频道。 CV_32FC1 的意思是这样的:
CV_ (S|U|F)C。我想这是问题所在,模板参数或数据为空。
我的解决方案只是使用 CV_32F 代替。
作为重要参考,请看这里:
OpenCV Error: Assertion failed, mat.cpp line 537

【讨论】:

  • 嗨,andrei,感谢您回复我。我不相信 CV_32FC1 是问题所在。如果我手动将gazex 和gazey 设置为某些值,我可以让程序运行而不会出现错误。在理想条件下,gazex 和gazey 应该分别在 image.cols-1 和 image.rows-1 处有效。但是,在 image.rows/2 + 1 和 image.cols/2 + 1 以上的任何值,都会出现断言失败错误。这暗示问题在于我如何填充矩阵。我会稍微调查一下,看看我是否犯了一个大错误。如果没有,我将发布我正在使用的所有这些功能和主 cpp 文件
  • 那么看来数据有问题。在指定的索引处,可能为空。问题是你的错误很清楚,与上面的前三个错误没有什么不同。如果渠道没问题,那么可能是数据。
  • 感谢您的意见。在这一点上,我很确定这是由于数据,这是我如何填充矩阵的直接结果。我认为我的逻辑有缺陷。我会尝试调试它一段时间,如果我不能,我会发布整个事情并解释我的想法。如果你能在那个时候看看那将是很棒的。
  • 是的,这是用 C++ 编写的,我正在使用 Visual Studio
  • 如果做不到,把代码发到pastebin,我看看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-15
  • 2019-05-04
  • 2017-12-24
  • 2016-02-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
相关资源
最近更新 更多