【发布时间】:2014-02-21 08:26:08
【问题描述】:
我希望能够将矩阵保存到磁盘。 OpenCV 的 c,c++ 版本支持 cvWrite 函数。我不知道 Android 二进制文件的等效功能。还有其他选择吗?
【问题讨论】:
我希望能够将矩阵保存到磁盘。 OpenCV 的 c,c++ 版本支持 cvWrite 函数。我不知道 Android 二进制文件的等效功能。还有其他选择吗?
【问题讨论】:
在 C/C++ 中,您可以在所有支持的平台上拥有完整的 API:
Android Java API 不导出持久化 API,但某些类为其配置提供了 Save/Load 方法。
【讨论】:
由于 OpenCV4Android 还没有自己的持久性,在我看来,最通用的存储 Mat 的方法是首先将其转换为 JSON 等数据交换格式。
在您能够进行该转换后,您可以灵活地存储它。 JSON 很容易转换为字符串和/或通过网络连接发送。
使用 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;
}
【讨论】: