2015-10-30 2 views
1

Я извлекаю дескрипторы ORB изображения в android, используя opencv, который затем отправляется на сервер C++ с помощью сокета. Чтобы отправить его через сокет, я кодирую opencv mat дескрипторов на base64, используя приведенный ниже код java.Как восстановить закодированную Java-кодировку base64 в C++ cv :: Mat?

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."); 
      } 

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

Выход из matToJson() выглядит следующим образом:

{"rows":26,"cols":32,"type":0,"data":"aSbt5TQabzJ9qv7s3ymQchrEfSyp8OWO5v8nkG6oUiFAMLFkAExBEGCgJggSF0AyAFRoCAlgsADJ\niAUwQCBGImQwuWSATEEQYrAiCNY3QToBVGgYAWDxAMmIRTTAYEYibDS4YqltU5o7v68Y3/9JOpHX\n/RAaZvsiy991f8JzxnNJJ33lNB5vMn3ofkzfP5BwlkR/LKnw4c7n/yOQTuhTcUAwOWAATFEQYCAg\nCBYXADCAFFAIAWCwAMGJADBAAEYyYCAxQABNQQBgpCQIFhdAMgBUQAgAYLAAwYgBMEACRiJgMLFk\nAEhBAGKkJAgWF0AyAVRIGABgsADJiAUwwABGImwwuXW4bVGaM/+mGJ+3QTqV3v0YK3b5As/fNX3A\n4EZzQTCRZABMRQBgoiIIVjdAMgBUaBgBYLEAyagFMMBgRiJJPj33NJ57N33ofky/O5Bwhi5+DKm4\n4e7n/zKQSojDKXw0vHW4b1Gas7+2GNc3QzuF33wYKGT5AMvbdTTA8EZzQCCRZABIAQBgoCIIFhdA\nMgBUaBgBYKAAiYAFMEBgRiBpLv33NI9pN30p/1z/KZBwgqZ8DLn44S7G/zKQSoDDKUAhEUAQSEEA\nYAAgCBYXADAQVEBAASCgACGIABBAAEYgdDC8dahsURLiv7YYlzdAOofWfRiLRfsAy8t1NODgRnNA\nIJFEAEgAAGCgIAgWE0AyAFRIAABgoACJgAUwQCBGIEAikEQgCAACYKggaBITwDIAVEwAAGCAAImA\nJTBAIAIhYDC5dGhtURJzvzYYl7dAOofWfRgLePMA34t1cODARnNAIBFAEEgAAGAAIAgSEwAwEFxA\nYEEggAwhiAAQQAJGIHEy1WQoDEEQ4KiyTJcTwDIExGwMiWHRAMCpIbBogEIhcapb+iytSRfzGbNY\nt4PQeEuubByba8Ix2vkwWOiIwil4oLhwie1RjqK3rhiXtUIagdbsEBpr4wDb5XV54EDGYnAwuXSI\nbVEb4rekGBe3QDoB1mwYGm/6EtundT3g4MZicaBb+qytSZb+GbFct8PYeKGObBybbdox2ekyePiB\nwij1oBl6rKxJm/IRoVi300g4gYpsHDtr2jPZqzR42MDCIA\u003d\u003d\n"} 

закодированный base64 строка в "данных" ключ матрицы данных.

Вышеупомянутая строка json отправляется на сервер через сокет.

Теперь мне нужно преобразовать значение «данных» строки json обратно в cv :: Mat в C++, так как мне вернуть матрицу из указанной выше строки base64?

+0

'Выход кодируются матрица выглядит следующим образом:'. ? Ваша матрица? Я думаю, что это содержание «String json». – greenapps

+0

Не могли бы вы сначала показать, как вы на Android построили матрицу из этого текста json? – greenapps

+0

'так как я могу вернуть матрицу из указанной выше строки base64?'. Странный вопрос. Я бы подумал, что вы спросите: как мне вернуть матрицу из вышеупомянутой строки json? – greenapps

ответ

1

Предполагая, что вы читаете данные из JSON, вы можете создать Mat так:

