vector <float>写入文件</float>

时间:2014-04-28 05:35:00

标签: c++ opencv

我需要写一个类型向量&lt;浮动&gt;在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();

2 个答案:

答案 0 :(得分:3)

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

所以你可以尝试这样的事情:

#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等...)都可以通过这种机制进行序列化

答案 1 :(得分:1)

这会奏效:

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();

或者像Mike建议的那样好多了:

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)计算缓冲区的大小会快一点!