Opencv:当使用运算符<<保存为原始数据时,将数据从文件读取到矩阵

Posted

技术标签:

【中文标题】Opencv:当使用运算符<<保存为原始数据时,将数据从文件读取到矩阵【英文标题】:Opencv: read data from file to a matrix, when saved as raw using operator << 【发布时间】:2015-04-30 15:19:54 【问题描述】:

使用 OpenCv,将数据从 cv::Mat 保存到原始文本文件非常容易:

cv::Mat m( 10, 10,CV_8UC1 );
// ... fill with values
std::ofstream f( "mydata.txt" );
f << m;

这会产生一个简单的布局,比如 int 的:

[1, 2, 3, .... ;
 4, 5, 6, .... ;
 ...
 7, 8, 9, ... ]

我的问题是:当以这种方式保存时,你如何读回数据(假设你知道矩阵的大小和类型)。 这会很棒:

cv::Mat m( 10, 10,CV_8UC1 );
std::ifstream f( "mydata.txt" );
f >> m;

但不幸的是它没有编译。我真的必须通过getline() 以及所有相关的检查、标记化……来做到这一点吗? (我的意思是,除了使用 YAML/XML as described here)。 Opencv 是否提供了一些更简单的语法?

如果你喜欢模板错误消息,这里是它们:

error: cannot bind ‘std::basic_istream<char>’ lvalue to ‘std::basic_istream<char>&&’
infile >> mymat;
          ^
error:   initializing argument 1 of ‘std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&&, _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = cv::Mat]’
 operator>>(basic_istream<_CharT, _Traits>&& __is, _Tp& __x)

【问题讨论】:

有什么理由不能使用 YAML 文件?你想要的听起来几乎和 YAML 提供的一样(YAML 文件实际上只是一个具有矩阵尺寸和类型的文本文件) @alrikai 不是真的,只是我希望有一个“反向”运算符,与 two questions 会有所帮助。 【参考方案1】:

1.您可以在link1 中像这里一样继续,他试图在他的垫子之间分开,自己检查一下,也许您的问题是如何存储您的数据而不是如何阅读它!

2.或者尝试使用“文件存储”并将您的文件保存为 XML/YML,如link2 中所建议的那样

【讨论】:

谢谢。 1 - your problem is how to stock your data:不,我想要的是读取数据,就像我在文件中写入数据一样简单:f &lt;&lt; m; 2 - 是的,我知道,我只是想看看是否有办法避免它.

以上是关于Opencv:当使用运算符<<保存为原始数据时,将数据从文件读取到矩阵的主要内容,如果未能解决你的问题,请参考以下文章

Opencv保存视频

使用 OpenCV 捕获和保存视频

openCV:将垫子保存到矢量<vector<int>>

使用opencv通过Filestorage保存时出错

opencv生成灰度图并保存

opencv,从图片上用鼠标拾取4个点的坐标,并将其保存在vector<Point>中,有问题,请教!