处理 cv::MAT 的像素不起作用

Posted

技术标签:

【中文标题】处理 cv::MAT 的像素不起作用【英文标题】:Manipulating pixels of a cv::MAT just doesn't take effect 【发布时间】:2016-10-30 23:22:55 【问题描述】:

下面的代码只是用来加载一个图像,用一个常量填充它并再次保存它。 当然,这还没有目的,但它仍然不起作用。 我可以读取循环中的像素值,但所有更改都无效,并在文件加载时保存文件。 认为我在这里准确地遵循了“有效方式”: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;

像 cvtColor() 这样的普通 cv 函数正在按预期生效。 数组的变化是否以某种方式发生在缓冲区上?

提前非常感谢!

【问题讨论】:

【参考方案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;

【讨论】:

Hmpf,信不信由你,我正要准确地回答我自己的问题..该死的,仍然花了多个小时只是因为没有在正确的时间注意......谢谢你! 别担心!它发生在每个人身上。我还花了一些时间查看您的代码,认为一切正常,直到我看到第三行。

以上是关于处理 cv::MAT 的像素不起作用的主要内容,如果未能解决你的问题,请参考以下文章

std::vector<cv::Vec3b> 到 cv::Mat

前向声明 cv::Mat

在 OpenCv 中对 cv::Mat 进行排序

在 sqlite3 数据库中存储精确的 cv::Mat 图像

引导媒体查询在 576 像素时不起作用

主页和后退按钮在 android 模拟器像素 2 和像素 3 api 中不起作用