OpenCV дескрипторы изображений в JSON

Я хочу сохранить некоторые дескрипторы изображений на сервере, чтобы при сопоставлении изображений на телефоне Android я мог получать предварительно вычисленные дескрипторы изображений, а не делать это на лету. Я успешно создал приложение, которое может взять входное изображение и вывести наилучшее совпадение, но у меня возникли некоторые проблемы с размещением матрицы дескриптора изображения в файл JSON.

Ниже я поместил некоторый код, который я пытался адаптировать для выполнения нужной мне функции, но я столкнулся с ошибкой с этими строками:

mat.get(0, 0, data);

Ошибка, которую это дает:

Тип данных мат не совместим: 5

Матрица дескриптора имеет тип CV_32FC1, но она обрабатывает ее как CV_8SC1. Ниже приведен полный код, идея в том, что я передам матрицу дескриптора в matToJson, а затем сохраню вывод на сервере и затем использую matFromJson для получения содержимого файла JSON. Я также не могу разрешить Base64.DEFAULT, так как он показывает ошибку. Любая помощь будет принята с благодарностью.

    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)); //Error here as well .default does not exist

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

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

1 ответ

Решение

Нашел решение проблемы здесь, проблема была вызвана использованием неверного типа данных в массиве. вместо использования байта он должен был быть плавающим. однако решение, которое я упомянул выше, намного лучше, поскольку оно проверяет тип данных перед их кодированием.

Другие вопросы по тегам