首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenCV Mat到JavaCV Mat转换

OpenCV Mat到JavaCV Mat转换
EN

Stack Overflow用户
提问于 2014-08-27 19:02:02
回答 2查看 6.1K关注 0票数 5

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

我发现了类似的问题-- 这里这里,但都没有找到可行的解决方案。

EN

回答 2

Stack Overflow用户

发布于 2018-07-20 09:52:02

简单地说,在https://github.com/bytedeco/javacpp/issues/38#issuecomment-140728812中有一种更简单、更有效的方法:

到JavaCPP/JavaCV:

代码语言:javascript
复制
Mat mat2 = new Mat((Pointer)null) { { address = mat.getNativeObjAddr(); } };

OpenCV的官方Java:

代码语言:javascript
复制
Mat mat = new Mat(mat2.address());

编辑OpenCVFrameConverter现在提供了一种更简单、更安全的方法来实现这一点,例如:

代码语言:javascript
复制
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));
票数 4
EN

Stack Overflow用户

发布于 2016-09-09 21:32:37

您可以使用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:

代码语言:javascript
复制
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;
    }

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

代码语言:javascript
复制
public Mat bufferedImageToMat(BufferedImage bi) {
        OpenCVFrameConverter.ToMat cv = new OpenCVFrameConverter.ToMat();
        return cv.convertToMat(new Java2DFrameConverter().convert(bi)); 
    }

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25535057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档