2013-02-18 134 views
0

我有一个程序,其中我计算了多个帧的平均值,当我保存这个平均值时,我得到了一个965KB的文件,但我做了同样的事情基于OpenCV的SCILAB我得到5.93MB,这听起来更合理。反正我decid使用fwrite来写我的框架,并在这里干了什么:获取cv的值:: Mat

cv::Mat meanFrame= cv::Mat::zeros(height,width,CV_32FC3); 
cv::Mat frameR; 
FILE* inpR = NULL; 
...... //after calculating the meanFrame 
inpR = fopen("d:\\red.txt","wb+"); 
for(int row = 0; row < meanFrame.rows; ++row) { 
    for (int col = 0; col < meanFrame.cols; ++col) { 
     std::cout << meanFrame.at<cv::Vec3f>(row, col)[1] <<std::endl; 
     std::cout << meanFrame.at<cv::Vec3f>(row, col)[2] <<std::endl; 
     fwrite(&resultframe.at<cv::Vec3f>(row,col)[0],sizeof(float),1,inpR); 
    } 
} 
fcloseall(); 

我可以看到PF通道1和2,但是当我的OpenCV文件red.txt我得到:

€€<€€<€€<€€<€€<€€<€€<€€<€€<€€<€€<€€<€€....... 

任何想知道我在这里失去了什么,之后我想在SCILAB中加载这些文件,并将该帧保存为文件。 感谢您的帮助!

+4

你正在编写32位IEEE 754个二进制浮点值到一个文件中(每个浮动4个字节),而不是文本表示打印值号码。我不知道文件格式,但它可能使用文本数字,因此您希望在文件上使用'ostream'并将数据流式传输到该文件中(或手动将它们转换为字符串并将它们写入文件中)。如果是这种情况,您还应该编写分隔符(取决于文件格式规范)。 – leemes 2013-02-18 15:05:06

+0

@leemes谢谢你的回答,它确实与ostream一起工作,但我仍然不明白问题 – Engine 2013-02-18 15:26:54

+1

你期望'fwrite'做什么?你给它一个数据指针和一个大小,类型信息就会丢失。一个合适的选择(如果你坚持使用'C'文件IO)将是'fprintf','fwrite'的C++等价物是'ostream :: write'。 – filmor 2013-02-18 15:32:48

回答

2

您正在编写二进制数据 - 如何将浮点数存储在内存中。

当您查看该文件(在编辑器或命令行中)时,它认为这是文本数据,并试图将其解释为字符。

如果你需要的,如果你只是想看到的结果看这个数值到另一个程序,那么你可以使用的fwrite和FREAD(但如果你有不同的CPU,你可能有一个字节顺序问题)

,或者想稍微更多的工作,他们阅读到另一个程序,你可以只用

printf("%f", resultframe.at<cv::Vec3f>(row,col)[0]);