2013-05-01 13 views
20

Ich habe eine MatrixWie eine Float-Matte in eine Datei in OpenCV schreiben

Mat B(480,640,CV_32FC1);

Floating values..I enthält diese Matrix in eine Datei schreiben möchten, die in Notepad oder MS Word geöffnet werden konnte oder Excel, um die Werte innerhalb und für Speicher zu sehen .... imwrite function kann nur 8-bit oder 16-bit Bild speichern.

Lassen Sie Ihre Vorschläge fallen, wenn dies getan werden könnte ?? wenn ja, wie ??

+0

Sie können [die Matrix in eine XML- oder YAML-Datei schreiben] [1]. [1]: http://stackoverflow.com/questions/15115046/how-should-a-typical-yml-or-xml-matrix-look-for-opencv-use/15131776#15131776 – Saikat

Antwort

32

Verwendung von reinem OpenCV-API-Aufrufe:

// Declare what you need 
cv::FileStorage file("some_name.ext", cv::FileStorage::WRITE); 
cv::Mat someMatrixOfAnyType; 

// Write to file! 
file << someMatrixOfAnyType; 

Die Dateierweiterung kann xml oder yml sein. In beiden Fällen erhalten Sie eine kleine Kopfzeile, die Sie leicht entfernen/analysieren können, dann haben Sie Zugriff auf die Daten in einem Gleitkommaformat. ich diesen Ansatz erfolgreich (mit yml-Dateien) von Daten in Matlab und Matplotlib

bekommen die Daten zu erhalten:

  1. öffnen Sie die Datei mit einem beliebigen Editor
  2. dann außer den ganzen Text und Zahlen unterdrücken der Inhalt des Daten-Tags (dh die Pixelwerte).
  3. Wenn Sie fertig sind, speichern Sie Ihre Datei mit einer TXT- oder CSV-Erweiterung und öffnen Sie sie mit MATLAB (Ziehen und Ablegen funktioniert).

Voilà. Möglicherweise müssen Sie die resultierende Matrix in der Matlab-Befehlszeile umformen, wenn sie die Bildgröße nicht richtig erraten hat.

+0

Danke ... Ich kann die Datei mit gedit öffnen .. Können Sie mir sagen, wie man diese XML-Datei in Matlab oder Excel laden? .. –

+0

Ich habe die Antwort bearbeitet. – sansuiso

+17

Ich denke, Sie müssen der Matrix einen Namen geben, wie 'file <<" matName "<< someMatrixOfAnyType'; sonst bekomme ich diesen Fehler: 'OpenCV Error: Unspezifizierter Fehler (Kein Elementname wurde angegeben) im Operator <<, Datei /usr/local/include/opencv2/core/operations.hpp, Zeile 2910' –

14

Sie können cv::Mat in Textdatei schreiben, die einfache C++ - Dateiverarbeitung verwendet.

Hier ist, wie Sie es tun können:

#include <iostream> 
#include <fstream> 

using namespace std; 

void writeMatToFile(cv::Mat& m, const char* filename) 
{ 
    ofstream fout(filename); 

    if(!fout) 
    { 
     cout<<"File Not Opened"<<endl; return; 
    } 

    for(int i=0; i<m.rows; i++) 
    { 
     for(int j=0; j<m.cols; j++) 
     { 
      fout<<m.at<float>(i,j)<<"\t"; 
     } 
     fout<<endl; 
    } 

    fout.close(); 
} 

int main() 
{ 
    cv::Mat m = cv::Mat::eye(5,5,CV_32FC1); 

    const char* filename = "output.txt"; 

    writeMatToFile(m,filename); 

} 
+1

Möchten Sie diese Antwort zu akzeptieren too ... Aber nur 1 kann gegeben werden ... dieser einfache Ansatz funktioniert auch super! 1 –

+0

Ist Ihr Ansatz so zeiteffizient wie die angenommene Antwort? – smttsp

+0

@smttsp Ich glaube nicht. OpenCV-Implementierung kann optimiert werden. – sgarizvi

0

Verwendung Schreib binär:

FILE* FP = fopen("D.bin","wb"); 
    int sizeImg[2] = { D.cols , D.rows }; 
    fwrite(sizeImg, 2, sizeof(int), FP); 
    fwrite(D.data, D.cols * D.rows, sizeof(float), FP); 
    fclose(FP); 

dann können Sie in Matlab Lesegröße eingelesen und dann neu zu gestalten (type = single)

fp=fopen(fname); 
data=fread(fp,2,'int'); 
width = data(1); height = data(2); 
B = fread(fp,Inf,type); 

imageOut = reshape(B,[width,height])'; 

fclose(fp);