c ++ OpenCV:将mat转换为base64,反之亦然

时间:2015-04-21 12:29:29

标签: c++ opencv image-processing

有任何方法可以将opencv mat对象转换为base64。

我使用下面的url进行base64编码和解码:

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

以下是代码段:

const unsigned char * inBuffer = reinterpret_cast(image.data);

5 个答案:

答案 0 :(得分:5)

您去了! (C ++ 11)
编码img-> jpg-> base64:

        std::vector<uchar> buf;
        cv::imencode(".jpg", img, buf);
        auto *enc_msg = reinterpret_cast<unsigned char*>(buf.data());
        std::string encoded = base64_encode(enc_msg, buf.size());

解码base64-> jpg-> img:

        string dec_jpg =  base64_decode(encoded);
        std::vector<uchar> data(dec_jpg.begin(), dec_jpg.end());
        cv::Mat img = cv::imdecode(cv::Mat(data), 1);

请注意,您可以通过设置IMWRITE_JPEG_QUALITY标志来更改JPEG压缩质量。

答案 1 :(得分:2)

我遇到了几乎相同的问题,但我正在尝试将Mat编码为jpeg格式,然后将其转换为base64。

page上的代码工作正常!

所以这是我的代码:

VideoCapture cam(0);
cam>>img;
vector<uchar> buf;
imencode(".jpg", img, buf);
uchar *enc_msg = new uchar[buf.size()];
for(int i=0; i < buf.size(); i++) enc_msg[i] = buf[i];
string encoded = base64_encode(enc_msg, buf.size());

如果您只想将Mat转换为base64,则需要确保Mat尺寸和通道。对于CV_8UC1,这将起作用:

string encoded = base64_encode(img.data, img.rows * img.cols);

答案 2 :(得分:1)

我使用Qt5和OpenCV为此创建了一个示例:

cv::Mat1b image;
this->cameraList[i]->getImage(image);
std::vector<uint8_t> buffer;
cv::imencode(".png", image, buffer);
QByteArray byteArray = QByteArray::fromRawData((const char*)buffer.data(), buffer.size());
QString base64Image(byteArray.toBase64());
base64ImageList.append(base64Image);

答案 3 :(得分:0)

我一直在寻找解决同一问题的方法。使用上述Jean-Christophe的答案,这对我有用:

cv::Mat image = cv::imread("path/to/file");
std::vector<uchar> buffer;
buffer.resize(static_cast<size_t>(image.rows) * static_cast<size_t>(image.cols));
cv::imencode(".jpg", image, buffer);
std::string encoding = base64_encode(buffer.data(), buffer.size());

此外,c ++ std没有base64_encode实现,因此您可以查看汇总了许多实现的this答案。

答案 4 :(得分:0)

不使用opencv,我们可以将图像或文件转换为base 64。逐字节读取文件,将其存储在缓冲区中并对其进行base64编码。干杯!

FILE* f = fopen(imagePath, "rb");
    fseek(f, 0, SEEK_END);
    size_t length = ftell(f);
    rewind(f);

    BYTE* buffer = (BYTE*)malloc(length + 2);

    while ((!feof(f))) {
        BYTE c;
        if (fread(&c, 1, 1, f) == 0) break;                                                 //read byte by byte of the PNG image file
        buffer[i++] = (int)c;
    }
    fclose(f);

    string base64String = base64_encode(&buffer[0], i + 1);