以下代码只是加载图像,用常量值填充并再次保存。 当然,这还没有目的,但它仍然没有用。 我可以读取循环中的像素值,但所有更改都没有效果,并在加载时保存文件。 我认为我在这里准确地遵循了“有效方式”: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()正在按预期生效。 数组的更改是否以某种方式发生在缓冲区上?
提前非常感谢!
答案 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;
}