添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

First time here? Check out the FAQ!

How do I load an OpenCV generated yaml file in python?

asked 2014-04-03 16:46:05 -0600

Lucas Walter gravatar image

It appears that OpenCV is writing yaml 1.0 but PyYaml only wants to read yaml 1.1 ( http://pyyaml.org/#Whatimplementationshouldyouuse and http://stackoverflow.com/questions/12058510/xml-or-yml-parsing-in-opencv-with-python ). Do I just need a script to reformat the yaml so it doesn't generate errors like expected alphabetic or numeric character, but found ':' on the first line %YAML:1.0 , or is there a better way to go about loading the files?

I've tried cv2.cv.load(filename) but it generates and error about not finding xml tags (opencv 2.4.6 and whatever python-opencv bindings are provided in Ubuntu 13.10).

edit retag flag offensive close merge delete

Comments

1

Indeed YAML 1.0 is not supported by current YAML libraries (which require YAML 1.1 --- at the start of documents). I think opencv should switch over to YAML 1.1, I'm filing a bug report to that effect now.

B. Bogart gravatar image B. Bogart ( 2015-12-18 11:29:54 -0600 ) edit

3 answers Sort by » oldest newest most voted

0

answered 2016-02-19 16:53:53 -0600

Lucas Walter gravatar image

updated 2016-02-19 16:54:46 -0600

I ended up following this: http://stackoverflow.com/questions/28... , though I only needed to skip the first line, the rest of my yamls are not opencv data types, just strings and numbers and dicts and lists.

edit flag offensive delete
1

answered 2017-12-19 22:03:29 -0600

stiv-yakovenko gravatar image

To load camera calibration matrix like this:

%YAML:1.0
image_width: 4000
image_height: 3000
camera_matrix: !!opencv-matrix
   rows: 3
   cols: 3
   dt: d
   data: [ 3.1943912478853654e+03, 0., 1.9850941722590378e+03, 0.,
       3.2021356095317910e+03, 1.5509955246019449e+03, 0., 0., 1. ]
distortion_coefficients: !!opencv-matrix
   rows: 1
   cols: 5
   dt: d
   data: [ 1.3952810090687282e-01, -3.8313647492178071e-01,
       5.0555840762660396e-03, 2.3753464602670597e-03,
       3.3952514744179502e-01 ]

I use code like this:

import cv2
fs = cv2.FileStorage("./calib_asus_chess/cam_calib_asus.yml", cv2.FILE_STORAGE_READ)
fn = fs.getNode("camera_matrix")
print(fn.mat())

And it gives me:

[[  3.19439125e+03   0.00000000e+00   1.98509417e+03]
 [  0.00000000e+00   3.20213561e+03   1.55099552e+03]
 [  0.00000000e+00   0.00000000e+00   1.00000000e+00]]
edit flag offensive delete

Comments

@stiv-yakovenko this post is really old opencv 2.4.6 today it is opencv 3.4 (soon) and I hope that the answer is in doc for 3.4.0

LBerger gravatar image LBerger ( 2017-12-20 02:13:52 -0600 ) edit

See also .

To parse the classical node, it is something like this:

image_width = fs.getNode("image_width").real()
Eduardo gravatar image Eduardo ( 2017-12-20 04:52:18 -0600 ) edit

Came here via Google--this is nowadays the correct answer and should be accepted!

speedymcs gravatar image speedymcs ( 2019-06-21 03:48:56 -0600 ) edit
0

answered 2014-11-12 06:32:24 -0600

It's probably too late for you to use my answer, but for future reference... For my that works:

yaml_data = numpy.asarray(cv2.cv.Load("my_file.yaml"))

my_file.yaml is generated by some OpenCV application written in C++, and contains a cv::Mat 2D matrix.

edit flag offensive delete

Comments