【问题标题】:IplImage/Mat to byte array and back with JavaCV 1.2IplImage/Mat 到字节数组并使用 JavaCV 1.2 返回
【发布时间】:2017-03-28 00:57:22
【问题描述】:

“已经回答”的话题似乎太多次了,但我还是找不到可行的解决方案。我需要用 JavaCV 序列化 IplImages 和 Mats。我不能使用文件系统,我必须坚持 JavaCV 1.2/JavaCPP 1.2.4/OpenCV 3.1(注意:我不能使用 OpenCV 自己的 Java 包装 - 我必须使用 JavaCV)。我在 Stackoverflow 上找到了一些建议,但它们都是:1)使用不推荐使用的方法,或者 2)使用不再存在的方法。我知道 IplImages 和 Mats 很容易互换,因此一个解决方案很容易适用于另一个。理想的解决方案是将 IplImage/Mat 转换为字节数组并返回的方法。希望大家帮忙。

【问题讨论】:

    标签: serialization javacv iplimage


    【解决方案1】:

    我有一个针对最新 JavaCV 的解决方案。实际上,有几个。我在处理某些图像时遇到了问题,因此我第二次尝试转换为字节数组时产生了更一致的结果。 这里的解决方案在 Scala 中。

    要将图像数据转换为字节数组,您需要获取字节。

    Mat m = new Mat(iplImage);
    ByteBuffer buffer = this.image.asByteBuffer();
    Mat m = new Mat(this.image);
    int sz = (m.total() * m.channels());
    byte[] barr = new byte[sz]();
    m.data().get(barr);
    

    转换为 java.nio.ByteBuffer,使用图像的总大小(我转换为垫子),然后获取数据。我忘记了 m.total * m.channels 是否返回 double、long、int 或 float。我在 Scala 中使用 .toInt。

    另一种选择是使用 BufferedImage。我的一些图像仅使用 JavaCV 就显得有些奇怪。

    BufferedImage im = new Java2DFrameConverter().convert(new OpenCVFrameConverter.ToIplImage().convert(this.image))
    BytearrayOutputstream baos = new ByteArrayOutputStream();
    byte[] barr = null;
    try{
        ImageIO.write(im,"jpg",baos);
        baos.flush();
        barr = baos.toByteArray();
    }finally{
        baos.close();
    }
    //This could be try with resources but the original was in Scala.
    

    为了从字节数组转换为 IplImage,我实际上使用了缓冲图像以提高可靠性。

    ImplImage im = null;
    InputStream in = new ByteArrayInputStream(bytes);
    try {
        Mat m = new Mat(image.getHeight,image.getWidth,image.getType,new BytePointer(ByteBuffer.wrap(image.getRaster.getDataBuffer.asInstanceOf[DataBufferByte].getData)));
        im = new IplImage(m);
    }finally{
        in.close();
    }
    //Again this could be try with resources but the original example was in Scala
    

    【讨论】:

    • 这正是我一直在寻找的,除了我完全不了解 Scala。有人会费心用 Java 重新编码吗?
    • 给我一分钟。会有2个。这来自我的回购github.com/SimplrTek/GoatImaging2
    • @Icofresi 转换非常简单。我给你留了一些笔记。 JavaCV 示例使用 Scala,因为它可以在编译 JVM 字节码时与 Java 库进行交互。
    • @Icofresi 我的博客有更多关于 JavaCV 的信息以及一系列示例dadruid5.com/2017/02/15/java-cv-basics-iplimage
    • 你的博客很棒。很大的帮助。非常感谢。如果您允许我提出两个问题:您认为从 bytedeco 的 JavaCV 包装转向 OpenCV 自己的包装是否值得?在哪里可以找到 OpenCV 的 contrib 包(即 jar 和 dll/so 文件)的预构建二进制文件?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 2013-03-03
    • 2013-05-01
    • 2015-05-24
    • 2014-07-30
    • 1970-01-01
    • 2014-10-21
    相关资源
    最近更新 更多