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->size() != Size(0, 0)
也可能是一个问题。
希望对您有所帮助!
【讨论】:
以上是关于cv::Mat 分配给 'at<unsigned char>(0,0)' 时会导致崩溃的主要内容,如果未能解决你的问题,请参考以下文章
cv::mat与unsigned char*相互转化之间的转换
opencv 中的 Mat_<unsigned char> - Mat 数据类型
opencv 报错:Error: Assertion failed (data) in cv::Mat::at, file ... mat.inl.hpp, line 897(访问了不存在矩阵的像素)