将 std::string 转换回使用 std::stringstream << cv::Mat 生成的 cv::Mat
Posted
技术标签:
【中文标题】将 std::string 转换回使用 std::stringstream << cv::Mat 生成的 cv::Mat【英文标题】:converting std::string back to cv::Mat which was generated with std::stringstream << cv::Mat 【发布时间】:2014-08-01 09:22:09 【问题描述】:我正在以特殊的数据格式保存立体视觉的校准数据,而不是来自 opencv 的给定 YAML 数据结构,这让我更加灵活。
因为我正在使用一个小技巧将 cv::Mat 转换为 std::string:
cv::Mat mat;
// some code
std::stringstream sstrMat;
sstrMat << mat;
saveFoo(sstrMat.str()); // something like this to save the matrix
作为输出,我从sstrMat.str()
变成我需要的所有数据:
[2316.74172937253, 0, 418.0432610206069;
0, 2316.74172937253, 253.5597342849773;
0, 0, 1]
我的问题是相反的操作:将此 std::string 转换回 cv::Mat。
我试过这样的代码:
cv::Mat mat;
std::stringstream sstrStr;
sstrStr << getFoo() // something like this to get the saved matrix
sstrStr >> mat; // idea-1: generate compile error
mat << sstrStr; // idea-2: does also generate compile error
我的所有尝试都失败了,所以我想问你是否知道 opencv 的方法可以将字符串转换回来,或者我是否编写了自己的方法来做到这一点。
【问题讨论】:
我很确定旧的 C 接口为您提供了使用 CvMat 加载/保存或读/写所需的内容,尽管文档对此非常神秘 【参考方案1】:您自己实现了operator<<(std::ostream&, const Mat&)
吗?如果是这样,你显然也必须自己做相反的操作,如果你愿意的话。
根据您的输出,我猜矩阵的类型是 CV_64F
,有 3 个通道。请务必记住矩阵的大小,并检查documentation。
您可以使用这些规范创建矩阵,并在读取流时用值填充它。互联网上有多个流式阅读示例,但在您的情况下,这很容易。将不需要的字符 ([ ] , ;
) 与 std::istream::read
一起忽略到虚拟缓冲区中,然后使用 operator>>(std::istream&, double)
取回您的值。
它最酷的地方在于,您可以像在标准库容器上一样遍历cv::Mat
s。因此,如果您使用的是 C++11,它可能看起来像这样(未经测试):
int size[2] = x, y; // matrix cols and rows
cv::Mat mat(3, size, CV_F64); // 3-dimensional matrix
for(auto& elem : mat)
cv::Vec3d new_elem; // a 3D vector with double values
// read your 3 doubles into new_elem
// ...
elem = new_elem; // assign the new value to the matrix element
同样,我没有广泛使用 OpenCV,所以请参阅文档以检查一切是否正确。
【讨论】:
以上是关于将 std::string 转换回使用 std::stringstream << cv::Mat 生成的 cv::Mat的主要内容,如果未能解决你的问题,请参考以下文章
将 std::__cxx11::string 转换为 std::string
将 std::__cxx11::string 转换为 std::string