Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

OpenCV for Android - Access elements of Mat

Tags:

android

opencv

What is the standard way to access and modify individual elements of a Mat in OpenCV4Android? Also, what is the format of the data for BGR (which is the default, I think) and grayscale?
edit: Let's make this more specific. mat.get(row, col) returns a double array. What is in this array?

like image 517
1'' Avatar asked Sep 12 '12 18:09

1''


2 Answers

If you just want to access some pixels do it by using double[] get(int row, int col) and writing using put(int row, int col, double... data). If you are thinking in accessing the whole image or iterate the data of the image in a loop the best thing you should do is copy the Mat data into a Java primitive data type. When you're done with the data operations just copy the data back into a Mat structure.

Images use CV_8U, if you have a grayscale image it will use CV_8UC1 if you have a RGB image it will use a Mat of CV_8UC3 (3 channels of CV_8U). CV_8U is the equivalent of byte in java. :)

I can give you and example of a method I use in Java (Android platform) to binarize a grayscale image:

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

Hope that helps.

like image 186
greven Avatar answered Oct 14 '22 22:10

greven


What is the standard way to access and modify individual elements of a Mat in OpenCV4Android?

A Mat is the thing we call a "matrix" in Mathematics - a rectangular array of quantities set out by rows and columns. Those "quantities" represent pixels in the case of an image Mat, (e.g. every element of a matrix can be the color of each pixel in an image Mat). From this tutorial:

enter image description here

in the above image you can see that the mirror of the car is nothing more than a matrix containing all the intensity values of the pixel points.

So how would you go about iterating through a matrix? How about this:

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

What is the standard way to access and modify individual elements of a Mat in OpenCV4Android?

You get the value of an element of Mat by using its function get(x)(y), where x is the first coordinate (row number) and y is the second coordinate (column number) of the element. For example to get the 4th element of the 7th row of a BGR image Mat named bgrImageMat, use the get method of Mat to get an array of type double, which will have a size of 3, each array element representing each of the Blue, Green, and Red channels of the BGR image format.

double [] bgrColor = bgrImageMat.get();

Also, what is the format of the data for BGR (which is the default, I think) and grayscale? edit: Let's make this more specific. mat.get(row, col) returns a double array. What is in this array?

You can read about BGR color format and grayscale from the web. e.g. BGR and Grayscale.

In short, BGR color format has 3 channels: Blue, Green and Red. So the double array returned by mat.get(row, col), when mat is a BGR image, is an array of size 3, and each of its elements contains the values of each of the Blue, green and red channels respectively.

Likewise, Grayscale format is a 1 channel color format, so the double returned will have a size of 1.

like image 37
Solace Avatar answered Oct 14 '22 22:10

Solace