Commit 2c21ea2d authored by ihsan314's avatar ihsan314 Committed by Alexander Alekhin

Merge pull request #14666 from ihsan314:file_io_xml_yml

Python code examples for file IO in xml and yml format

* Initial "Pythonization" of file_input_output.cpp

* Moved file_input_output.py to correct location

* Nearly done Pythonizing file_input_output.cpp

* Python equivalent of file_input_output.py created

* Started Pythonizing camera_calibration.cpp

* Completed Python tutorial/sample code for file_input_output

* Resolved whitespace issues

* Removed tabs in file_input_output.cpp

* Patched import order and wrapped code in main function

* Changed string to docstring format in help file

* Updated link to Python example code
parent 993b9af7
...@@ -25,6 +25,7 @@ public: ...@@ -25,6 +25,7 @@ public:
{} {}
explicit MyData(int) : A(97), X(CV_PI), id("mydata1234") // explicit to avoid implicit conversion explicit MyData(int) : A(97), X(CV_PI), id("mydata1234") // explicit to avoid implicit conversion
{} {}
//! [inside]
void write(FileStorage& fs) const //Write serialization for this class void write(FileStorage& fs) const //Write serialization for this class
{ {
fs << "{" << "A" << A << "X" << X << "id" << id << "}"; fs << "{" << "A" << A << "X" << X << "id" << id << "}";
...@@ -35,6 +36,7 @@ public: ...@@ -35,6 +36,7 @@ public:
X = (double)node["X"]; X = (double)node["X"];
id = (string)node["id"]; id = (string)node["id"];
} }
//! [inside]
public: // Data Members public: // Data Members
int A; int A;
double X; double X;
...@@ -42,6 +44,7 @@ public: // Data Members ...@@ -42,6 +44,7 @@ public: // Data Members
}; };
//These write and read functions must be defined for the serialization in FileStorage to work //These write and read functions must be defined for the serialization in FileStorage to work
//! [outside]
static void write(FileStorage& fs, const std::string&, const MyData& x) static void write(FileStorage& fs, const std::string&, const MyData& x)
{ {
x.write(fs); x.write(fs);
...@@ -52,6 +55,7 @@ static void read(const FileNode& node, MyData& x, const MyData& default_value = ...@@ -52,6 +55,7 @@ static void read(const FileNode& node, MyData& x, const MyData& default_value =
else else
x.read(node); x.read(node);
} }
//! [outside]
// This function will print our custom class to the console // This function will print our custom class to the console
static ostream& operator<<(ostream& out, const MyData& m) static ostream& operator<<(ostream& out, const MyData& m)
...@@ -72,27 +76,48 @@ int main(int ac, char** av) ...@@ -72,27 +76,48 @@ int main(int ac, char** av)
string filename = av[1]; string filename = av[1];
{ //write { //write
//! [iomati]
Mat R = Mat_<uchar>::eye(3, 3), Mat R = Mat_<uchar>::eye(3, 3),
T = Mat_<double>::zeros(3, 1); T = Mat_<double>::zeros(3, 1);
//! [iomati]
//! [customIOi]
MyData m(1); MyData m(1);
//! [customIOi]
//! [open]
FileStorage fs(filename, FileStorage::WRITE); FileStorage fs(filename, FileStorage::WRITE);
// or:
// FileStorage fs;
// fs.open(filename, FileStorage::WRITE);
//! [open]
//! [writeNum]
fs << "iterationNr" << 100; fs << "iterationNr" << 100;
//! [writeNum]
//! [writeStr]
fs << "strings" << "["; // text - string sequence fs << "strings" << "["; // text - string sequence
fs << "image1.jpg" << "Awesomeness" << "../data/baboon.jpg"; fs << "image1.jpg" << "Awesomeness" << "../data/baboon.jpg";
fs << "]"; // close sequence fs << "]"; // close sequence
//! [writeStr]
//! [writeMap]
fs << "Mapping"; // text - mapping fs << "Mapping"; // text - mapping
fs << "{" << "One" << 1; fs << "{" << "One" << 1;
fs << "Two" << 2 << "}"; fs << "Two" << 2 << "}";
//! [writeMap]
//! [iomatw]
fs << "R" << R; // cv::Mat fs << "R" << R; // cv::Mat
fs << "T" << T; fs << "T" << T;
//! [iomatw]
//! [customIOw]
fs << "MyData" << m; // your own data structures fs << "MyData" << m; // your own data structures
//! [customIOw]
//! [close]
fs.release(); // explicit close fs.release(); // explicit close
//! [close]
cout << "Write Done." << endl; cout << "Write Done." << endl;
} }
...@@ -101,9 +126,11 @@ int main(int ac, char** av) ...@@ -101,9 +126,11 @@ int main(int ac, char** av)
FileStorage fs; FileStorage fs;
fs.open(filename, FileStorage::READ); fs.open(filename, FileStorage::READ);
//! [readNum]
int itNr; int itNr;
//fs["iterationNr"] >> itNr; //fs["iterationNr"] >> itNr;
itNr = (int) fs["iterationNr"]; itNr = (int) fs["iterationNr"];
//! [readNum]
cout << itNr; cout << itNr;
if (!fs.isOpened()) if (!fs.isOpened())
{ {
...@@ -112,6 +139,7 @@ int main(int ac, char** av) ...@@ -112,6 +139,7 @@ int main(int ac, char** av)
return 1; return 1;
} }
//! [readStr]
FileNode n = fs["strings"]; // Read string sequence - Get node FileNode n = fs["strings"]; // Read string sequence - Get node
if (n.type() != FileNode::SEQ) if (n.type() != FileNode::SEQ)
{ {
...@@ -122,19 +150,26 @@ int main(int ac, char** av) ...@@ -122,19 +150,26 @@ int main(int ac, char** av)
FileNodeIterator it = n.begin(), it_end = n.end(); // Go through the node FileNodeIterator it = n.begin(), it_end = n.end(); // Go through the node
for (; it != it_end; ++it) for (; it != it_end; ++it)
cout << (string)*it << endl; cout << (string)*it << endl;
//! [readStr]
//! [readMap]
n = fs["Mapping"]; // Read mappings from a sequence n = fs["Mapping"]; // Read mappings from a sequence
cout << "Two " << (int)(n["Two"]) << "; "; cout << "Two " << (int)(n["Two"]) << "; ";
cout << "One " << (int)(n["One"]) << endl << endl; cout << "One " << (int)(n["One"]) << endl << endl;
//! [readMap]
MyData m; MyData m;
Mat R, T; Mat R, T;
//! [iomat]
fs["R"] >> R; // Read cv::Mat fs["R"] >> R; // Read cv::Mat
fs["T"] >> T; fs["T"] >> T;
//! [iomat]
//! [customIO]
fs["MyData"] >> m; // Read your own structure_ fs["MyData"] >> m; // Read your own structure_
//! [customIO]
cout << endl cout << endl
<< "R = " << R << endl; << "R = " << R << endl;
...@@ -142,9 +177,11 @@ int main(int ac, char** av) ...@@ -142,9 +177,11 @@ int main(int ac, char** av)
cout << "MyData = " << endl << m << endl << endl; cout << "MyData = " << endl << m << endl << endl;
//Show default behavior for non existing nodes //Show default behavior for non existing nodes
//! [nonexist]
cout << "Attempt to read NonExisting (should initialize the data structure with its default)."; cout << "Attempt to read NonExisting (should initialize the data structure with its default).";
fs["NonExisting"] >> m; fs["NonExisting"] >> m;
cout << endl << "NonExisting = " << endl << m << endl; cout << endl << "NonExisting = " << endl << m << endl;
//! [nonexist]
} }
cout << endl cout << endl
......
from __future__ import print_function
import numpy as np
import cv2 as cv
import sys
def help(filename):
print (
'''
{0} shows the usage of the OpenCV serialization functionality. \n\n
usage:\n
python3 {0} outputfile.yml.gz\n\n
The output file may be either in XML, YAML or JSON. You can even compress it\n
by specifying this in its extension like xml.gz yaml.gz etc... With\n
FileStorage you can serialize objects in OpenCV.\n\n
For example: - create a class and have it serialized\n
- use it to read and write matrices.\n
'''.format(filename)
)
class MyData:
A = 97
X = np.pi
name = 'mydata1234'
def __repr__(self):
s = '{ name = ' + self.name + ', X = ' + str(self.X)
s = s + ', A = ' + str(self.A) + '}'
return s
## [inside]
def write(self, fs):
fs.write('MyData','{')
fs.write('A', self.A)
fs.write('X', self.X)
fs.write('name', self.name)
fs.write('MyData','}')
def read(self, node):
if (not node.empty()):
self.A = int(node.getNode('A').real())
self.X = node.getNode('X').real()
self.name = node.getNode('name').string()
else:
self.A = self.X = 0
self.name = ''
## [inside]
def main(argv):
if len(argv) != 2:
help(argv[0])
exit(1)
# write
## [iomati]
R = np.eye(3,3)
T = np.zeros((3,1))
## [iomati]
## [customIOi]
m = MyData()
## [customIOi]
filename = argv[1]
## [open]
s = cv.FileStorage(filename, cv.FileStorage_WRITE)
# or:
# s = cv.FileStorage()
# s.open(filename, cv.FileStorage_WRITE)
## [open]
## [writeNum]
s.write('iterationNr', 100)
## [writeNum]
## [writeStr]
s.write('strings', '[')
s.write('image1.jpg','Awesomeness')
s.write('../data/baboon.jpg',']')
## [writeStr]
## [writeMap]
s.write ('Mapping', '{')
s.write ('One', 1)
s.write ('Two', 2)
s.write ('Mapping', '}')
## [writeMap]
## [iomatw]
s.write ('R_MAT', R)
s.write ('T_MAT', T)
## [iomatw]
## [customIOw]
m.write(s)
## [customIOw]
## [close]
s.release()
## [close]
print ('Write Done.')
# read
print ('\nReading: ')
s = cv.FileStorage()
s.open(filename, cv.FileStorage_READ)
## [readNum]
n = s.getNode('iterationNr')
itNr = int(n.real())
## [readNum]
print (itNr)
if (not s.isOpened()):
print ('Failed to open ', filename, file=sys.stderr)
help(argv[0])
exit(1)
## [readStr]
n = s.getNode('strings')
if (not n.isSeq()):
print ('strings is not a sequence! FAIL', file=sys.stderr)
exit(1)
for i in range(n.size()):
print (n.at(i).string())
## [readStr]
## [readMap]
n = s.getNode('Mapping')
print ('Two',int(n.getNode('Two').real()),'; ')
print ('One',int(n.getNode('One').real()),'\n')
## [readMap]
## [iomat]
R = s.getNode('R_MAT').mat()
T = s.getNode('T_MAT').mat()
## [iomat]
## [customIO]
m.read(s.getNode('MyData'))
## [customIO]
print ('\nR =',R)
print ('T =',T,'\n')
print ('MyData =','\n',m,'\n')
## [nonexist]
print ('Attempt to read NonExisting (should initialize the data structure',
'with its default).')
m.read(s.getNode('NonExisting'))
print ('\nNonExisting =','\n',m)
## [nonexist]
print ('\nTip: Open up',filename,'with a text editor to see the serialized data.')
if __name__ == '__main__':
main(sys.argv)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment