【问题标题】:cv::Mat causes crash when assigned to with 'at<unsigned char>(0,0)'cv::Mat 分配给 'at<unsigned char>(0,0)' 时会导致崩溃
【发布时间】:2011-11-13 16:37:45
【问题描述】:

我有以下简单的代码正在崩溃,我并不清楚为什么它不应该工作。

cv::Mat *test_bug = new cv::Mat(img->rows, img->cols, CV_32F);
test_bug->at<unsigned char>(0,0) = 4;

test_bug 最终成为 207 x 207 矩阵..所以我知道数组索引是有效的。这是复制/粘贴错误。

OpenCV 错误:断言失败 (dims ::channels)

((DataType<_tp>::depth) & ((1

【问题讨论】:

  • 您是否尝试在启用所有警告和调试信息的情况下编译您的代码(使用 GCC 时将是 gcc -Wall -g)?您是否尝试使用调试器(例如gdb)?
  • 我拥有的 opencv 库仅适用于 Visual Studio。我正在使用调试器逐步完成,但我并不清楚为什么会失败。好像是opencv本身抛出的错误

标签: c++ opencv


【解决方案1】:

原因:

cv::Mat *test_bug = new cv::Mat(img->rows, img->cols, CV_32F);

注意CV_32F;这是一个浮点矩阵。

test_bug->at<unsigned char>(0,0) = 4;

注意unsigned char(或uchar);现在您将其视为无符号字符矩阵 (CV_8U)。

修复:

所以如果你的矩阵应该是浮点数,你需要通过以下方式访问元素:

test_bug->at<float>(0,0) = 4;

或者,如果你想声明一个uchar 矩阵:

cv::Mat *test_bug = new cv::Mat(img->rows, img->cols, CV_8U);

【讨论】:

    【解决方案2】:

    我准确地运行了您的代码,没有遇到任何问题,但我在 Linux 上使用 OpenCV 主干。

    有几件事可以尝试:

    如果你使用浮点数而不是 unsigned char 会发生什么:

    test_bug->at< float >(0, 0) = 4.0;
    

    在堆栈上声明对象以查看行为是否发生变化。

    Mat test_bug(img->size(), CV_32F);
    test_bug.at< unsigned char >(0, 0) = 4; // this will work, but it will only set one byte of the 32-bit floating point number.
    

    注意: 仅设置float 像素的第一个字节,您会看到一些有趣的数据,因为at() 函数将像素指针推进您为该类型指定的字节数(在你的情况sizeof(float) == 4)。您可以(不是您想要的)使用unsigned int 设置浮点值,如下所示:

    test_bug->at< unsigned int >(0, 0) = 0x41CA0000; // same as 25.25 in IEEE 754...
    

    另外,请确保 img-&gt;size() != Size(0, 0) 也可能是一个问题。

    希望对您有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-04
      • 2013-11-18
      • 2019-05-04
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      • 2017-07-12
      相关资源
      最近更新 更多