yaml.scanner.ScannerError: при сканировании директивы

Я использую PyYAML для чтения файла, код Python:

with open('demo.yml') as f:
    dataMap = yaml.load(f)

демо.yml:

%YAML:1.0
my_svm: !!opencv-ml-svm
  svm_type: C_SVC
  kernel: { type:LINEAR }
  C: 1.

Тогда ошибка:

yaml.scanner.ScannerError: while scanning a directive
  in "demo.yml", line 1, column 1
expected alphabetic or numeric character, but found ':'
  in "demo.yml", line 1, column 6

Кто-нибудь Помогите мне?


person Calvin Zhang    schedule 22.03.2013    source источник


Ответы (3)


Директива должна быть %YAML 1.0 (без двоеточия). Вам также понадобится «начало документа» (---), чтобы отделить ваши директивы от документа. Например.:

%YAML 1.0
---
my_svm: !!opencv-ml-svm
  svm_type: C_SVC
  kernel: { type: LINEAR }
  C: 1.
person Jesse Beder    schedule 22.03.2013
comment
Спасибо, я пытался, но новая проблема yaml.scanner.ScannerError: при сканировании простого скаляра в demo.yml, строка 5, столбец 14 обнаружил неожиданное ':' в demo.yml, строка 5, столбец 18, почему здесь kernel: { type:LINEAR } это не правильно? - person Calvin Zhang; 22.03.2013
comment
OpenCV пишет %YAML:1.0 и нет ---, когда выводит документы yaml . opencv.org/modules/core/doc/xml_yaml_persistence.html, так что это ошибка opencv? На самом деле stackoverflow.com /questions/12058510/ решает эту проблему. - person Lucas W; 04.04.2014
comment
@LucasW, да, это ошибка opencv: yaml.org/spec/1.2/ спец.html#id2800401 - person Jesse Beder; 04.04.2014
comment
Действительно, реализация opencv YAML неполная, но это не ошибка opencv. Opencv создает файлы YAML 1.0, а PyYAML (YAML 1.1) несовместим с YAML 1.0. В YAML 1.0 директива представляет собой пару ключ:значение (yaml.org/spec/1.0/#id2558757) и двоеточие без пробела (yaml.org/spec/1.0/#id2489726< /а>). - person dai1741; 11.05.2014

вы можете изменить файл yaml, созданный opencv 3.0 file1, из opencv:

1 %YAML:1.0
2 my_svm: !!opencv-ml-svm
3   svm_type: C_SVC
4   kernel: { type:LINEAR }
5   C: 1.
6 ...

файл2:

1 my_svm: opencv-ml-svm
2   svm_type: C_SVC
3   kernel: { type: LINEAR }
4   C: 1.
5 ...

файл1 -> файл2:

  1. удалить строку 1
  2. удалить «!! opencv-ml-svm»
  3. добавить пробел после "type:" в строке 4

затем вы можете использовать yaml.load(filename) для загрузки ваших данных.

person hjq300    schedule 28.11.2015

Это сработало для меня:

from cv2 import cv
import numpy as np

filepath = "test.yml"
matrixA = np.array( cv.Load(filepath, cv.CreateMemStorage(), "matrixA") )
matrixB = np.array( cv.Load(filepath, cv.CreateMemStorage(), "matrixB") )
print "matrixA:", matrixA
print "matrixB:", matrixB

Как показано на: http://xudongai.blogspot.jp/2013/08/how-to-use-python-to-load-opencv-yml.html

person ovpiNU    schedule 27.07.2015
comment
Это дает AttributeError: модуль «cv» не имеет атрибута «Загрузка» (по крайней мере, с использованием OpenCV 3.1) - person staticdev; 14.12.2016