简体   繁体   English

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

[英]c++ OpenCV : Convert mat to base64 and vice versa

There is anyway to convert opencv mat object to base64.无论如何都可以将 opencv mat 对象转换为 base64。

I was using the below url for base64 encoding and decoding:我使用以下 url 进行 base64 编码和解码:

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

Below is the code snippet:下面是代码片段:

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

There you go!你去吧! (C++11) (C++11)
Encode img -> jpg -> base64 :编码 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());

Decode base64 -> jpg -> img :解码 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);

Note that you can change JPEG compression quality by setting the IMWRITE_JPEG_QUALITY flag.请注意,您可以通过设置 IMWRITE_JPEG_QUALITY 标志来更改 JPEG 压缩质量。

I'm encountering nearly the same problem, but I'm trying to encode a Mat into jpeg format and then convert it into base64.我遇到了几乎相同的问题,但我正在尝试将 Mat 编码为 jpeg 格式,然后将其转换为 base64。

The code on that page works fine!该页面上的代码工作正常!

So here is my code:所以这是我的代码:

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

if you just want to convert a Mat into base64, you need make sure the Mat size and channels.如果您只想将 Mat 转换为 base64,则需要确保 Mat 大小和通道。 For a CV_8UC1, this will work:对于 CV_8UC1,这将起作用:

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

I have created an example for this using Qt5 and OpenCV:我使用 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);

I was looking for a solution to the same problem.我正在寻找相同问题的解决方案。 Using Jean-Christophe 's answer above, this worked for me:使用上面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());

Also, c++ std does not have a base64_encode implementation so you can look at this answer which aggregated a bunch of implementations.此外,C ++的std没有BASE64_ENCODE实现,所以你可以看看这个答案,聚集了一堆的实现。

Without using opencv, we can convert the image or file into base 64.Read the file byte by byte, store it in a buffer and base64 encode it.在不使用opencv的情况下,我们可以将图像或文件转换为base 64。逐字节读取文件,将其存储在缓冲区中并对其进行base64编码。 Cheers!干杯!

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM