c++ OpenCV:将mat转换为base64,反之亦然
c++ OpenCV : Convert mat to base64 and vice versa
无论如何都可以将opencv mat对象转换为base64。
我使用以下网址进行base64编码和解码:
http://www.adp-gmbh.ch/cpp/common/base64.html
下面是代码片段:
const unsigned char* inBuffer = reinterpret_cast(image.data);
你去吧!(C++11)
Encoding 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 压缩质量。
我遇到了几乎相同的问题,但我正在尝试将 Mat 编码为 jpeg 格式,然后将其转换为 base64。
该页面上的代码工作正常!
所以这是我的代码:
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());
如果您只想将垫子转换为base64,则需要确保垫子大小和通道。对于CV_8UC1,这将起作用:
string encoded = base64_encode(img.data, img.rows * img.cols);
我使用 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);
我正在寻找解决同一问题的方法。使用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实现,因此您可以查看此答案,它聚合了一堆实现。
在不使用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);
相关文章:
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 无法解码base64+deflate数据
- 在C++中,将int值赋给enum,反之亦然
- 如何在 c++ 中将所有大写字母转换为字符串中的小写字母,反之亦然?
- 将通用引用强制转换为可调用的 void 指针,反之亦然
- 用非原子更新原子变量,反之亦然
- 从向量到空指针的 memcpy(反之亦然)不起作用
- Base64 图像编码不正确
- 将基类分配给派生对象,反之亦然,以C++以及静态和动态对象之间的差异
- 编译时 Base64 解码 C++
- Base64 图像比较
- 如何在 OpenCL 中将小写转换为大写,反之亦然
- 将 BGR 图像转换为 jpeg 格式的 base64 字符串
- 如何将CNG密钥转换为OpenSSL EVP_PKEY(反之亦然)?
- C++ - 使用结构数据类型将单词中的单个小写字符更改为大写,反之亦然
- 如何在 c++ 中将 IStream 转换为 Base64 字符串
- 快速将无符号字符的向量强制转换为POD结构的向量,反之亦然
- 在C++中,将无符号整数转换为八进制表示,反之亦然的最佳方法是什么
- 使用C++将越南语字符从ISO88591、UTF8、UTF16BE、UTF16LE和UTF16编码为十六进制,反之亦然
- c++ OpenCV:将mat转换为base64,反之亦然