diff --git a/modules/core/src/persistence.cpp b/modules/core/src/persistence.cpp index fe39dc0534..bdf2f59ec9 100644 --- a/modules/core/src/persistence.cpp +++ b/modules/core/src/persistence.cpp @@ -5248,7 +5248,7 @@ FileStorage& operator << (FileStorage& fs, const string& str) } else if( fs.state == NAME_EXPECTED + INSIDE_MAP ) { - if( !cv_isalpha(*_str) ) + if (!cv_isalpha(*_str) && *_str != '_') CV_Error_( CV_StsError, ("Incorrect element name %s", _str) ); fs.elname = str; fs.state = VALUE_EXPECTED + INSIDE_MAP; diff --git a/modules/core/test/test_io.cpp b/modules/core/test/test_io.cpp index 431ff43a99..3972a4ae8c 100644 --- a/modules/core/test/test_io.cpp +++ b/modules/core/test/test_io.cpp @@ -522,3 +522,14 @@ TEST(Core_InputOutput, FileStorage) sprintf(arr, "sprintf is hell %d", 666); EXPECT_NO_THROW(f << arr); } + +TEST(Core_InputOutput, FileStorageKey) +{ + cv::FileStorage f("dummy.yml", cv::FileStorage::WRITE | cv::FileStorage::MEMORY); + + EXPECT_NO_THROW(f << "key1" << "value1"); + EXPECT_NO_THROW(f << "_key2" << "value2"); + EXPECT_NO_THROW(f << "key_3" << "value3"); + const std::string expected = "%YAML:1.0\nkey1: value1\n_key2: value2\nkey_3: value3\n"; + ASSERT_STREQ(f.releaseAndGetString().c_str(), expected.c_str()); +}