适用于Android的OpenCV - Mat的Access元素

1''*_*1'' 7 android opencv

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

gre*_*ven 11

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

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

我可以举例说明我在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;
}  
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.


Sol*_*ace 10

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

A Mat是我们在数学中称为"矩阵"的东西 - 由行和列设置的矩形数组.那些"量"表示在图像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);
  }
}
Run Code Online (Sandbox Code Playgroud)

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

您可以Mat通过使用其函数获取元素的值get(x)(y),其中x第一个坐标(行号)y是元素的第二个坐标(列号).例如,要得到一个的第七行的第四元件BGR图像Mat命名bgrImageMat,可使用get的方法Mat来获得类型的数组double,这将有一个大小的3,表示每个的每个阵列元件Blue,Green和Red所述的信道BGR的图像格式.

double [] bgrColor = bgrImageMat.get();
Run Code Online (Sandbox Code Playgroud)

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

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

总之,BGR的颜色格式具有3个信道:Blue,Green和Red.因此,double阵列返回的mat.get(row, col),当mat是一个BGR图像,是尺寸3的阵列,并且它的每个元素包含每个的值Blue,green和red分别的通道.

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