使用'at <unsigned char =“”>(0,0)'</unsigned>分配给cv :: Mat会导致崩溃

时间:2011-11-13 16:37:46

标签: c++ opencv

我有以下简单的代码崩溃,但我不清楚为什么这不起作用。

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行

    
  

2 个答案:

答案 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)也可能是一个问题。

希望有帮助!