我需要编写一个类型向量<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)
计算缓冲区的大小会更快!