OpenCV Mat to JavaCV Mat转换

时间:2014-08-27 19:02:02

标签: java android opencv javacv

我正在编写一个使用JavaCV进行面部识别的Android应用程序。我遇到了一个小问题,我需要将org.opencv.core.Mat转换为onCameraFrame(CvCameraViewFrame inputFrame)函数返回org.bytedeco.javacpp.opencv_core.Mat所需的org.bytedeco.javacpp.opencv_contrib.FaceRecognizer

我发现了类似的问题herehere,但都找不到合适的解决方案。

2 个答案:

答案 0 :(得分:2)

您可以使用java.awt.image.BufferedImage作为接口。

只需将 org.opencv.core.Mat 对象转换为 java.awt.image.BufferedImage ,然后将结果对象转换为 org .bytedeco.javacpp.opencv_core.Mat

现在,这些是您需要的功能:

1)将org.opencv.core.Mat转换为java.awt.image.BufferedImage:

strftime()

2)将java.awt.image.BufferedImage转换为org.bytedeco.javacpp.opencv_core.Mat:

public BufferedImage matToBufferedImage(Mat frame) {       
        int type = 0;
        if (frame.channels() == 1) {
            type = BufferedImage.TYPE_BYTE_GRAY;
        } else if (frame.channels() == 3) {
            type = BufferedImage.TYPE_3BYTE_BGR;
        }
        BufferedImage image = new BufferedImage(frame.width() ,frame.height(), type);
        WritableRaster raster = image.getRaster();
        DataBufferByte dataBuffer = (DataBufferByte) raster.getDataBuffer();
        byte[] data = dataBuffer.getData();
        frame.get(0, 0, data);
        return image;
    }

确保拥有所有必需的罐子和进口。

您可以更深入地了解JNI的内容,但对于测试用例,这应该足够了。

答案 1 :(得分:2)

简而言之,https://github.com/bytedeco/javacpp/issues/38#issuecomment-140728812记录了一种更简单,更有效的方法:

对于JavaCPP / JavaCV:

Mat mat2 = new Mat((Pointer)null) { { address = mat.getNativeObjAddr(); } };

对于OpenCV的官方Java API:

Mat mat = new Mat(mat2.address());

编辑OpenCVFrameConverter现在提供了一种更简便,更安全的方法,例如:

OpenCVFrameConverter.ToMat converter1 = new OpenCVFrameConverter.ToMat();
OpenCVFrameConverter.ToOrgOpenCvCoreMat converter2 = new OpenCVFrameConverter.ToOrgOpenCvCoreMat();
Mat mat = ...;
org.opencv.core.Mat cvmat = converter2.convert(converter1.convert(mat));
Mat mat2 = converter2.convert(converter1.convert(cvmat));