Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

c++ OpenCV : Convert mat to base64 and vice versa

There is anyway to convert opencv mat object to base64.

I was using the below url for base64 encoding and decoding:

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

Below is the code snippet:

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

like image 660
Amarnath R Avatar asked Apr 21 '15 12:04

Amarnath R


2 Answers

There you go! (C++11)
Encode 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 :

        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.

like image 138
Jean-Christophe Avatar answered Oct 08 '22 14:10

Jean-Christophe


I'm encountering nearly the same problem, but I'm trying to encode a Mat into jpeg format and then convert it into 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. For a CV_8UC1, this will work:

string encoded = base64_encode(img.data, img.rows * img.cols);
like image 3
Jason Avatar answered Oct 08 '22 14:10

Jason