操纵cv :: MAT的像素不会生效

时间:2016-10-30 23:22:55

标签: c++ opencv pixels mat

以下代码只是加载图像,用常量值填充并再次保存。 当然,这还没有目的,但它仍然没有用。 我可以读取循环中的像素值,但所有更改都没有效果,并在加载时保存文件。 我认为我在这里准确地遵循了“有效方式”:http://docs.opencv.org/2.4/doc/tutorials/core/how_to_scan_images/how_to_scan_images.html

int main()
{
    Mat im = imread("C:\\folder\\input.jpg");

    int channels = im.channels();
    int pixels = im.cols * channels;

    if (!im.isContinuous())
    { return 0; } // Just to show that I've thought of that. It never exits here.


    uchar* f = im.ptr<uchar>(0);

    for (int i = 0; i < pixels; i++)
    {
        f[i] = (uchar)100;
    }

    imwrite("C:\\folder\\output.jpg", im);

    return 0;
}

正常的cv函数如cvtColor()正在按预期生效。 数组的更改是否以某种方式发生在缓冲区上?

提前非常感谢!

1 个答案:

答案 0 :(得分:1)

问题在于您没有查看图像中的所有像素。您的代码仅查看im.cols*im.channels(),与图片大小(im.cols*im.rows*im.channels())相比,这是一个相对较小的数字。当使用指针在for循环中使用时,它只为图像中的几行设置一个值(如果你仔细观察,你会注意到保存的图像会有这些设置)。

以下是更正后的代码:

int main()
{
    Mat im = imread("C:\\folder\\input.jpg");

    int channels = im.channels();
    int pixels = im.cols * im.rows * channels;

    if (!im.isContinuous())
    { return 0; } // Just to show that I've thought of that. It never exits here.


    uchar* f = im.ptr<uchar>(0);

    for (int i = 0; i < pixels; i++)
    {
        f[i] = (uchar)100;
    }

    imwrite("C:\\folder\\output.jpg", im);

    return 0;
}