labelme json 文件中的imagedata 如何转为jpg图片 C++ 不用boost
时间: 2024-03-23 07:40:20 浏览: 135
在C++中将Labelme JSON文件中的imagedata转换为JPG格式的图片,可以按照以下步骤进行:
1. 打开Labelme的JSON文件,找到imagedata所在的字段。
2. 将imagedata字段中的Base64编码数据解码为二进制数据。
3. 将二进制数据保存为JPG格式的图片文件。
具体的C++代码示例如下:
```c++
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
// 读取JSON文件
ifstream ifs("example.json", ios::in);
string json_str((istreambuf_iterator<char>(ifs)), istreambuf_iterator<char>());
ifs.close();
// 找到imagedata字段
string imagedata_start = "\"imageData\":\"";
string imagedata_end = "\",\"shapes\":";
size_t pos1 = json_str.find(imagedata_start);
size_t pos2 = json_str.find(imagedata_end);
string imagedata = json_str.substr(pos1 + imagedata_start.length(), pos2 - pos1 - imagedata_start.length());
// 解码Base64编码
vector<unsigned char> im_bytes;
const char* p = imagedata.c_str();
size_t len = imagedata.length();
while (len > 0 && imagedata[len - 1] == '=')
--len;
size_t padding = imagedata.length() - len;
im_bytes.reserve((len + 3) / 4 * 3 - padding);
for (size_t i = 0; i < len; i += 4)
{
unsigned int chunk = 0;
chunk |= (p[i] <= '9' ? p[i] - '0' : p[i] - 'A' + 10) << 18;
chunk |= (p[i + 1] <= '9' ? p[i + 1] - '0' : p[i + 1] - 'A' + 10) << 12;
chunk |= (p[i + 2] <= '9' ? p[i + 2] - '0' : p[i + 2] - 'A' + 10) << 6;
chunk |= (p[i + 3] <= '9' ? p[i + 3] - '0' : p[i + 3] - 'A' + 10) << 0;
im_bytes.push_back((chunk >> 16) & 0xFF);
if (i + 1 < len)
im_bytes.push_back((chunk >> 8) & 0xFF);
if (i + 2 < len)
im_bytes.push_back((chunk >> 0) & 0xFF);
}
// 将二进制数据转换为OpenCV图像对象
Mat im = imdecode(im_bytes, IMREAD_COLOR);
// 保存为JPG格式的图片文件
imwrite("example.jpg", im);
return 0;
}
```
在上面的代码中,我们首先读取了JSON文件,并找到了imagedata字段中的Base64编码数据。然后,我们使用手写的Base64解码算法将Base64编码解码为二进制数据。接下来,我们使用OpenCV库将二进制数据转换为图像对象,并保存为JPG格式的图片文件。
阅读全文