【问题标题】:c++ and opencv get and set pixel color to Matc ++和opencv获取并将像素颜色设置为Mat
【发布时间】:2014-05-24 22:55:19
【问题描述】:

我正在尝试将某个像素的新颜色值设置为 cv::Mat 图像,我的代码如下:

    Mat image = img;
    for(int y=0;y<img.rows;y++)
    {
        for(int x=0;x<img.cols;x++)
        {
        Vec3b color = image.at<Vec3b>(Point(x,y));
        if(color[0] > 150 && color[1] > 150 && color[2] > 150)
        {
            color[0] = 0;
            color[1] = 0;
            color[2] = 0;
            cout << "Pixel >200 :" << x << "," << y << endl;
        }
        else
        {
            color.val[0] = 255;
            color.val[1] = 255;
            color.val[2] = 255;
        }
    }
    imwrite("../images/imgopti"+to_string(i)+".tiff",image);

似乎在输出(使用 cout)中获得了良好的像素,但是在输出图像(使用 imwrite)中,相关像素没有被修改。我已经尝试过使用 color.val[0].. 我仍然无法弄清楚为什么输出图像中的像素颜色不会改变。 谢谢

【问题讨论】:

    标签: c++ opencv image-processing pixel mat


    【解决方案1】:

    除了将新的像素值复制回图像之外,您做了所有事情。

    这一行将像素复制到一个局部变量中:

    Vec3b color = image.at<Vec3b>(Point(x,y));
    

    因此,根据需要更改 color 后,只需将其设置为如下:

    image.at<Vec3b>(Point(x,y)) = color;
    

    所以,总的来说,是这样的:

    Mat image = img;
    for(int y=0;y<img.rows;y++)
    {
        for(int x=0;x<img.cols;x++)
        {
            // get pixel
            Vec3b & color = image.at<Vec3b>(y,x);
    
            // ... do something to the color ....
            color[0] = 13;
            color[1] = 13;
            color[2] = 13;
    
            // set pixel
            //image.at<Vec3b>(Point(x,y)) = color;
            //if you copy value
        }
    }
    

    【讨论】:

      【解决方案2】:

      只是使用参考:

      Vec3b & color = image.at<Vec3b>(y,x);
      color[2] = 13;
      

      【讨论】:

      • 因为问题与颜色垫有关。在 uchar 案例中,ofc。使用uchar&amp; c = image.at&lt;uchar&gt;(y,x)
      【解决方案3】:

      出于性能原因,我不会使用 .at。

      定义一个结构体:

      //#pragma pack(push, 2) //not useful (see comments below)
      struct BGR {
          uchar blue;
          uchar green;
          uchar red;  };
      

      然后像这样在你的 cv::Mat 图像上使用它:

      BGR& bgr = image.ptr<BGR>(y)[x];
      

      image.ptr(y) 给你一个指向扫描线 y 的指针。并用 x 和 y 循环遍历像素

      【讨论】:

      • 如果sizeof(uchar)为1,将pack的值设置为2是什么意思?
      • 编译器会将填充字节添加到结构中。 pack 的设置更改了这些填充,以便数据以另一种方式对齐。编辑:请参阅此帖子 stackoverflow.com/questions/3318410/pragma-pack-effect
      • pragma 对仅由 uchars 构成的结构没有影响。阅读一个很好的解释here了解详细信息。
      • 谢谢很好的链接。在这种情况下,似乎编译指示真的没用:) thx!
      • 不客气 :) 很好的回答:更少的魔法,更高效。
      猜你喜欢
      • 1970-01-01
      • 2012-09-30
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 2023-02-11
      • 1970-01-01
      • 2014-01-16
      相关资源
      最近更新 更多