2012-04-25 15 views
3

私は.yamlファイルから行列を読み込むしようとしていますが、OpenCVのは私に次のエラーを与える:OpenCVのStoragefileエラー:

OpenCV Error: Parsing Error (myFile.yaml(1): valid xml should start with ') OpenCV Error: Parsing Error (myFile.yaml(1): Tag should start with '<'> in unknown function)

これが正常に動作whcihストレージファイル、に私の書き込みです:

cv::FileStorage fs("myFile.yaml", cv::FileStorage::APPEND); 
while(counter<_imgPtrVector.size()){  
    unsigned char* _pointer=(unsigned char*)_imgPtrVector.at(counter); 
    cv::Mat _matrixImage(cv::Size(width,height), CV_8UC1,_pointer , cv::Mat::AUTO_STEP);  
    fs <<"Matrix"<<_matrixImage; 
    counter++; 
} 

しかし、同じファイルからデータをロードしたいとき、私はそれらのエラーを受け取りました。これはストレージファイルから読み取るためのコードです:

cv::FileStorage f("myFile.yaml", cv::FileStorage::READ); 
cv::Mat mat(cv::Size(width,height), CV_8UC1); 
if(f.isOpened()){ 
    cv::FileNode n = f["Matrix"]; 
    if (n.type() != cv::FileNode::SEQ){ 
    std::cout << "error!"; 
    } 
    f["Matrix"] >> mat; 
} 
+0

追加する情報がある場合は、独自の質問を編集して追加してください。あなたが実際に書いたものを書いたように見えるので、他人の答えを編集しないでください。 –

+0

こんにちはルーク申し訳ありませんが、私は意図していませんでした。 – user261002

+0

あなた自身の質問を編集するもう1つの点は、編集内容がすぐに表示されることです。他のユーザーの回答を編集すると、それらの編集内容は他のユーザーが表示する前に承認する必要があり、編集内容が拒否された場合は表示されません。カールの答えに対するあなたの編集が実際に拒否されたようです。 –

答えて

2

問題は、常に既存のファイルに追加されている可能性があります。したがって、コードを次のように変更する必要があります。

FileStorage fs("test.yml", FileStorage::WRITE); 

これは、プログラムを実行するたびにファイルを再作成します。

OpenCVのドキュメントはかなり明確であるXML/YAML永続性を持つhow to write上の例があります。

#include "opencv2/opencv.hpp" 
#include <time.h> 

using namespace cv; 

int main(int, char** argv) 
{ 
    FileStorage fs("test.yml", FileStorage::WRITE); 

    fs << "frameCount" << 5; 
    time_t rawtime; time(&rawtime); 
    fs << "calibrationDate" << asctime(localtime(&rawtime)); 
    Mat cameraMatrix = (Mat_<double>(3,3) << 1000, 0, 320, 0, 1000, 240, 0, 0, 1); 
    Mat distCoeffs = (Mat_<double>(5,1) << 0.1, 0.01, -0.001, 0, 0); 
    fs << "cameraMatrix" << cameraMatrix << "distCoeffs" << distCoeffs; 
    fs << "features" << "["; 
    for(int i = 0; i < 3; i++) 
    { 
     int x = rand() % 640; 
     int y = rand() % 480; 
     uchar lbp = rand() % 256; 

     fs << "{:" << "x" << x << "y" << y << "lbp" << "[:"; 
     for(int j = 0; j < 8; j++) 
      fs << ((lbp >> j) & 1); 
     fs << "]" << "}"; 
    } 
    fs << "]"; 
    fs.release(); 
    return 0; 
} 

をそしてhow to readを示した別の例があります。

+0

リンクありがとうございました。ちょうどもう1つの質問、私はMATLABの行列を処理する私たちのチーム内の別の人にこのファイルを渡す必要があります、私はファイルを読むためにyamlmatlabライブラリがあることを理解していますが、opencvは、 matlabのための行列?私に教えてください。 – user261002

+1

MEXに関連するものがあるようですが、私はそれが何であるかわかりません。 – karlphillip

+0

ありがとう、最初にファイルに書き込んでストリームを閉じるコードを実行すると面白いです。ファイルから読み込んだコードは正常に動作しますが、格納されたファイルからデータを読み込む場合、同じ例外が発生します。 – user261002

関連する問題