Android OpenCV二进制文件是否具有数据持久性功能?

时间:2012-03-06 19:28:15

标签: android opencv

我希望能够将矩阵持久化到磁盘上。 OpenCV的c,c ++版本支持cvWrite函数。我不是Android二进制文件的等效函数。还有其他选择吗?

2 个答案:

答案 0 :(得分:1)

在C / C ++中,您在所有支持的平台上都拥有完整的API:

XML/YAML Persistence

XML/YAML Persistence (C API)

Android Java API不会导出持久性API,但有些类为其配置提供了Save / Load方法。

答案 1 :(得分:0)

因为OpenCV4Android还没有自己的持久性,在我看来,存储Mat的最通用的方法是首先将它转换为像JSON这样的数据交换格式。

在您能够进行转换后,您可以灵活地存储它。 JSON很容易转换为String和/或通过网络连接发送。

使用OpenCV C ++ you are able to store data as YAML,但这不适用于Android,就像Andrey Kamaev指出的那样。这里的JSON与YAML具有相同的目的。

要解析Java中的JSON,您可以使用这个易于使用的library Google GSON

这是我第一次尝试做到这一点(我做了一个简单的测试并且有效,让我知道是否有问题):

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();    

        byte[] data = new byte[cols * rows * elemSize];

        mat.get(0, 0, data);

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

        // We cannot set binary data to a json object, so:
        // Encoding data byte array to Base64.
        String dataString = new String(Base64.encode(data, Base64.DEFAULT));

        obj.addProperty("data", dataString);            

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

        return json;
    } else {
        Log.e(TAG, "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();

    String dataString = JsonObject.get("data").getAsString();       
    byte[] data = Base64.decode(dataString.getBytes(), Base64.DEFAULT); 

    Mat mat = new Mat(rows, cols, type);
    mat.put(0, 0, data);

    return mat;
}