将 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&lt;&lt;(std::ostream&amp;, const Mat&amp;) 吗?如果是这样,你显然也必须自己做相反的操作,如果你愿意的话。

根据您的输出,我猜矩阵的类型是 CV_64F,有 3 个通道。请务必记住矩阵的大小,并检查documentation。

您可以使用这些规范创建矩阵,并在读取流时用值填充它。互联网上有多个流式阅读示例,但在您的情况下,这很容易。将不需要的字符 ([ ] , ;) 与 std::istream::read 一起忽略到虚拟缓冲区中,然后使用 operator&gt;&gt;(std::istream&amp;, double) 取回您的值。

它最酷的地方在于,您可以像在标准库容器上一样遍历cv::Mats。因此,如果您使用的是 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的主要内容,如果未能解决你的问题,请参考以下文章

将 int 转换为 std::string

将 std::__cxx11::string 转换为 std::string

将 std::__cxx11::string 转换为 std::string

将 std::string 转换为 std::wstring 时,C++17 codecvt 抛出“错误转换”

将 void* 转换为 std::string

如何将 std::string 转换为 WCHAR