2016-10-30 31 views
1

下面的代码只是加载一个图像,用一个常量值填充并再次保存。 当然,这还没有目的,但它仍然不起作用。 我可以读取循环中的像素值,但所有更改都无效,并在加载时保存文件。 想我遵循“有效途径”这里准确:http://docs.opencv.org/2.4/doc/tutorials/core/how_to_scan_images/how_to_scan_images.htmlcv :: MAT操作像素只是不起作用

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

哼,beleive我还是不行,我正要回答我的问题跟正是.. 该死,都还是花复式小时只是因为具有不支付在正确的时间注意... 谢谢! – DragonGamer

+0

不用担心!它发生在每个人身上。我还花了一段时间看看你的代码,认为一切看起来都很好,直到我看到第三行。 – masad