OpenCV - 无法访问 Mat 中的所有像素

Posted

技术标签:

【中文标题】OpenCV - 无法访问 Mat 中的所有像素【英文标题】:OpenCV - Can't access all pixels in a Mat 【发布时间】:2013-08-05 17:28:42 【问题描述】:

我正在尝试手动更改 Mat 中的每个像素。 为简单起见,假设我想将每个像素着色为黑色。我正在使用以下方法:

for (int i = 0; i < imageToWorkWith.rows; i++) 
    for (int j = 0; j < imageToWorkWith.cols; j++) 
        imageToWorkWith.at<cv::Vec3b>(i,j) = cv::Vec3b(0,0,0);
    

从逻辑上讲,这似乎应该遍历垫子中的每个像素,因为它会读取行/列的所有可能组合。 不幸的是,这不起作用。对于每张图片,我都缺少一个“块”列。比如加载这个图片时: 结果是这样的: 无论我使用什么图像,我缺少的这个“块”大小都是一样的。我似乎无法理解其中的原因。我知道“at”函数的行/列的顺序是(行,列),但我尝试切换它们只是为了踢球,结果当然更糟。 我在这里想念什么?循环遍历所有行/列还不够吗?

【问题讨论】:

一切似乎都是正确的,尝试记录 imageToWorkWith.cols 的值,它是否正确。按列数计算,数字或行工作正常似乎中断 Pixel modifications does not cover whole image的可能重复 我刚刚测试了你的代码,它工作正常!我没有使用 ios,所以 Aurelius 的建议是正确的 @Aurelius ,是的!我不知道在研究这个问题时我是怎么错过的。无论如何,问题确实是图像有 4 个通道而不是 3 个。 【参考方案1】:

只需使用 Vec4b 而不是 Vec3b,因为图像在 ios 中默认有 4 个通道。结果将是全白的。

for (int i = 0; i < imageToWorkWith.rows; i++) 
    for (int j = 0; j < imageToWorkWith.cols; j++) 
        imageToWorkWith.at<cv::Vec4b>(i,j) = cv::Vec4b(0,0,0);
    

【讨论】:

以上是关于OpenCV - 无法访问 Mat 中的所有像素的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 访问 MAT 对象中的 RGB 值

使用 OpenCV 多通道 Mat 沿通道方向访问像素

从opencv中的像素数组创建矩阵

如何访问二进制 Mat 图像中的像素值?

OpenCV用另一个值替换特定像素值

【OPENCV】cv::Mat像素遍历方法比较