专栏名称: OpenCV学堂
一个致力于计算机视觉OpenCV原创技术传播的公众号!OpenCV计算机视觉与tensorflow深度学习相关算法原创文章分享、函数使用技巧、源码分析与讨论、,计算机视觉前沿技术介绍,技术专家经验分享,人才交流,学习交流。
目录
相关文章推荐
芋道源码  ·  日常工作,MQ的8种常用使用场景 ·  昨天  
芋道源码  ·  面试通过,背调凉凉! ·  昨天  
芋道源码  ·  SpringBoot ... ·  2 天前  
芋道源码  ·  3月,Java岗又爆了?! ·  2 天前  
芋道源码  ·  为什么有的网站链接这么短? ·  3 天前  
51好读  ›  专栏  ›  OpenCV学堂

OpenCV4中 Mat 对象 Base64 编解码

OpenCV学堂  · 公众号  ·  · 2024-03-13 22:03

正文

点击上方 蓝字 关注我们

微信公众号: 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 buf;cv::imencode(".png", dannis, buf);auto *enc_msg = reinterpret_cast<unsigned char*>(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 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了。


系统化学习直接扫码查看

推荐阅读

OpenCV4.8+YOLOv8对象检测C++推理演示

总结 | OpenCV4 Mat操作全接触

三行代码实现 TensorRT8.6 C++ 深度学习模型部署







请到「今天看啥」查看全文