7

在 OpenCV4Android 中访问和修改 Mat 的各个元素的标准方法是什么?另外,BGR(我认为这是默认的)和灰度的数据格式是什么?
编辑:让我们更具体一点。mat.get(row, col) 返回一个双精度数组。这个数组中有什么?

4

3 回答 3

13

如果您只想访问一些像素,请使用double[] get(int row, int col)并使用put(int row, int col, double... data) 写入。如果您正在考虑访问整个图像或在循环中迭代图像的数据,那么您应该做的最好的事情是将 Mat 数据复制到 Java 原始数据类型中。完成数据操作后,只需将数据复制回 Mat 结构即可。

图像使用CV_8U,如果您有灰度图像,它将使用CV_8UC1如果您有 RGB 图像,它将使用 CV_8UC3 的 Mat(CV_8U的3 个通道)。CV_8U相当于java中的字节。:)

我可以给你和我在 Java(Android 平台)中使用的方法来二值灰度图像的示例:

private Mat featuresVectorBinarization(Mat fv){

    int size = (int) fv.total() * fv.channels();
    double[] buff = new double[size];
    fv.get(0, 0, buff);

    for(int i = 0; i < size; i++)
    {
        buff[i] = (buff[i] >= 0) ? 1 : 0;
    }

    Mat bv = new Mat(fv.size(), CvType.CV_8U);
    bv.put(0, 0, buff);
    return bv;
}  

希望有帮助。

于 2012-09-19T10:41:37.657 回答
11

在 OpenCV4Android 中访问和修改 Mat 的各个元素的标准方法是什么?

AMat是我们在数学中称为“矩阵”的东西 - 由行和列设置的矩形数组。在图像 Mat 的情况下,这些“数量”表示像素(例如,矩阵的每个元素都可以是图像 Mat 中每个像素的颜色)。从教程:

在此处输入图像描述

在上图中,您可以看到汽车的镜子只不过是一个包含所有像素点强度值的矩阵。

那么你将如何遍历一个矩阵呢?这个怎么样:

for (int row=0; row<mat.rows(); row++) {
  for (int col=0; col<mat.cols(); col++ ) {
    //...do what you want.. 
    //e.g. get the value of the 3rd element of 2nd row 
    //by mat.get(2,3);
  }
}

在 OpenCV4Android 中访问和修改 Mat 的各个元素的标准方法是什么?

您可以Mat使用其函数获取元素的值get(x)(y),其中x是元素的第一个坐标(行号)和y第二个坐标(列号)。例如,要获取名为的BGR图像第 7 行的第 4 个元素,请使用 的方法获取类型为 的数组,该数组的大小为,每个数组元素代表图像格式的、和通道中的每一个。MatbgrImageMatgetMatdouble3BlueGreenRedBGR

double [] bgrColor = bgrImageMat.get();

另外,BGR(我认为这是默认的)和灰度的数据格式是什么?编辑:让我们更具体一点。mat.get(row, col) 返回一个双精度数组。这个数组中有什么?

您可以从网上阅读有关 BGR 颜色格式和灰度的信息。例如BGR灰度

简而言之,BGR 颜色格式有 3 个通道:Blue,GreenRed. 所以当是一个图像时,double返回的数组是一个大小为 3 的数组,它的每个元素分别包含每个,和通道的值。mat.get(row, col)matBGRBluegreenred

同样,灰度格式是 1 通道颜色格式,因此double返回的大小为 1。

于 2016-01-12T15:35:32.483 回答
0

我从学习 OpenCV Mat 对象中可以理解的是,Mat 是可以表示任何 W x H 像素图像的对象。

现在假设您要访问图像的中心像素

X = W/2 Y = H/2

然后您可以按如下方式访问像素数据 double[] data = matObject.get(x,y);

现在数据代表什么以及数据数组的大小是多少。这取决于图像类型。如果图像是灰度图像,则 data.length = 1 ,因为只有一个通道,并且 data[0] 表示该像素的颜色值,即。0(黑色)- 255(白色)

如果图像是彩色图像,则 data.length = 4(rgba) ,因为有四个通道,并且 data[0-n] 表示该像素的颜色值

于 2014-07-25T11:23:33.757 回答