當前位置: 妍妍網 > 碼農

OpenCV4中 Mat 物件 Base64 編解碼

2024-02-01碼農

點選上方 藍字 關註我們

微信公眾號: OpenCV學堂

關註獲取更多電腦視覺與深度學習知識

前言

很多時候在開發中,需要保存影像為文本形式,以便於儲存與傳輸。最常見的就是把圖檔編碼為Base64的字串儲存與傳輸,然後在需要的時候從儲存的字串再解碼為影像使用,我在OpenCV實驗大師的軟體開發中,對工作流涉及的影像儲存多數都是采用了這種方式,發現非常方面。

C++ Base64支持

OpenCV本身不支持把Mat物件轉換為Base64文本的相關操作,C++中Base64的編解碼有一個很好用的開原始碼,點選下面的連結即可檢視到:

https://github.com/ReneNyffenegger/cpp-base64

從這個上面直接下載整個倉庫程式碼,然後把兩個相關的原始碼檔:

base64.hBase64.cpp

放到計畫中,在需要參照的類或者檔中添加

#include"base64.h"

即可參照它的兩個相關API函式,分別表示base64編碼與解碼:

base64_encodebase64_decode

程式碼演示

讀入一張灰度影像,對得到Mat物件編碼為base64字串,程式碼實作如下:

Mat dannis = imread("D:/images/vm_test/llk_tpl.png", cv::IMREAD_GRAYSCALE);cv::imshow("gray", dannis);std::vector<uchar> buf;cv::imencode(".png", dannis, buf);auto *enc_msg = reinterpret_cast<unsignedchar*>(buf.data());std::string encoded = base64_encode(enc_msg, buf.size());std::cout << "base64 encode content" << std::endl;std::cout << encoded << std::endl;

讀入的灰度影像為

轉為對應的base64編碼為:

對應的字串基於base64解碼,重新構建為Mat物件,程式碼如下:

string dec_jpg = base64_decode(encoded);std::vector<uchar> data(dec_jpg.begin(), dec_jpg.end());cv::Mat dst = cv::imdecode(cv::Mat(data), 1);cv::imshow("base64_decode", dst);cv::waitKey(0);cv::destroyAllWindows();

執行結果如下:

完全沒有問題,OpenCV Mat物件的base64編解碼技能get了。

系統化學習直接掃碼檢視

推薦閱讀