【问题标题】:Setting pixel values in OpenCV (strange result)在 OpenCV 中设置像素值(奇怪的结果)
【发布时间】:2018-06-22 12:48:52
【问题描述】:

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

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

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

【问题讨论】:

  • 请附上错误信息。
  • 但是我得到了一些关于内存映射的奇怪结果。你能详细说明一下吗?
  • a.at&lt;uchar&gt;(i,j) = 100;,或者直接使用a,setTo(100);
  • @MaxLanghof :我无法从代码块终端复制文本。右键单击不起作用,ctrl + c 关闭窗口。 (我使用 Ubuntu 和 xterm 终端来显示终端结果)。

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


【解决方案1】:

您需要注意如何声明您的 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;

【讨论】:

    【解决方案2】:

    这一行的问题。

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

    您应该将其替换为:

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

    或到:

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

    因为您将类型设置为CV_8UC1,所以您必须指定要访问的元素具有 8 位。否则会导致内存崩溃。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      • 2021-01-30
      • 2018-12-12
      • 1970-01-01
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多