我希望能够将矩阵持久化到磁盘上。 OpenCV的c,c ++版本支持cvWrite函数。我不是Android二进制文件的等效函数。还有其他选择吗?
答案 0 :(得分:1)
在C / 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;
}