代码之家  ›  专栏  ›  技术社区  ›  Hasani

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

  •  0
  • Hasani  · 技术社区  · 7 年前

    我正在尝试这个简单的代码:

    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 回复  |  直到 7 年前
        1
  •  2
  •   harrynowl    7 年前

    你需要注意你如何声明你的简历::

    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;
    
        2
  •  2
  •   Michał Kalinowski    7 年前

    这一行的问题。

    a.at<int>(i,j) =  100;
    

    您应该将其替换为:

    a.at<uint8_t>(i,j) =  100;
    

    或:

    a.at<uchar>(i,j) =  100;
    

    因为你把类型设置为 CV_8UC1 必须指定要访问的元素有8位。否则会导致内存崩溃。