【问题标题】:Get pixel channels from a Mat element in C++ [closed]从 C++ 中的 Mat 元素获取像素通道 [关闭]
【发布时间】:2018-09-19 20:13:05
【问题描述】:

我有一个 java 函数,我想用 C++ 重新编码以提高效率。问题是我不知道如何在 C++ 中获取 Mat 中像素的 BRG 值。

这是我的 java 函数:

private static Mat f_blanc(Mat A) {
    double c = 1.2;
    Size sz = A.size();
    Mat A1 = new Mat(sz, 0);
    for (int i = 0; i < sz.width; i++) {
        for (int j = 0; j < sz.height; j++) {
            double b = A.get(j, i)[0];
            double g = A.get(j, i)[1];
            double r = A.get(j, i)[2];
            if (r < c * b || g < c * b) {
                A1.put(j, i, 255);
            }
        }
    }
    return A1;
}

【问题讨论】:

标签: java c++ opencv


【解决方案1】:

如果你有 Mat,你可以使用“data”成员变量来访问数据。

Mat img;
for( int h = 0; h < img.height; h++ )
{
 for( int w = 0; h < (img.width*3); w += 3 ) // if you have 3 channels
  {         
      int pos = h* img.width*3 + w*3;
      double b = img.data[pos];
      double g = img.data[pos+1];
      double r = img.data[pos+2];
  }
}

这个不是我编译的,作为参考代码,欢迎你们的cmets

【讨论】:

    【解决方案2】:

    这取决于矩阵的类型。您可以使用

    访问 BRG 值
    Vec3b& intensity = A.at<Vec3b>(j, i);
    uchar& b = intensity.val[0];
    uchar& g = intensity.val[1];
    uchar& r = intensity.val[2];
    

    对于矩阵类型CV_8U3 和[0, 255] 范围内的整数值或

    Vec3f& intensity = A.at<Vec3d>(j, i);
    double& b = intensity.val[0];
    double& g = intensity.val[1];
    double& r = intensity.val[2];
    

    对于矩阵类型CV_64F3 [0, 1] 范围内的双精度值。

    这些值是参考值。您可以通过为它们分配值来编辑它们

    b = 255;
    

    【讨论】:

    • 它的工作!太感谢了。无论如何,您现在是否可以修改像素的值(Java 中“put”函数的 C++ 等效项)?
    • 函数返回引用。你可以给它们赋值。
    猜你喜欢
    • 2011-12-15
    • 2015-08-07
    • 2013-04-19
    • 2018-11-29
    • 2021-12-03
    • 1970-01-01
    • 2019-08-15
    • 2013-08-21
    • 2022-08-05
    相关资源
    最近更新 更多