您的位置:首页 > 编程语言 > C语言/C++

C++ Mnist Image读取

2016-05-11 11:25 411 查看

Lecun Mnist 数据链接

mnist_util.hpp(需要opencv库)

#ifndef MNIST_UTIL_HPP
#define MNIST_UTIL_HPP
#include <vector>
#include <opencv2/opencv.hpp>

class MnistUtil{

public:
MnistUtil();

inline int reverseInt(int i) {
unsigned char c1, c2, c3, c4;
c1 = i & 255;
c2 = (i >> 8) & 255;
c3 = (i >> 16) & 255;
c4 = (i >> 24) & 255;
return ((int) c1 << 24) + ((int) c2 << 16) + ((int) c3 << 8) + c4;
}

std::vector<cv::Mat> readMnistImage(char* path);

std::vector<double> readMnistLabel(char* path);

};

#endif


mnist_util.cpp

#include "mnist_util.hpp"
#include <fstream>
#include <vector>
#include <iostream>

using namespace std;
using namespace cv;

MnistUtil::MnistUtil(){

}

vector<Mat> MnistUtil::readMnistImage(char* path) {

ifstream is(path, ios::in | ios::binary);

vector<Mat> vec;

if (!is) {
cout << "cannot open file: "<< path  << endl;
} else {
int numHeader = 4;
int header[numHeader];
cout << "read image header" << endl;
is.read(reinterpret_cast<char*>(&header), sizeof(header));
if (is) {
for (int i = 0; i < numHeader; ++i) {
header[i] = reverseInt(header[i]);
}
cout << "read successful " << endl;
cout << "magic number: " << header[0] << endl;
cout << "image number: " << header[1] << endl;
cout << "rows  number: " << header[2] << endl;
cout << "cols  number: " << header[3] << endl;
vec.resize(header[1]);
unsigned char temp = 0;
for (int i = 0; i < header[1]; ++i) {
Mat image = Mat::zeros(header[2], header[3], CV_64FC1);

for (int r = 0; r < header[2]; ++r) {
for (int c = 0; c < header[3]; ++c) {
is.read((char*) &temp, sizeof(temp));
image.at < double > (r, c) = (double) temp;
}
}

vec[i] = image;
}
}
}
is.close();
return vec;
}

vector<double> MnistUtil::readMnistLabel(char* path){

ifstream is(path, ios::in | ios::binary);

vector<double> labels;

if (!is) {
cout << "cannot open file: "<< path << endl;
} else {
int numHeader = 2;
int header[numHeader];
cout << "read label header" << endl;
is.read(reinterpret_cast<char*>(&header), sizeof(header));
if (is) {
for (int i = 0; i < numHeader; ++i) {
header[i] = reverseInt(header[i]);
}

cout << "read successful " << endl;
cout << "magic number: " << header[0] << endl;
cout << "label number: " << header[1] << endl;

labels.resize(header[1]);
unsigned char temp = 0;
int size = sizeof(temp);
for (int i = 0; i < header[1]; ++i) {
is.read((char*) &temp,size);
labels[i]=(double)temp;
}
}
}
is.close();
return labels;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ minist image 读取