当前位置: 首页 > 面试题库 >

Java中的OpenCV Mat对象序列化

东郭自强
2023-03-14
问题内容

我试图序列化一对映射并获得如下异常:

 java.io.NotSerializableException: org.opencv.core.Mat

有某种方式可以将此序列化吗?


问题答案:

我从这里做了一些改进。在这里测试和工作SerializationUtils类

public static String matToJson(Mat mat){
    JsonObject obj = new JsonObject();

    if(mat.isContinuous()){
        int cols = mat.cols();
        int rows = mat.rows();
        int elemSize = (int) mat.elemSize();
        int type = mat.type();

        obj.addProperty("rows", rows);
        obj.addProperty("cols", cols);
        obj.addProperty("type", type);

        // We cannot set binary data to a json object, so:
        // Encoding data byte array to Base64.
        String dataString;

        if( type == CvType.CV_32S || type == CvType.CV_32SC2 || type == CvType.CV_32SC3 || type == CvType.CV_16S) {
            int[] data = new int[cols * rows * elemSize];
            mat.get(0, 0, data);
            dataString = new String(Base64.encodeBase64(SerializationUtils.toByteArray(data)));
        }
        else if( type == CvType.CV_32F || type == CvType.CV_32FC2) {
            float[] data = new float[cols * rows * elemSize];
            mat.get(0, 0, data);
            dataString = new String(Base64.encodeBase64(SerializationUtils.toByteArray(data)));
        }
        else if( type == CvType.CV_64F || type == CvType.CV_64FC2) {
            double[] data = new double[cols * rows * elemSize];
            mat.get(0, 0, data);
            dataString = new String(Base64.encodeBase64(SerializationUtils.toByteArray(data)));
        }
        else if( type == CvType.CV_8U ) {
            byte[] data = new byte[cols * rows * elemSize];
            mat.get(0, 0, data);
            dataString = new String(Base64.encodeBase64(data));
        }
        else {

            throw new UnsupportedOperationException("unknown type");
        }
        obj.addProperty("data", dataString);

        Gson gson = new Gson();
        String json = gson.toJson(obj);

        return json;
    } else {
        System.out.println("Mat not continuous.");
    }
    return "{}";
}

public static Mat matFromJson(String json){


    JsonParser parser = new JsonParser();
    JsonObject JsonObject = parser.parse(json).getAsJsonObject();

    int rows = JsonObject.get("rows").getAsInt();
    int cols = JsonObject.get("cols").getAsInt();
    int type = JsonObject.get("type").getAsInt();

    Mat mat = new Mat(rows, cols, type);

    String dataString = JsonObject.get("data").getAsString();
    if( type == CvType.CV_32S || type == CvType.CV_32SC2 || type == CvType.CV_32SC3 || type == CvType.CV_16S) {
        int[] data = SerializationUtils.toIntArray(Base64.decodeBase64(dataString.getBytes()));
        mat.put(0, 0, data);
    }
    else if( type == CvType.CV_32F || type == CvType.CV_32FC2) {
        float[] data = SerializationUtils.toFloatArray(Base64.decodeBase64(dataString.getBytes()));
        mat.put(0, 0, data);
    }
    else if( type == CvType.CV_64F || type == CvType.CV_64FC2) {
        double[] data = SerializationUtils.toDoubleArray(Base64.decodeBase64(dataString.getBytes()));
        mat.put(0, 0, data);
    }
    else if( type == CvType.CV_8U ) {
        byte[] data = Base64.decodeBase64(dataString.getBytes());
        mat.put(0, 0, data);
    }
    else {

        throw new UnsupportedOperationException("unknown type");
    }
    return mat;
}


 类似资料:
  • 是否有一种方法可以从数据库中读取序列化对象。ser文件并更新或删除已序列化的对象之一? 下面是我的代码,读取的对象类型'驱动程序':

  • 以下代码导致此异常: 所以问题是:如何在GSON序列化和反序列化的泛型HashMap中获得正确的实例?

  • 本文向大家介绍java对象的序列化和反序列化,包括了java对象的序列化和反序列化的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java对象的序列化和反序列化,供大家参考,具体内容如下 1. 什么是序列化        将对象转换为字节流保存起来,比如保存到文件里,并在以后还原这个对象,这种机制叫做对象序列化。(补充一句:把对象保存到永久存储设备上称为持久化) 2. 怎么实现序列化

  • 错误: java.lang.ClassNotFoundException:testprocedure.tp$3在java.net.URLClassLoader$1上运行(未知源)在java.net.URLClassLoader上运行(未知源)在java.security.accessController.doprivileged(本机方法)在java.net.URLClassLoader.find

  • 本文向大家介绍Java中对象序列化与反序列化详解,包括了Java中对象序列化与反序列化详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java中对象序列化与反序列化。分享给大家供大家参考。具体如下: 一、简介 对象序列化(Serializable)是指将对象转换为字节序列的过程,而反序列化则是根据字节序列恢复对象的过程。 序列化一般用于以下场景: 1.永久性保存对象,保存对象的字节序列

  • 问题内容: 我可能会尝试以困难的方式执行此操作,所以请让我知道是否有更好的解决方案。 我正在用Java开发一个简单的文字游戏,您可以通过GUI选择动作。我有几个班级正在尝试序列化一个是播放器,另一个是NPC。是否有一种简单的方法可以将一个以上的对象(播放器和NPC)序列化到同一文件中?我可以序列化一个对象并将其加载回游戏中。 我会以错误的方式处理吗?有没有更简单的方法来尝试保存游戏状态? 如果我有