#include "BinaryDataSet.h"
#include<atlfile.h>
#include <cstdlib>
using namespace cv;
using namespace std;
vector<string> BinaryDataSet::getFileLists(string file_folder)
{
/*
param
file_folder: 文件夹路径
*/
file_folder += "/*.*";
const char *mystr = file_folder.c_str();
vector<string> flist;
string lineStr;
vector<string> extendName; //设置文件扩展名
extendName.push_back("JPG");
extendName.push_back("jpg");
extendName.push_back("bmp");
extendName.push_back("png");
extendName.push_back("tiff");
HANDLE file;
WIN32_FIND_DATA fileData;
char line[1024];
wchar_t fn[1000];
mbstowcs(fn, mystr, 999);
file = FindFirstFile(fn, &fileData);
FindNextFile(file, &fileData);
while (FindNextFile(file, &fileData))
{
wcstombs(line, (const wchar_t*)fileData.cFileName, 259);
lineStr = line;
// remove the files which are not images
for (int i = 0; i < 4; i++)
{
if (lineStr.find(extendName[i]) < 999)
{
flist.push_back(lineStr);
break;
}
}
}
return flist;
}
/*
从文件的绝对路径当中得到文件名
例如:"C:\\Users\\lyf\\Desktop\\test.bin",返回"test.bin"
*/
string BinaryDataSet::getFileName(string & filename)
{
/*
param
filename: 文件的绝对路径
*/
int iBeginIndex = filename.find_last_of("\\") + 1;
int iEndIndex = filename.length();
return filename.substr(iBeginIndex, iEndIndex - iBeginIndex);
cout << "Done!" << endl;
}
void BinaryDataSet::convertMat2Bin(cv::Mat & image, int label, FILE *& fp)
{
/*
param
iamge: 图片向量(一维)
label: 标签
fp: 二进制文件指针
*/
cout << "标签: " << label << endl;
fwrite(&label, sizeof(char), 1, fp); //将标签写入文件
int pixeCount = image.rows* image.cols; //计算图片像素个数
char *pData = (char*)image.data;
/*以下开始将像素值写入文件*/
for (int i = 0; i < pixeCount; ++i)
fwrite(&pData[i * 3], sizeof(char), 1, fp); //写入图片的R通道
for (int i = 0; i < pixeCount; ++i)
fwrite(&pData[i * 3+1], sizeof(char), 1, fp); //写入图片的G通道
for (int i = 0; i < pixeCount; ++i)
fwrite(&pData[i * 3+2], sizeof(char), 1, fp); //写入图片的B通道
}
/*读取图片并变形为一维向量*/
void BinaryDataSet::mat2Binary(string & image_file, int label, FILE *& fp)
{
/*
param
image_file: 文件的路径及名称
label: 标签
fp: 二进制文件指针
*/
Mat image = imread(image_file, IMREAD_UNCHANGED); //读取图片内容并存入image中
if (!image.data)
cout << "Image" << getFileName(image_file) << " load failed!" << endl;
else
{
if (image.channels() != 3) //通道转换,将不是彩色图像的转换为彩色图像
cv::cvtColor(image, image, CV_BGR2RGB);
Mat image_reshaped;
cv::resize(image, image_reshaped, cv::Size(_iWidth, _iHeight), CV_INTER_LINEAR); //将图片转换为以为向量
convertMat2Bin(image_reshaped, label, fp); //将一维向量的图片写入二进制文件
}
}
void BinaryDataSet::images2Binaryfiles(string filefolder, vector<string>& img_List, vector<int>& img_Labels, string filename)
{
/*
param
filefolder: 图片所在的文件夹路径
img_List: 文件名列表
img_Labels: 标签列表
filename: 二进制文件保存路径
*/
const int size_list = img_List.size(); //获取文件个数
FILE *fp = fopen(filename.c_str(), "wb"); //创建或打开要保存到的目标文件
if (fp == NULL) {
cout << "Open error!" << endl;
fclose(fp);
return;
}
for (int idx = 0; idx < size_list; ++idx)
{
string currentPath = filefolder + "\\"; //获得当前文件路径
currentPath += img_List[idx]; //获得要处理的文件名即路径
cout << "图片: " << img_List[idx]<<endl; //输出当前要处理的文件名
int len = img_List[idx].size(); //获得当前文件名的长度
//string s = img_List[idx].substr(len - 5, 1); //从文件名中获得类标签,例如112a.jpg,则 s = a
char s = img_List[idx][len-5];
cout <<"标签: "<< s << endl; //输出获得的类标签
/*接下来要将标签转换成数字*/
img_Labels[idx] = s - 'a';
cout << "数字: " << img_Labels[idx] << endl;
mat2Binary(currentPath, img_Labels[idx], fp);
}
}
/*该函数从二进制文件中读取图片,验证是否正确写入*/
void BinaryDataSet::readImage(string file_folder)
{
/*
param
file_folder: 二进制文件路径
*/
const char *mystr = file_folder.c_str();
FILE *fpr = fopen(mystr, "rb"); //打开二进制文件
if (fpr == NULL)
{
cout << "Open error!" << endl;
fclose(fpr);
return;
}
//以下循环验证二进制文件中前十个图片及标签是否正确
for (int i = 0; i < 10; ++i)
{
int label = -1;
fread(&label, sizeof(char), 1, fpr); //读取标签
cout << "标签: " << label << endl;
Mat image(_iHeight, _iWidth, CV_8UC3, Scalar::all(255)); //创建一个3通道的彩图,像素初值为255
int pixeCount = _iHeight*_iWidth;
char *pData = (char*)image.data;
//以下循环读取图片的像素值
for (int i = 0; i < pixeCount; ++i)
fread(&pData[i * 3], sizeof(char), 1, fpr); //R
for (int i = 0; i < pixeCount; ++i)
fread(&pData[i * 3+1], sizeof(char), 1, fpr); //G
for (int i = 0; i < pixeCount; ++i)
fread(&pData[i * 3+2], sizeof(char), 1, fpr); //B
imshow("测试图片", image); //显示图片
waitKey(0);
}
fclose(fpr);
}
模仿CIFAR数据集格式制作自己的数据集代码
需积分: 50 14 浏览量
2017-07-20
22:18:00
上传
评论
收藏 4KB ZIP 举报
YF_Li123
- 粉丝: 234
- 资源: 6
最新资源
- 论文(最终)_20240430235101.pdf
- 基于python编写的Keras深度学习框架开发,利用卷积神经网络CNN,快速识别图片并进行分类
- 最全空间计量实证方法(空间杜宾模型和检验以及结果解释文档).txt
- 5uonly.apk
- 蓝桥杯Python组的历年真题
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 前端开发技术实验报告:内含4四实验&实验报告
- Highlight Plus v20.0.1
- 林周瑜-论文.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