处理 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