2013-02-18 143 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]);