1. C++11 ifstream和ofstream读写二进制文件
std::ofstream Frame::mfKeyOut("/home/ai/work/tum-data/key.bin", std::ios::binary | std::ios::out);
std::ofstream Frame::mfDescOut("/home/ai/work/tum-data/desc.bin", std::ios::binary | std::ios::out);
std::ifstream Frame::mfKeyIn("/home/ai/work/tum-data/key.bin", std::ios::binary | std::ios::in);
std::ifstream Frame::mfDescIn("/home/ai/work/tum-data/desc.bin", std::ios::binary | std::ios::in);
std::vector<cv::KeyPoint> mvKeys, mvKeysRight;
cv::Mat mDescriptors, mDescriptorsRight; // the address of vecotr is continous (similar to realloc)
void initOut()
{
std::string keyFileName("/home/ai/work/tum-data/key.bin");
std::string descFileName("/home/ai/work/tum-data/desc.bin");
if(!mfKeyOut || !mfKeyOut.is_open())
{
mfKeyOut.open(keyFileName.c_str(), std::ios::binary | std::ios::out);
}
if(!mfDescOut || !mfDescOut .is_open())
{
mfDescOut .open(descFileName.c_str(), std::ios::binary | std::ios::out);
}
}
void initIn()
{
std::string keyFileName("/home/ai/work/tum-data/key.bin");
std::string descFileName("/home/ai/work/tum-data/desc.bin");
if(!mfKeyIn || !mfKeyIn.is_open())
{
mfKeyIn.open(keyFileName.c_str(), std::ios::binary | std::ios::in);
}
if(!mfDescIn || !mfDescIn .is_open())
{
mfDescIn .open(descFileName.c_str(), std::ios::binary | std::ios::in);
}
}
void saveData()
{
// generate the data for mvKeys and mDescriptors
//(*mpORBextractorLeft)(im,cv::Mat(),mvKeys,mDescriptors);
save the keypoints, it's a vector
int numKeys = mvKeys.size();
mfKeyOut.write((char*)&numKeys, sizeof(int));
mfKeyOut.write((char*)&mvKeys[0], numKeys * sizeof(cv::KeyPoint));
// save the descriptors, it's a Mat (nkeypoints, 32, CV_8U)
int matSize[2];
matSize[0] = mDescriptors.rows; // nKeyPoints
matSize[1] = mDescriptors.cols; // 32
mfDescOut.write((char*)&matSize[0], 2 * sizeof(int));
mfDescOut.write((char*)mDescriptors.data, matSize[0]*matSize[1]*sizeof(char));
}
void readData()
{
int numKeys;
mfKeyIn.read((char*)&numKeys, sizeof(int));
mvKeys.resize(numKeys);
mfKeyIn.read((char*)&mvKeys[0], numKeys * sizeof(cv::KeyPoint));
int matSize[2];
mfDescIn.read((char*)&matSize[0], 2 * sizeof(int));
if( matSize[0] == 0 )
{
mDescriptors.release();
}
else
{
mDescriptors.create(matSize[0], matSize[1], CV_8U);
mfDescIn.read((char*)mDescriptors.data, matSize[0]*matSize[1]*sizeof(char));
}
}
void Close()
{
if(mfKeyOut.is_open())
{
mfKeyOut.close();
}
if(mfDescOut.is_open())
{
mfDescOut.close();
}
if(mfKeyIn.is_open())
{
mfKeyIn.close();
}
if(mfDescIn.is_open())
{
mfDescIn.close();
}
}