我正在尝试以下简单代码:
int main()
{
Mat a = Mat::zeros(Size(200,200) , CV_8UC1); Mat b;
b = a;
for(int i=0 ; i< a.rows ; i++)
{
for(int j = 0 ; j< a.cols ; j++)
{
a.at<int>(i,j) = 100;
}
}
namedWindow("one" , WINDOW_AUTOSIZE);
namedWindow("two" , WINDOW_AUTOSIZE);
imshow("one", a);
imshow("two", b);
waitKey();
return 0;
}
但是关于内存映射,我得到了一些奇怪的结果。该代码有什么问题?
答案 0 :(得分:2)
此行中的问题。
a.at<int>(i,j) = 100;
您应该将其替换为:
a.at<uint8_t>(i,j) = 100;
或:
a.at<uchar>(i,j) = 100;
由于将类型设置为CV_8UC1
,因此必须指定要访问的元素具有8位。否则会导致内存崩溃。
答案 1 :(得分:2)
您需要注意如何声明cv :: Mat
Mat a = Mat::zeros(Size(200,200) , CV_8UC1);
CV_8UC1类型的cv :: Mat使用8位类型(无符号字符)。
a.at<int>(i,j) = 100;
此函数调用正在传递int的模板类型(带符号的32位整数)。您有类型冲突。
解决方案是:
a.at<uchar>(i,j) = 100;