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

Chr*_*ris 1 c++ opencv

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

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

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

OpenCV错误:断言失败(dims <= 2 && data &&(unsigned)i0 <(unsigned)size.p [0] &&(unsigned)(i1*DataType <_Tp> :: channels)<(unsigned)(size.p [1]*channels())&&((((sizeof(size_t)<< 28)| 0x8442211)

((DataType <_Tp> :: depth)&((1 << 3) - 1))*4)&15)== elemSize1())在未知函数中,文件C:\ opencv231\build\include\opencv2/core/mat.hpp,第552行

Jac*_*cob 7

原因:

cv::Mat *test_bug = new cv::Mat(img->rows, img->cols, CV_32F);
Run Code Online (Sandbox Code Playgroud)

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

test_bug->at<unsigned char>(0,0) = 4;
Run Code Online (Sandbox Code Playgroud)

unsigned char(或uchar); 现在你将它视为无符号的char矩阵(CV_8U).

固定:

因此,如果您的矩阵应该是浮点数,则需要访问以下元素:

test_bug->at<float>(0,0) = 4;
Run Code Online (Sandbox Code Playgroud)

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

cv::Mat *test_bug = new cv::Mat(img->rows, img->cols, CV_8U);
Run Code Online (Sandbox Code Playgroud)