2015-07-13 4 views
0

Я использую OpenCV для сохранения .yml. Вот мой код, который я использовалПрочтите файл YAML в OpenCV

FileStorage fs; 
fs.open("test", FileStorage::WRITE); 
for (unsigned int i = 0; i < (block_hist_size * blocks_per_img.area()) ; i++) 
{ 
fs << "features" << dest_ptr[i]; 
} 
fs.release(); 

Здесь выход YAML файл

%YAML:1.0 
features: 1.5302167832851410e-01 
features: 1.0552208870649338e-01 
features: 1.6659785807132721e-01 
features: 2.3539969325065613e-01 
features: 2.0810306072235107e-01 
features: 1.2627227604389191e-01 
features: 8.0759152770042419e-02 
features: 6.4930714666843414e-02 
features: 6.1364557594060898e-02 
features: 2.1614919602870941e-01 
features: 1.4714729785919189e-01 
features: 1.5476198494434357e-01 

Может кто-то помочь мне, чтобы прочитать файл YML обратно dest_ptr. Мне нужны только значения с плавающей запятой

+0

Я думаю, выше не будет работать. FileStorage - это в основном хранилище ключей, ваши ключи не уникальны. Что такое dest_ptr? вы не можете положить его в cv :: Mat или такой? (легче читать) – berak

+0

Это функции HOG только для блоков. С ниже я получаю все нули. Я пытаюсь понять это @berak – shah

ответ

1

Вы не можете использовать один и тот же ключ для нескольких значений. В вашем случае вы должны сохранить его как вектор функций. См. Код ниже

FileStorage fs, fs2; 
fs.open("test.yml", FileStorage::WRITE); 
fs << "features" << "["; 
for (unsigned int i = 0; i < 20; i++) { 
    fs << 1.0/(i + 1); 
} 
fs << "]"; 
fs.release(); 

fs2.open("test.yml", FileStorage::READ); 
vector<float> a; 
fs2["features"] >> a; 
+0

Я получаю все ноль @Tal Darom – shah

+0

нормально, я пропустил тот факт, что вы используете один и тот же ключ для всех функций. обновил мой ответ –

+0

Да, одна и та же ключевая функция - ошибочное условие. Я пытаюсь решить это. – shah

1

Вы должны неправильно понимать спецификацию YAML, потому что то, что вы производите с кодом, не является файлом YAML.
Через ключах отображения YAML файлов должен быть уникальными в соответствии с Определения для generic mapping (и вы используете общее отображение, как вы не задающий тег):

Definition: 

    Represents an associative container, where each key is unique in the 
    association and mapped to exactly one value. YAML places no restrictions on 
    the type of keys; in particular, they are not restricted to being scalars. 
    Example bindings to native types include Perl’s hash, Python’s dictionary, 
    and Java’s Hashtable. 

реальной проблемы заключается что вы пытаетесь сделать простой YAML-эмиттер, выполняющий строчную запись. Вы должны были создать структуру данных, которая вам нужна в структуре C++ и emitted that, тогда YAML был бы прав (если излучатель не глючит).

В зависимости от того, какой структуры файла, который вы выбрали, вы, возможно, получили:

%YAML:1.0 
- features: 1.5302167832851410e-01 
- features: 1.0552208870649338e-01 
- features: 1.6659785807132721e-01 
- features: 2.3539969325065613e-01 
- features: 2.0810306072235107e-01 
- features: 1.2627227604389191e-01 
- features: 8.0759152770042419e-02 
- features: 6.4930714666843414e-02 
- features: 6.1364557594060898e-02 
- features: 2.1614919602870941e-01 
- features: 1.4714729785919189e-01 
- features: 1.5476198494434357e-01 

(последовательность отображений одиночного ключа/значения) или:

%YAML:1.0 
features: 
- 1.5302167832851410e-01 
- 1.0552208870649338e-01 
- 1.6659785807132721e-01 
- 2.3539969325065613e-01 
- 2.0810306072235107e-01 
- 1.2627227604389191e-01 
- 8.0759152770042419e-02 
- 6.4930714666843414e-02 
- 6.1364557594060898e-02 
- 2.1614919602870941e-01 
- 1.4714729785919189e-01 
- 1.5476198494434357e-01 

(отображение одного ключ к единственному значению, которое является последовательностью)

Как вы сами испытали, нетривиально создать правильный YAML для структуры данных, даже более простой, чем при использовании строковой записи. Если начать с соответствующей структурой данных и испускают эту структуру, вы также знаете, что вы можете использовать ту же самую структуру, чтобы прочитать его обратно.


В моем опыте то же самое справедливо и для генерации XML/HTML/Файлы CSV/INI, имеющие правильную структуру данных, и использование излучателя обходит ошибки в выходном формате, компенсируя любую немного более высокую сложность исходного кода.

+0

Да, теперь я понимаю. Большое вам спасибо за подробное описание. Вскоре я попытался прочитать эту функцию, я получил одно и то же ключевое исключение. @Anthon – shah