我需要写一个类型向量<浮动>在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();
答案 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)
计算缓冲区的大小会快一点!