1

iOSでアプリケーションを作成しており、keyPointのリスト(これは機能します)とMatから生成された画像を送信しOrbDescriptorExtractorます。画像の送信は機能します。受信したbase64はbase64送信と同じです。だから私の推測では、それはエンコードとデコードでうまくいかないでしょう。

左側の画像はエンコード前で、右側の画像はサーバーで受信されたデコードされた画像です。

base64より前 base64の後

これは(desc)画像をbase64でエンコードするコードです。Mat私が使用したbase64関数はこのサイトのものです。

char sendFile[1000];
char temp[100];

std::sprintf(temp, "^^%d^^%d^^", desc.cols, desc.rows);
strcat(sendFile, temp);

const unsigned char* inBuffer = reinterpret_cast<const unsigned char*>(desc.data);

strcat(sendFile, base64_encode(inBuffer, strlen((char*)inBuffer)).c_str());
strcat(sendFile, "\0");

この後、ファイルはサーバー上のHTTP Postで保存されexec()、PHPでC++スクリプトが開かれます。これは機能します。

この後、画像は次のようにデコードされます。

int processData(string input, int* width, int* height){
    int cur = 0, k = 0;
    for(unsigned int i = 0; i < input.length(); i++){
        if(input.substr(i, 2) == "^^"){
            if(cur == 0){
                k = i + 2;          
            }else if(cur == 1){
                *width = getIntFromString(input, k, i);         
                k = i + 2;
            }else{
                *height = getIntFromString(input, k, i);        
                break;
            }
            cur++;
        }
    }
    return 0;
}

int error, w, h;
string line, data;
ifstream file;

file.open(argv[1]);

if(file.is_open()){
    error = processData(line, &w, &h);
    if(error != 0){
        printf("Processing keypoints failed \n");
        return 1;
    } 
    getline(file, line);
    data = base64_decode(line);

    file.close();
}else{
    printf("Couldn't open file.\n");
    return 1;
}

Mat tex_des(Size(w, h), CV_8UC1, (void*)data.c_str());

データを失うことなく、OpenCVイメージを正しい方法で送信するにはどうすればよいですか?

4

2 に答える 2

3

バイナリデータでstr...関数を使用してはいけません!!

strlen((char *)inBuffer)が最初のゼロで停止しているため、間違った結果が得られます

バッファ長の代わりにdesc.total()を使用してください

于 2013-02-28T10:47:06.277 に答える
0

私は少し異なるアプローチを使用しています。私はそれを書きます、それが役立つことを願っています:

//Consider we have the image saved in UIImage
UIImage * myImage;

//Get the data 
NSData imageData = UIImageJPEGRepresentation(myImage, 1.0);

//I am using this extension to encode to base 64 (https://gist.github.com/Abizern/1643491)
//Article from the save author http://www.cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.html
NSString *encodedImage = [imageData base64EncodedString];

そして私encodedImageはサーバーに送ります。

于 2013-02-28T10:38:02.700 に答える