C++/opencv/pcl实现按时间创建文件夹并保存图片和点云
本人做的是双目视觉方向,有个应用场景就是采集大量的3d数据保存下来,作为后续开发的数据集使用。为此就需要开发保存的功能,并且是大量连续的采集保存,所以用时间来作为命名方式保存数据,要结合opencv和pcl一起使用。
#define _SILENCE_FPOS_SEEKPOS_DEPRECATION_WARNING
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<Windows.h>
#include<direct.h>
#include<fstream>
#include<sstream>
#include<Shlwapi.h>
#pragma comment(lib, "shlwapi.lib")
#include <opencv2\opencv.hpp>
#include<opencv2/core/types.hpp>
#include<opencv2/core/core.hpp>
#include <pcl/io/pcd_io.h>
#include<pcl/io/ply_io.h>
using namespace pcl;
using namespace cv;
using namespace std;
class FileOperation
{
public:
FileOperation();
~FileOperation();
public:
void saveDataInFolder(string initFolderName,vector<Mat>&leftImgs, vector<Mat>&rightImgs, PointCloud<PointXYZRGB>&resultCloud);
private:
string WORD2string(WORD w);
bool IsFolderExist(string strName);
string getCurTimeString();
string getCurTimeStringInf();
};
FileOperation::FileOperation()
{
}
FileOperation::~FileOperation()
{
}
string FileOperation::WORD2string(WORD w)
{
char tmpbuff[16];
sprintf_s(tmpbuff, "%d", w);
string res = tmpbuff;
return res;
}
string FileOperation::getCurTimeString()
{
SYSTEMTIME curTime;
GetLocalTime(&curTime);
string curTimestr= WORD2string(curTime.wYear)+ WORD2string(curTime.wMonth) + WORD2string(curTime.wDay) + WORD2string(curTime.wHour) + WORD2string(curTime.wMinute) + WORD2string(curTime.wSecond);
return curTimestr;
}
string FileOperation::getCurTimeStringInf()
{
SYSTEMTIME curTime;
GetLocalTime(&curTime);
string curTimestr = WORD2string(curTime.wYear)+"年" + WORD2string(curTime.wMonth) + "月" + WORD2string(curTime.wDay) + "日" + WORD2string(curTime.wHour) + "时" + WORD2string(curTime.wMinute) + "分" + WORD2string(curTime.wSecond) + "秒";
return curTimestr;
}
bool FileOperation::IsFolderExist(string strName)
{
size_t size = strName.length();
wchar_t *buffer = new wchar_t[size + 1];
MultiByteToWideChar(CP_ACP, 0, strName.c_str(), size, buffer, size * sizeof(wchar_t));
buffer[size] = 0; // 确保以 '\0' 结尾
BOOL bExist = PathIsDirectory(buffer);
delete buffer;
return bExist == FALSE ? false : true;
}
void FileOperation::saveDataInFolder(string initFolderName, vector<Mat>&leftImgs, vector<Mat>&rightImgs, PointCloud<PointXYZRGB>&resultCloud)
{
bool isinitFolderExit = IsFolderExist(initFolderName);//判断根文件夹是否存在
if (!isinitFolderExit)
{
_mkdir(initFolderName.c_str());//如果根文件夹不存在则创建
}
string firstTime = getCurTimeStringInf();
string firstTimestr = getCurTimeString();
string dirName = initFolderName + "\\" + firstTime;
_mkdir(dirName.c_str());//创建实时文件夹
for (int i = 0; i < leftImgs.size(); i++)
{
imwrite(dirName + format("\\left%d.bmp", i), leftImgs[i]);
}
for (int i = 0; i < rightImgs.size(); i++)
{
imwrite(dirName + format("\\right%d.bmp", i), rightImgs[i]);
}
pcl::io::savePCDFile(dirName + "\\"+ firstTimestr +".pcd", resultCloud);
pcl::io::savePLYFile(dirName + "\\" + firstTimestr + ".ply", resultCloud);
std::ofstream fout(dirName + "\\log.txt");
fout << "本文件夹创建时间为:" + firstTime + "\n";
fout << "本文件夹存完数据时间为:" + getCurTimeStringInf() + "\n";
fout.close();
}
int main()
{
FileOperation saveDataFile;
string initdirName = "Data";//保存数据的根文件夹
Mat source = imread("test.bmp");//读取一张图片用于测试
PointCloud<PointXYZRGB> sourceCloud;//读取一个点云
pcl::io::loadPCDFile("cloud_cluster_0.pcd", sourceCloud);
vector<Mat> leftImgs;
vector<Mat> rightImgs;
for (int i = 0; i < 10; i++)
{
leftImgs.push_back(source);
rightImgs.push_back(source);
}
saveDataFile.saveDataInFolder(initdirName,leftImgs, rightImgs, sourceCloud);
system("pause");
return 0;
}
实现的效果见下图:
按时间创建的文件夹:
文件夹里的具体文件情况:log.txt文件中记录了文件夹的创立时间以及保存完数据的结束时间