【问题标题】:C++ Opencv load CSV file as cv::MatC++ Opencv 将 CSV 文件加载为 cv::Mat
【发布时间】:2014-02-25 16:40:30
【问题描述】:

我将 cv::Mat 保存为工作正常的 CSV 文件,但是当我去加载它并将其转换回 cv::Mat 时,某些东西被损坏了。当我打印出 cv::Mat 的内容时,它们与 csv 文件的内容不同。当我显示 Mat 对象时,我会看到一个宽阔的白色窗口。

cv::imwrite("cameraFrame1.jpg", frame);
outFile.open("cameraFrame1.csv");
outFile << cv::format(frame, "CSV") << std::endl;
outFile.close();

...

CvMLData mlData;
mlData.read_csv("cameraFrame1.csv");
const CvMat* tmp = mlData.get_values();
cv::Mat img(tmp, true);
tmp->CvMat::~CvMat();

std::cout << "img: " << img << std::endl;

cv::namedWindow("img");
cv::imshow("img", img);
cv::waitKey(0);

编辑:

我完全不喜欢这种方法,如果有更好的方法可以将图像保存到 CSV 然后读入,我会很乐意这样做。这样做的目的是将图像保存为原始数据,很可能保存在数据库中,然后可以在 matlab、python、c++ 等中再次打开。

【问题讨论】:

  • 为什么不使用 imwrite() 将其保存为 png 文件?这是无损压缩的,几乎可以在任何地方读回(Matlab、Python、libpng ...)。它甚至可以存储在数据库中。

标签: c++ opencv csv


【解决方案1】:

我需要设置图像深度和通道,即c++中的cv::Mat类型,以及尺寸

cv::imwrite("cameraFrame1.jpg", frame);
outFile.open("cameraFrame1.csv");
outFile << cv::format(frame, "CSV") << std::endl;
outFile.close();

...

CvMLData mlData;
mlData.read_csv("cameraFrame1.csv");
const CvMat* tmp = mlData.get_values();
cv::Mat img(tmp, true);

// set the image type
img.convertTo(img, CV_8UC3);

// set the image size
cv::resize(img, img, cv::Size(320, 256));

tmp->CvMat::~CvMat();

std::cout << "img: " << img << std::endl;

cv::namedWindow("img");
cv::imshow("img", img);
cv::waitKey(0);

【讨论】:

  • 你为什么需要那个resize?对于彩色图像,您保存的是每行 320*3 个数字的 csv 文件,当您将其读回并调整大小时,它将变成灰度图像。
  • 对不起,这太晚了,但是您为什么认为图像会变成灰度?转换为正在转换为 3 个通道,cv::resize docs 中没有任何内容表明它正在更改图像的通道。
猜你喜欢
  • 2022-06-25
  • 2012-07-17
  • 2017-06-03
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
  • 2015-10-09
  • 2018-04-16
相关资源
最近更新 更多