int rows = 26; 
int cols = 32; 
int type = 0; 
string data = "aSbt5TQabz..."; 
string decoded_data = base64_decode(data); 
Mat m(rows, cols, type, (void*)decoded_data.data()); 

Код для base64_decode от here

ПРИМЕЧАНИЕ

мне нужно вручную конвертировать characted \u003D в =, чтобы заставить его работать. Вы можете избежать появления символов HTML с помощью Gson gson = new GsonBuilder().disableHtmlEscaping().create();. См. here.

Код:

#include <opencv2\opencv.hpp> 
#include <vector> 
#include <string> 
using namespace std; 
using namespace cv; 

// Code from: http://www.adp-gmbh.ch/cpp/common/base64.html 

static const std::string base64_chars = 
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
"abcdefghijklmnopqrstuvwxyz" 
"/"; 


static inline bool is_base64(unsigned char c) { 
    return (isalnum(c) || (c == '+') || (c == '/')); 
} 

std::string base64_decode(std::string const& encoded_string) { 
    int in_len = encoded_string.size(); 
    int i = 0; 
    int j = 0; 
    int in_ = 0; 
    unsigned char char_array_4[4], char_array_3[3]; 
    std::string ret; 

    while (in_len-- && (encoded_string[in_] != '=') && is_base64(encoded_string[in_])) { 
     char_array_4[i++] = encoded_string[in_]; in_++; 
     if (i == 4) { 
      for (i = 0; i < 4; i++) 
       char_array_4[i] = base64_chars.find(char_array_4[i]); 

      char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); 
      char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); 
      char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; 

      for (i = 0; (i < 3); i++) 
       ret += char_array_3[i]; 
      i = 0; 
     } 
    } 

    if (i) { 
     for (j = i; j < 4; j++) 
      char_array_4[j] = 0; 

     for (j = 0; j < 4; j++) 
      char_array_4[j] = base64_chars.find(char_array_4[j]); 

     char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); 
     char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); 
     char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; 

     for (j = 0; (j < i - 1); j++) ret += char_array_3[j]; 
    } 

    return ret; 
} 

