【问题标题】:Does the Android OpenCV binary have data persistence functions?Android OpenCV 二进制文件有数据持久化功能吗?
【发布时间】:2014-02-21 08:26:08
【问题描述】:

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

【问题讨论】:

    标签: android opencv


    【解决方案1】:

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

    XML/YAML Persistence

    XML/YAML Persistence (C API)

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

    【讨论】:

      【解决方案2】:

      由于 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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-04
        • 2020-07-13
        • 2021-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-16
        相关资源
        最近更新 更多