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++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- 用批处理实现读取文本文件并实现超链接代码的输出[原创]_DOS/BAT_脚本之家
- ext读取两种结构的xml的代码
- Delphi实现读取系统时间与日期完整实例
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- Windows系统中使用C#读取文本文件内容的小示例
- C#从文件或标准输入设备读取指定行的方法
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结