2014-02-25 733 views
2

我将cv :: Mat保存为一个可以正常工作的CSV文件,但是当我加载并将其转换回cv :: Mat时,某些内容已损坏。当我打印出cv :: Mat的内容时,它们与csv文件的内容不同。当我展示Mat对象时,我会看到一个宽阔的白色窗口。C++ Opencv加载CSV文件为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); 
tmp->CvMat::~CvMat(); 

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

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

编辑:

我不是在所有连接到这个方法,如果有更好的方法来保存到CSV图像,然后在它读成这样我会很高兴地移动到。这一点是将图像保存为原始数据,最有可能在数据库中,然后可以再次打开matlab,python,C++等。

+0

你为什么不把它保存为带有imwrite()的png文件?这是无损压缩,几乎可以在任何地方读回(Matlab,Python,libpng ...)。它甚至可以存储在数据库中。 – Sameer

回答

3

我需要设置图像深度和通道,这是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); 
+0

你为什么需要'resize'?对于彩色图像,您将每行保存一个带有320 * 3数字的csv文件,当您读取并重新调整大小时,它将成为灰度图像。 – zhangxaochen

+0

对不起,这是令人难以置信的晚,但你为什么认为图像将变成灰度?转换为转换为3个通道,[cv :: resize文档]中没有任何内容(http://docs.opencv.org/modules/imgproc/doc/geometric_transformations.html?highlight=resize#void%20resize(InputArray %20src,%20OutputArray%20dst,%20Size%20dsize,%20double%20fx,%20double%20fy,%20int%20interpolation))来建议它改变图像的通道。 – Rick