1
0
mirror of https://github.com/opencv/opencv.git synced 2026-07-25 13:23:02 +04:00
Files
satyam yadav cc8f683b6a Merge pull request #28482 from satyam102006:core/yaml-1-2-support
core: add YAML 1.2 support for FileStorage #28482

Fixes: #26363
CI Update: https://github.com/opencv/ci-gha-workflow/pull/306

Summary: 
- Bool true/false literals support
- Header-less YAMLs support for Python YAML module compatibility. Header-less files are parsed as YAMLs by default
- Added FORMAT_YAML_1_0 flag to FileStorage for fallback.
- New YAML1.2 header

Testing: 
- Added Core_InputOutput.YAML_1_2_Compatibility test case in test_io.cpp.
- Added YAML interop test in Python
2026-05-19 13:44:50 +03:00

88 lines
2.9 KiB
Python

#!/usr/bin/env python
""""Core serialization tests."""
import tempfile
import os
import cv2 as cv
import numpy as np
from tests_common import NewOpenCVTests, unittest
class persistence_test(NewOpenCVTests):
def test_yml_rw(self):
fd, fname = tempfile.mkstemp(prefix="opencv_python_persistence_", suffix=".yml")
os.close(fd)
# Writing ...
expected = np.array([[[0, 1, 2, 3, 4]]])
expected_str = ("Hello", "World", "!")
fs = cv.FileStorage(fname, cv.FILE_STORAGE_WRITE)
fs.write("test", expected)
fs.write("strings", expected_str)
fs.release()
# Reading ...
fs = cv.FileStorage(fname, cv.FILE_STORAGE_READ)
root = fs.getFirstTopLevelNode()
self.assertEqual(root.name(), "test")
test = fs.getNode("test")
self.assertEqual(test.empty(), False)
self.assertEqual(test.name(), "test")
self.assertEqual(test.type(), cv.FILE_NODE_MAP)
self.assertEqual(test.isMap(), True)
actual = test.mat()
self.assertEqual(actual.shape, expected.shape)
self.assertEqual(np.array_equal(expected, actual), True)
strings = fs.getNode("strings")
self.assertEqual(strings.isSeq(), True)
self.assertEqual(strings.size(), len(expected_str))
self.assertEqual(all(strings.at(i).isString() for i in range(strings.size())), True)
self.assertSequenceEqual([strings.at(i).string() for i in range(strings.size())], expected_str)
fs.release()
os.remove(fname)
def test_yml_python_interop(self):
try:
import yaml
except:
raise unittest.SkipTest('Pyyml is not available for interop test')
ref_data = {
'int_value': 42,
"bool_value": True,
"float_value": 3.1415926,
"int64_value": 2147483647 + 1024, # C++ INT_MAX + 1024
"string_value": "opencv"
}
fd, test_file_name = tempfile.mkstemp(prefix="opencv_python_persistence_", suffix=".yml")
os.close(fd)
with open(test_file_name, 'w') as ff:
yaml.dump(ref_data, ff)
# Notice: no cv.FileStorage_FORMAT_YAML flag needed now thanks to the C++ fix!
fs = cv.FileStorage(test_file_name, cv.FILE_STORAGE_READ)
self.assertTrue(fs.isOpened())
node = fs.getNode('int_value')
self.assertTrue(node.isInt())
self.assertEqual(42, int(node.real()))
node = fs.getNode('int64_value')
self.assertTrue(node.isInt())
self.assertEqual(2147483647 + 1024, int(node.real()))
node = fs.getNode('float_value')
self.assertTrue(node.isReal())
self.assertEqual(3.1415926, node.real())
node = fs.getNode('string_value')
self.assertTrue(node.isString())
self.assertEqual("opencv", node.string())
fs.release()
os.remove(test_file_name)