向量<float>写入文件
vector<float> write to a file
我需要编写一个类型向量<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)
计算缓冲区的大小会更快!
相关文章:
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- Caffe在net_.reset上打印整个protext文件(new Net<float>(model_file,TEST))
- 如何在 c++ 中将数据从文件读取到 int/float 值
- 写入向量<向量<float>>到二进制文件
- 从字符串转换为float时,丢失文件中的第一行元素
- 为什么我的方法不从文件.txt中读取float类型
- 头文件中定义的Const float**
- <float> 使用 copy+ 将文件流式传输到矢量back_inserter
- 如何将矢量<矢量<矢量> >保存在<float>文件中并检索数据?
- 如果要读取随机森林(opencv3.0)的xml文件,则标签类型必须为float
- 向量<float>写入文件