Как создать этот файл YML в C ++ (с помощью OpenCV)

0

У меня есть yml файл, который создан в Matlab, и какое-то другое приложение может читать его без каких-либо проблем.

сгенерированный файл yml выглядит следующим образом:

%YAML:1.0
myitems:
  -
    l: !!opencv-matrix
      rows: 4
      cols: 1
      dt: d
      data: [1.6040597671471776e+03, -5.9317478925963056e-02, -4.0214684178724552e-04, -1.0686329088084243e-03]
    c: !!opencv-matrix
      rows: 2
      cols: 1
      dt: d
      data: [1.3524793229822997e+03, 1.8265878647908009e+03]
    t: !!opencv-matrix
      rows: 4
      cols: 4
      dt: d
      data: [9.3969262078590843e-01, 0.0000000000000000e+00, -3.4202014332566871e-01, -4.2438920171761561e-02, 0.0000000000000000e+00, 1.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 3.4202014332566871e-01, 0.0000000000000000e+00, 9.3969262078590843e-01, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 1.0000000000000000e+00]
  -
    l: !!opencv-matrix
      rows: 4
      cols: 1
      dt: d
      data: [1.6035513799260334e+03, -5.8611163583081945e-02, -1.9961041844717854e-03, -5.7772898125416506e-04]
    c: !!opencv-matrix
      rows: 2
      cols: 1
      dt: d
      data: [1.3748405387479991e+03, 1.8628349599457656e+03]
    t: !!opencv-matrix
      rows: 4
      cols: 4
      dt: d
      data: [-3.5201238807168519e-03, 9.3725029294111806e-01, -3.4863949447768083e-01, -4.2438920171761561e-02, -9.9998222086817701e-01, -1.6211348792076591e-03, 5.7384553018963221e-03, 0.0000000000000000e+00, 4.8131772679647451e-03, 3.4865349604369644e-01, 9.3723933604021081e-01, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 1.0000000000000000e+00]
  -
    l: !!opencv-matrix
      rows: 4
      cols: 1
      dt: d
      data: [1.5975668104752576e+03, -6.0221428459880273e-02, 8.9637904632662471e-04, -1.4944214307671109e-03]
    c: !!opencv-matrix
      rows: 2
      cols: 1
      dt: d
      data: [1.3643523108057761e+03, 1.8451412053529805e+03]
    t: !!opencv-matrix
      rows: 4
      cols: 4
      dt: d
      data: [-9.4399816022253547e-01, -6.0251161920311046e-04, -3.2995016362507984e-01, -4.2438920171761561e-02, 1.5488563810861311e-03, -9.9999540679978660e-01, -2.6052683623591024e-03, 0.0000000000000000e+00, -3.2994707839345838e-01, -2.9704139573240884e-03, 9.4399475745395067e-01, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 1.0000000000000000e+00]
  -
    l: !!opencv-matrix
      rows: 4
      cols: 1
      dt: d
      data: [1.5966964716049326e+03, -5.7396164460785576e-02, -1.9997766878354986e-03, -6.3293353675991561e-04]
    c: !!opencv-matrix
      rows: 2
      cols: 1
      dt: d
      data: [1.3583936708783401e+03, 1.8439285997544673e+03]
    t: !!opencv-matrix
      rows: 4
      cols: 4
      dt: d
      data: [-1.0822465368656472e-03, -9.3985931913280085e-01, -3.4156008107163421e-01, -4.2438920171761561e-02, 9.9999940770171103e-01, -9.7771219684243270e-04, -4.7819984029824587e-04, 0.0000000000000000e+00, 1.1549311909389662e-04, -3.4156039629630369e-01, 9.3985982058137330e-01, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 1.0000000000000000e+00]

У меня есть этот код в opencv (C++) для создания одного и того же файла yml:

 cv::FileStorage fs(fileName, cv::FileStorage::WRITE);
 fs << "myitems";
 fs<<"{" ;
 for(int i=0;i<4;i++)
 {
     fs<<"-" ;
     fs<<"{" ;

     fs<<"l"<<cv::Mat(l);
     fs<<"c"<<cv::Mat(c);
     fs<<"t"<<cv::Mat(t);
     fs << "}" ;
  }
  fs << "}" ;

но когда я запускаю этот код, я получаю ошибку: неправильное имя элемента в следующей строке:

fs<<"-";

Как создать аналогичный файл yml в opencv?

Обратите внимание, что поскольку файл создается с помощью matlab и используется в других приложениях, я не могу изменить формат yml файла.

Теги:
opencv
yaml

1 ответ

2
Лучший ответ

Вот как создать аналогичный файл YAML:

#include <opencv2/core/core.hpp>
#include <iostream>

int main()
{
    cv::FileStorage fs("out.yaml", cv::FileStorage::WRITE);
    fs << "myitems";
    fs << "[" ;
    for(int i=0; i<4; i++) {
        fs << "{" ;
        fs << "l" << cv::Mat::zeros(4,1,CV_64F);
        fs << "c" << cv::Mat::zeros(2,1,CV_64F);
        fs << "t" << cv::Mat::zeros(4,4,CV_64F);
        fs << "}" ;
    }
    fs << "]" ;

    return 0;
}

Узел верхнего уровня "myitems" представляет собой последовательность из 4 узлов ([, ..., ]). Каждый элемент последовательности является неназванным отображением ({, ..., }). Каждое из этих отображений содержит три матрицы с именем "l", "c" и "t".

Ещё вопросы

Сообщество Overcoder
Наверх
Меню