cv::Mat 分配给 'at<unsigned char>(0,0)' 时会导致崩溃

Posted

技术标签:

【中文标题】cv::Mat 分配给 \'at<unsigned char>(0,0)\' 时会导致崩溃【英文标题】: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本身抛出的错误 【参考方案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) 也可能是一个问题。

希望对您有所帮助!

【讨论】:

以上是关于cv::Mat 分配给 'at<unsigned char>(0,0)' 时会导致崩溃的主要内容,如果未能解决你的问题,请参考以下文章

cv::mat与unsigned char*相互转化之间的转换

无法将值分配给函数内部的 cv::Mat

opencv 中的 Mat_<unsigned char> - Mat 数据类型

unsigned char ** 到 opencv mat

opencv 报错:Error: Assertion failed (data) in cv::Mat::at, file ... mat.inl.hpp, line 897(访问了不存在矩阵的像素)

如何将像素数据的所有权传递给 cv::Mat