1

cv::imencodeOpenCV の Mat イメージがbase64 文字列を使用してエンコードされるアプリケーションを作成しようとしています。このために、 avector<unsigned char>を a に変換する必要がありconst unsigned char*ます。

これどうやってするの?

vector<unsigned char> buffer;

vector<int> compression_params;
compression_params.push_back(CV_IMWRITE_PXM_BINARY);
compression_params.push_back(0);

if(!cv::imencode(".ppm", desc, buffer, compression_params)){
    printf("Image encoding failed");
}

// This generates a error
string output = base64_encode(buffer.data(), buffer.size());
printf("Output: %s", output.c_str());

これは私が得るエラーです:EXC_BAD_ACCESS (code=1, address=0x2ffd7000)

アップデート


これでエラーは発生しなくなりましたが、変換のどこかで問題が発生しました。出力は、デコードした後の入力と同じではなく、ほとんどが A 文字で構成されています。これは現在のスクリプトです。

vector<unsigned char> buffer;

vector<int> compression_params;
compression_params.push_back(CV_IMWRITE_PXM_BINARY);
compression_params.push_back(1);

if(!cv::imencode(".pgm", desc, buffer, compression_params)){
    printf("Image encoding failed");
}

string output = base64_encode(buffer.data(), buffer.size());
printf("Output: %s", output.c_str());

vector から const unsigned char への変換が結果をめちゃくちゃにするので、これは別の質問であるべきではないと思います。前回はbase64_encodeが機能しました。

4

1 に答える 1

3

1 つの大きな問題は次のとおりです。

const char* s = base64_encode(reinterpret_cast<const unsigned char*>(buffer.data()), buffer.size()).c_str();

ここで、base64_encode関数は を返していstd::stringます。c_str()次に、基になるバッファーへのポインターを返すメソッドを呼び出しています。ただし、std::stringthen はすぐに範囲外になり、ダングリングポインターが残ります。

さらに、 reinterpret_cast はまったく必要ありません。キャストとは関係のないダングリングポインターが原因で、未定義の動作が発生しています。

に変更する必要があります

std::string s = base64_encode(buffer.data(), buffer.size());
于 2013-03-08T14:48:32.633 に答える