c ++和opencv获取并设置像素颜色为Mat

grl*_*rll 37 c++ opencv pixel image-processing mat

我正在尝试将一些像素的新颜色值设置为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);
Run Code Online (Sandbox Code Playgroud)

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

Rog*_*and 59

除了将新像素值复制回图像之外,您已完成所有操作.

该行将像素的副本复制到局部变量中:

Vec3b color = image.at<Vec3b>(Point(x,y));
Run Code Online (Sandbox Code Playgroud)

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

image.at<Vec3b>(Point(x,y)) = color;
Run Code Online (Sandbox Code Playgroud)

所以,完整的,像这样:

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>(Point(x,y));

        // ... do something to the color ....

        // set pixel
        image.at<Vec3b>(Point(x,y)) = color;
    }
}
Run Code Online (Sandbox Code Playgroud)


ber*_*rak 16

只需使用参考:

Vec3b & color = image.at<Vec3b>(y,x);
color[2] = 13;
Run Code Online (Sandbox Code Playgroud)

  • 因为问题是关于颜色垫的。在uchar案中,ofc。使用 `uchar&amp; c = image.at&lt;uchar&gt;(y,x)` (2认同)

Flo*_*cke 13

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

定义结构:

//#pragma pack(push, 2) //not useful (see comments below)
struct RGB {
    uchar blue;
    uchar green;
    uchar red;  };
Run Code Online (Sandbox Code Playgroud)

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

RGB& rgb = image.ptr<RGB>(y)[x];
Run Code Online (Sandbox Code Playgroud)

image.ptr(y)为您提供指向扫描线y的指针.并使用x和y循环遍历像素

  • `pragma`对仅由`uchar`s构成的结构没有影响.阅读一个很好的解释[这里](http://publib.boulder.ibm.com/infocenter/compbgpl/v9v111/index.jsp?topic=/com.ibm.xlcpp9.bg.doc/compiler_ref/pragma_pack.htm)细节. (3认同)