我有以下简单的代码崩溃,但我不清楚为什么这不起作用。
cv::Mat *test_bug = new cv::Mat(img->rows, img->cols, CV_32F);
test_bug->at<unsigned char>(0,0) = 4;
test_bug
最终成为207乘207矩阵。所以我知道数组索引是有效的。这是复制/粘贴错误。
OpenCV错误:断言失败(dims&lt; = 2&amp;&amp; data&amp;&amp;(unsigned)i0&lt; (unsigned)size.p [0]&amp;&amp; (无符号)(i1 * DataType&lt; _Tp&gt; :: channels)&lt; (未签名)(size.p [1] * channels())&amp;&amp; ((((的sizeof(为size_t)LT;&LT; 28)| 0x8442211)
((DataType&lt; _Tp&gt; :: depth)&amp;((1&lt;&lt;&lt; 3)-1))* 4)&amp; 15)== elemSize1())在未知函数,文件中 C:\ opencv231 \ build \ include \ opencv2 / core / mat.hpp,第552行
答案 0 :(得分:7)
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);
答案 1 :(得分:0)
我完全运行了你的代码,没有遇到任何麻烦,但是我在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)
也可能是一个问题。
希望有帮助!