#include <iostream>
#include <fstream>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
//把大端数据转换为我们常用的小端数据
uint32_t swap_endian(uint32_t val)
{
val = ((val << 8) & 0xFF00FF00) | ((val >> 8) & 0xFF00FF);
return (val << 16) | (val >> 16);
}
int main()
{
/// image
ifstream in("/home/lwd/code/cpp/data/train-images.idx3-ubyte", ios::in | ios::binary);
int magic;
unsigned char *a = (unsigned char *)&magic;
unsigned char b;
// information
for (int i = 0; i < 4; ++i)
{
in >> noskipws >> b;
a[3] = b;
in >> noskipws >> b;
a[2] = b;
in >> noskipws >> b;
a[1] = b;
in >> noskipws >> b;
a[0] = b;
cout << magic << endl;
}
for (int i = 0; i < 60000; ++i)
{
char *pixels = new char[28 * 28];
in.read(pixels, 28 * 28);
cv::Mat src(28, 28, CV_8UC1);
for (int j = 0; j < 28; ++j)
{
uchar *data = src.ptr<uchar>(j);
for (int k = 0; k < 28; ++k)
{
data[k] = pixels[j * 28 + k];
}
}
if (i % 10000 == 0)
cout << i << endl;
// 5-length name
char name[] = {"a/00000.png"};
int tmp = i;
for (int j = 6; j > 1; --j)
{
name[j] = tmp % 10 + '0';
tmp = tmp / 10;
if (tmp == 0)
break;
}
cv::imwrite(name, src);
}
in.close();
// label ///
ifstream lab("/home/lwd/code/cpp/data/train-labels.idx1-ubyte", ios::in | ios::binary);
ofstream out("../mnist.txt");
int aa;
char bb;
// information
for (int i = 0; i < 2; ++i)
{
lab.read((char *)&aa, 4);
cout << swap_endian(aa) << endl;
}
for (int i = 0; i < 60000; ++i)
{
lab.read(&bb, 1);
char name[] = {"a/00000.png"};
int tmp = i;
for (int j = 6; j > 1; --j)
{
name[j] = tmp % 10 + '0';
tmp = tmp / 10;
if (tmp == 0)
break;
}
out << name << " " << (int)bb << endl;
}
lab.close();
out.close();
return 0;
}
MNIST转化成图片和标签文件
最新推荐文章于 2022-08-14 18:21:38 发布