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

时间:2012-09-12 18:39:39

标签: android opencv

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

3 个答案:

答案 0 :(得分:12)

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

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

我可以举例说明我在Java(Android平台)中使用的方法 binarize 灰度图像:

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;
}  

希望有所帮助。

答案 1 :(得分:10)

  

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

我们称之为Mat&#34;矩阵&#34;在数学中 - 由行和列设置的矩形数组。那些&#34;数量&#34;在图像Mat的情况下表示像素(例如,矩阵的每个元素可以是图像Mat中的每个像素的颜色)。来自this教程:

  

enter image description here

     

在上面的图片中你可以看到汽车的镜子什么都没有   不仅仅是包含像素的所有强度值的矩阵   分。

那你怎么去迭代矩阵呢?怎么样:

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的{​​{1}}图像Mat的第7行的第4个元素,请使用bgrImageMat的{​​{1}}方法获取数组键入get,其大小为Mat,每个数组元素代表{{1}的double3Blue个通道图像格式。

Green
  

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

您可以从网上了解BGR颜色格式和灰度。例如BGRGrayscale

简而言之,BGR颜色格式有3个频道:RedBGRdouble [] bgrColor = bgrImageMat.get(); 。因此,当BlueGreen图像时,Red返回的double数组是一个大小为3的数组,其每个元素都包含每个元素的值分别为mat.get(row, col)matBGR个频道。

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

答案 2 :(得分: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),因为有四个通道,而数据[0-n]表示该像素的颜色值