在OpenCV中设置像素值(奇怪的结果)

时间:2018-06-22 12:48:52

标签: c++ compiler-errors opencv3.0 memory-mapping

我正在尝试以下简单代码:

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;
}

但是关于内存映射,我得到了一些奇怪的结果。该代码有什么问题?

2 个答案:

答案 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;