当前位置: 首页 > article >正文

OpenCV学习笔记(二):读取mnist数据集

1.mnist简介

数据集主页链接:

MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burgesicon-default.png?t=M4ADhttp://yann.lecun.com/exdb/mnist/有四个文件:

train-images-idx3-ubyte: 训练集图像 60000张 尺寸28x28灰度图
train-labels-idx1-ubyte: 训练集标签 60000个 [0,9]
t10k-images-idx3-ubyte:  测试集图像 10000张 尺寸28x28灰度图
t10k-labels-idx1-ubyte:  测试集标签 10000个 [0,9]

对于图像文件而言,内部数据格式如下:

magic number:magic数
image number:图像数
image width :图像宽度
image height:图像高度
image data1 :图像数据1...
image dataN :图像数据N

对于标签文件而言,内部数据格式如下:

magic number:magic数
label number:标签数
label1      :标签1...
labelN      :标签N

2.mnist数据解析

实际就是按照文件内部排布顺序,依次来读取对应内容,具体代码如下:

#include "opencv2/opencv.hpp"
#include <iostream>#ifndef uchar
#	define uchar unsigned char
#endif int ReadNumber(FILE* fp, int len) {uchar* buffer = new uchar[len];fread(buffer, len, 1, fp);int result = 0;for (int i = 0; i < len; ++i) {int temp = buffer[i];result += temp << ((len - 1 - i) * 8);}delete[] buffer;return result;
}void ReadImage(FILE* fp, int len, uchar* buffer) {fread(buffer, len, 1, fp);
}int main() {const char* trainImgFile = "./train-images.idx3-ubyte";const char* trainLabelFile = "./train-labels.idx1-ubyte";FILE* imgIn = fopen(trainImgFile, "rb");if (imgIn == NULL) {std::cout << "open: " << trainImgFile << "failed." << std::endl;return -1;}fseek(imgIn, 0, 0);int imgMagic  = ReadNumber(imgIn, 4);int imgNum    = ReadNumber(imgIn, 4);int imgWidth  = ReadNumber(imgIn, 4);int imgHeight = ReadNumber(imgIn, 4);std::cout << "magic: " << imgMagic << " imgNum: " << imgNum << " imgWidth: " <<imgWidth << " imgHeight: " << imgHeight << std::endl;if (imgMagic != 2051) {std::cout << "error image magic number: " << imgMagic << std::endl;fclose(imgIn);return -1;}int imgSize = imgWidth * imgHeight;uchar* buffer = new uchar[imgSize];for (int i = 0; i < imgNum; ++i) {ReadImage(imgIn, imgSize, buffer);cv::Mat img = cv::Mat(imgHeight, imgWidth, CV_8UC1, buffer);cv::imwrite("train/image/" + std::to_string(i) + ".jpg", img);}delete[] buffer;fclose(imgIn);FILE* labelIn = fopen(trainLabelFile, "rb");int labelMagic = ReadNumber(labelIn, 4);int labelNum = ReadNumber(labelIn, 4);if (labelMagic != 2049) {std::cout << "error label magic number: " << labelMagic << std::endl;fclose(labelIn);return -1;}for (int i = 0; i < labelNum; ++i) {int label = ReadNumber(labelIn, 1);std::cout << "i: " << i << " label: " << label << std::endl;}fclose(labelIn);return 0;
}

这里说一下解析Number为什么这样写,中间为什么要引入一个int类型的temp,主要是uchar做移位操作会被截断,所以这里先赋值给一个int然后再进行移位操作。

参考资料:

[1] MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burgesicon-default.png?t=M4ADhttp://yann.lecun.com/exdb/mnist/

http://www.lryc.cn/news/2415577.html

相关文章:

  • 个人DIY一套全智能机器人基本流程
  • kindeditor在php中的使用,PHP中使用kindeditor
  • 微信小程序实现简单的树形选择控件------treeSelect
  • 干啥啥不行,摸鱼第一名
  • Dell BIOS/CMOS设置诠释
  • 干货分享新华三、华为、思科认证,到底选择哪一个?
  • 程序员常见系统错误代码大全:1到15841
  • echarts中国旅客迁徙地图
  • 使用virtualbox虚拟安装macos
  • 飞刀篮球搜众神推球,Linux 误删文件恢复命令及方法
  • 同步推上传破解ipa方法
  • 2021兴宁高考成绩查询,兴宁2021中考录取分数线查询
  • <img src=“x“ onerror=“alert(1)“>
  • android 人脸检测_人脸识别SAFR:“AI课堂”解锁线上课堂刷脸新花样
  • owasp core rules sets规则集深度分析与测试
  • cellfun函数使用方法 matlab,matlab中cellfun函数
  • VB中dim与set的区别
  • python pdb调试工具详解
  • ZigBee介绍
  • 坚果nuts 加速 官网_坚果R2手机发布 Smartisan OS 8.0公布推送计划
  • 计算机毕业设计django+vue基于技术的招聘网站系统设计与开发【开题+论文+程序】
  • 《计算机工程》2023投稿记录
  • python爬取网站m3u8视频,将ts解密成mp4,合并成整体视频
  • 支付宝SDK出现 'openssl/rsa.h' file not found
  • WPF 基础控件之托盘
  • 合成大西瓜小程序小游戏源码,仅供学习
  • 关于cvSnakeImage函数的问题
  • EDKII vUDK 2018 在linux下安装
  • 神奇输入法Fleksy免费开放Fleksy SDK,已集成多款应用
  • 服务器入门使用