向量<float>写入文件

vector<float> write to a file

本文关键字:文件 float lt 向量 gt      更新时间:2023-10-16

我需要编写一个类型向量<float>到文件,在OpenCV中。我的部分代码是:

vector<float> descriptorsValues;
vector<Point> locations;
d.compute(img, descriptorsValues, Size(0,0), Size(0,0), locations);

我想将descriptosValues写入一个文件。我尝试过运算符重载,但不知道如何调用函数。

// Writing descriptorsValues to a file
fstream data_file;
data_file.open("hog_descriptors.bin", ios::out | ios::in | ios::binary);
fstream& operator << (fstream& o, const Point& e)
{
 return o << e.descriptorsValues;
}
vector<Point>::iterator pos;
for (pos = descriptorsValues.begin(); pos != descriptorsValues.end(); ++pos)
data_file << *pos << endl;
data_file.close();

我在你的帖子中读到你正在使用OpenCV。OpenCV中有一个序列化库(在OpenCV核心中),请参阅本页。

所以你可以试试这样的东西:

#include <opencv2/core/core.hpp>
#include <string>
using namespace cv;
int main(int _argc, const char ** _argv)
{
    std::vector<int> toto;
    toto.push_back(1);
    toto.push_back(2);
    string filename = "I.xml";
    FileStorage fs(filename, FileStorage::WRITE);        
    fs << "toto" << toto;
    fs.release();
}

仔细阅读OpenCV中关于序列化的页面,中有很多非常有趣的东西

如果你想阅读你的文件的内容,你可以继续使用这个代码:

std::vector<int> totoRead;
FileStorage fsRead(filename, FileStorage::READ);
fsRead["toto"] >> totoRead;
fsRead.release();
std::cout << totoRead[0] << "," << totoRead[1] << std::endl;

正如你所看到的,这很容易。OpenCV中出现的所有结构(cv::Mat等)都可以使用此机制进行序列化

这将起作用:

ofstream data_file;      // pay attention here! ofstream
data_file.open("hog_descriptors.bin", ios::out | ios::binary);
size_t size = descriptorsValues.size();
for (int i = 0; i < size; ++i)
{
    data_file.write(reinterpret_cast<char*>(&descriptorsValues[i]), sizeof(float));
}
data_file.close();

或者,就像迈克建议的那样,更好:

ofstream data_file;      // pay attention here! ofstream
data_file.open("hog_descriptors.bin", ios::out | ios::binary);
data_file.write(reinterpret_cast<char*>(&descriptorsValues[0]), descriptorsValues.size()*sizeof(float)); 
data_file.close();

为了读回它,你需要知道文件中向量上的项目数量。。。

ifstream data_file;      // NOW it's ifstream
data_file.open("hog_descriptors.bin", ios::in | ios::binary);
descriptorsValues.resize(NUMBER_OF_ITEMS);
data_file.read(reinterpret_cast<char*>(&descriptorsValues[0]), NUMBER_OF_ITEMS*sizeof(float));
data_file.close();

上面的这个也有效,因为向量中的数据保证按顺序对齐,所以如果你得到第一个项目的指针,用descriptorsValues.size() * sizeof(float)计算缓冲区的大小会更快!