int main() 
{ 
    // Read your JSON here... 

    int rows = 26; 
    int cols = 32; 
    int type = 0; 
    //string data(L"aSbt5TQabzJ9qv7s3ymQchrEfSyp8OWO5v8nkG6oUiFAMLFkAExBEGCgJggSF0AyAFRoCAlgsADJ\niAUwQCBGImQwuWSATEEQYrAiCNY3QToBVGgYAWDxAMmIRTTAYEYibDS4YqltU5o7v68Y3/9JOpHX\n/RAaZvsiy991f8JzxnNJJ33lNB5vMn3ofkzfP5BwlkR/LKnw4c7n/yOQTuhTcUAwOWAATFEQYCAg\nCBYXADCAFFAIAWCwAMGJADBAAEYyYCAxQABNQQBgpCQIFhdAMgBUQAgAYLAAwYgBMEACRiJgMLFk\nAEhBAGKkJAgWF0AyAVRIGABgsADJiAUwwABGImwwuXW4bVGaM/+mGJ+3QTqV3v0YK3b5As/fNX3A\n4EZzQTCRZABMRQBgoiIIVjdAMgBUaBgBYLEAyagFMMBgRiJJPj33NJ57N33ofky/O5Bwhi5+DKm4\n4e7n/zKQSojDKXw0vHW4b1Gas7+2GNc3QzuF33wYKGT5AMvbdTTA8EZzQCCRZABIAQBgoCIIFhdA\nMgBUaBgBYKAAiYAFMEBgRiBpLv33NI9pN30p/1z/KZBwgqZ8DLn44S7G/zKQSoDDKUAhEUAQSEEA\nYAAgCBYXADAQVEBAASCgACGIABBAAEYgdDC8dahsURLiv7YYlzdAOofWfRiLRfsAy8t1NODgRnNA\nIJFEAEgAAGCgIAgWE0AyAFRIAABgoACJgAUwQCBGIEAikEQgCAACYKggaBITwDIAVEwAAGCAAImA\nJTBAIAIhYDC5dGhtURJzvzYYl7dAOofWfRgLePMA34t1cODARnNAIBFAEEgAAGAAIAgSEwAwEFxA\nYEEggAwhiAAQQAJGIHEy1WQoDEEQ4KiyTJcTwDIExGwMiWHRAMCpIbBogEIhcapb+iytSRfzGbNY\nt4PQeEuubByba8Ix2vkwWOiIwil4oLhwie1RjqK3rhiXtUIagdbsEBpr4wDb5XV54EDGYnAwuXSI\nbVEb4rekGBe3QDoB1mwYGm/6EtundT3g4MZicaBb+qytSZb+GbFct8PYeKGObBybbdox2ekyePiB\nwij1oBl6rKxJm/IRoVi300g4gYpsHDtr2jPZqzR42MDCIA\u003d\u003d\n"); 
    string data = "aSbt5TQabzJ9qv7s3ymQchrEfSyp8OWO5v8nkG6oUiFAMLFkAExBEGCgJggSF0AyAFRoCAlgsADJ\niAUwQCBGImQwuWSATEEQYrAiCNY3QToBVGgYAWDxAMmIRTTAYEYibDS4YqltU5o7v68Y3/9JOpHX\n/RAaZvsiy991f8JzxnNJJ33lNB5vMn3ofkzfP5BwlkR/LKnw4c7n/yOQTuhTcUAwOWAATFEQYCAg\nCBYXADCAFFAIAWCwAMGJADBAAEYyYCAxQABNQQBgpCQIFhdAMgBUQAgAYLAAwYgBMEACRiJgMLFk\nAEhBAGKkJAgWF0AyAVRIGABgsADJiAUwwABGImwwuXW4bVGaM/+mGJ+3QTqV3v0YK3b5As/fNX3A\n4EZzQTCRZABMRQBgoiIIVjdAMgBUaBgBYLEAyagFMMBgRiJJPj33NJ57N33ofky/O5Bwhi5+DKm4\n4e7n/zKQSojDKXw0vHW4b1Gas7+2GNc3QzuF33wYKGT5AMvbdTTA8EZzQCCRZABIAQBgoCIIFhdA\nMgBUaBgBYKAAiYAFMEBgRiBpLv33NI9pN30p/1z/KZBwgqZ8DLn44S7G/zKQSoDDKUAhEUAQSEEA\nYAAgCBYXADAQVEBAASCgACGIABBAAEYgdDC8dahsURLiv7YYlzdAOofWfRiLRfsAy8t1NODgRnNA\nIJFEAEgAAGCgIAgWE0AyAFRIAABgoACJgAUwQCBGIEAikEQgCAACYKggaBITwDIAVEwAAGCAAImA\nJTBAIAIhYDC5dGhtURJzvzYYl7dAOofWfRgLePMA34t1cODARnNAIBFAEEgAAGAAIAgSEwAwEFxA\nYEEggAwhiAAQQAJGIHEy1WQoDEEQ4KiyTJcTwDIExGwMiWHRAMCpIbBogEIhcapb+iytSRfzGbNY\nt4PQeEuubByba8Ix2vkwWOiIwil4oLhwie1RjqK3rhiXtUIagdbsEBpr4wDb5XV54EDGYnAwuXSI\nbVEb4rekGBe3QDoB1mwYGm/6EtundT3g4MZicaBb+qytSZb+GbFct8PYeKGObBybbdox2ekyePiB\nwij1oBl6rKxJm/IRoVi300g4gYpsHDtr2jPZqzR42MDCIA==\n"; 

    string decoded_data = base64_decode(data); 

    Mat m(rows, cols, type, (void*)decoded_data.data()); 

    cout << m << endl; 

    return 0; 
} 
+0

Привет Мики, это сработало для меня. большое спасибо. – pallavi

+0

@pallavi Рад, что это помогло – Miki

Смежные вопросы