从C ++中的Mat元素获取像素通道

时间:2018-04-10 09:11:05

标签: java c++ opencv

我有一个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;
}

2 个答案:

答案 0 :(得分:0)

如果你有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];
  }
}

我没有编译这个,用作参考代码并欢迎你的评论

答案 1 :(得分:-1)

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

访问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];

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

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

b = 255;