Search code examples
arraysopencvjavacv

OpenCV / How to handle CvMat arrays in java


How to read/write from/to an array of CvMat (Java)? In the code below I put a CvMat to the array. But reading seems not to get the CvMat.

import com.googlecode.javacpp.Pointer;
import com.googlecode.javacv.cpp.opencv_core;
import static com.googlecode.javacv.cpp.opencv_core.CV_IS_MAT;
import com.googlecode.javacv.cpp.opencv_core.CvMat;
import static com.googlecode.javacv.cpp.opencv_core.IPL_DEPTH_32F;
import com.googlecode.javacv.cpp.opencv_core.IplImage;
import static com.googlecode.javacv.cpp.opencv_core.cvSize;

public class Ask {

    public static void main(String[] args) {
        new Ask().go();
    }

    private void go() {
        CvMat matQ = new opencv_core.CvMat(3); //array of 3 CvMat
        IplImage i = opencv_core.cvCreateImage(cvSize(10, 10), IPL_DEPTH_32F, 3); //just to have an image

        CvMat x = i.asCvMat(); //a CvMat of the image
        System.out.println(CV_IS_MAT(x)); //true, it's a mat

        matQ.position(0).put(x); //store it to array at position 0

        System.out.println(CV_IS_MAT(matQ.position(0))); //false!
        System.out.println(CV_IS_MAT(matQ)); //also false
    }
}

Solution

  • If you use Javacv(https://github.com/bytedeco/javacv) this is very easy task.

     String img ="Image.jpg";
     IplImage newImage0 = cvLoadImage(img);
     //import static org.bytedeco.javacpp.opencv_core.IplImage;
    

    or

      Mat newImage1 = imread(img);
      //import org.bytedeco.javacpp.opencv_core.Mat;
      //import static org.bytedeco.javacpp.opencv_highgui.*;
    

    If it is converted into CvMat type

    CvMat imgcvMat0 = newImage0.asCvMat();
    CvMat imgcvMat1 = new CvMat(newImage1);
    //import org.bytedeco.javacpp.opencv_core.Mat;
    

    same as you can convert it back to IplImage

    imgcvMat0.asIplImage();
    or 
    imgcvMat0.asBuffer();