mirror of https://github.com/emgucv/emgucv.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
218 lines
7.2 KiB
218 lines
7.2 KiB
//----------------------------------------------------------------------------
|
|
// Copyright (C) 2004-2017 by EMGU Corporation. All rights reserved.
|
|
//----------------------------------------------------------------------------
|
|
|
|
using System;
|
|
using System.Diagnostics;
|
|
using System.Drawing;
|
|
using System.Runtime.InteropServices;
|
|
using System.Runtime.Serialization;
|
|
using System.Text;
|
|
using Emgu.CV.Structure;
|
|
using Emgu.CV.Util;
|
|
using Emgu.Util;
|
|
|
|
namespace Emgu.CV
|
|
{
|
|
/// <summary>
|
|
/// File Storage Node class.
|
|
/// The node is used to store each and every element of the file storage opened for reading. When
|
|
/// XML/YAML file is read, it is first parsed and stored in the memory as a hierarchical collection of
|
|
/// nodes. Each node can be a “leaf” that is contain a single number or a string, or be a collection of
|
|
/// other nodes. There can be named collections (mappings) where each element has a name and it is
|
|
/// accessed by a name, and ordered collections (sequences) where elements do not have names but rather
|
|
/// accessed by index. Type of the file node can be determined using FileNode::type method.
|
|
/// Note that file nodes are only used for navigating file storages opened for reading. When a file
|
|
/// storage is opened for writing, no data is stored in memory after it is written.
|
|
/// </summary>
|
|
public class FileNode : UnmanagedObject
|
|
{
|
|
/// <summary>
|
|
/// Type of the file storage node
|
|
/// </summary>
|
|
public enum Type
|
|
{
|
|
/// <summary>
|
|
/// Empty node
|
|
/// </summary>
|
|
None = 0,
|
|
///<summary>
|
|
/// an integer
|
|
///</summary>
|
|
Int = 1,
|
|
/// <summary>
|
|
/// Floating-point number
|
|
/// </summary>
|
|
Real = 2,
|
|
/// <summary>
|
|
/// Synonym or Real
|
|
/// </summary>
|
|
Float = Real,
|
|
/// <summary>
|
|
/// Text string in UTF-8 encoding
|
|
/// </summary>
|
|
Str = 3,
|
|
/// <summary>
|
|
/// Synonym for Str
|
|
/// </summary>
|
|
String = Str,
|
|
/// <summary>
|
|
/// Integer of size size_t. Typically used for storing complex dynamic structures where some elements reference the others
|
|
/// </summary>
|
|
Ref = 4,
|
|
/// <summary>
|
|
/// The sequence
|
|
/// </summary>
|
|
Seq = 5,
|
|
/// <summary>
|
|
/// Mapping
|
|
/// </summary>
|
|
Map = 6,
|
|
/// <summary>
|
|
/// The type mask
|
|
/// </summary>
|
|
TypeMask = 7,
|
|
/// <summary>
|
|
/// Compact representation of a sequence or mapping. Used only by YAML writer
|
|
/// </summary>
|
|
Flow = 8,
|
|
/// <summary>
|
|
/// A registered object (e.g. a matrix)
|
|
/// </summary>
|
|
User = 16,
|
|
/// <summary>
|
|
/// Empty structure (sequence or mapping)
|
|
/// </summary>
|
|
Empty = 32,
|
|
/// <summary>
|
|
/// The node has a name (i.e. it is element of a mapping)
|
|
/// </summary>
|
|
Named = 64
|
|
};
|
|
|
|
internal FileNode(IntPtr ptr)
|
|
{
|
|
_ptr = ptr;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Reads a Mat from the node
|
|
/// </summary>
|
|
/// <param name="mat">The Mat where the result is read into</param>
|
|
/// <param name="defaultMat">The default mat.</param>
|
|
public void ReadMat(Mat mat, Mat defaultMat = null)
|
|
{
|
|
if (defaultMat == null)
|
|
{
|
|
using (Mat def = new Mat())
|
|
CvInvoke.cveFileNodeReadMat(_ptr, mat, def);
|
|
}
|
|
else
|
|
{
|
|
CvInvoke.cveFileNodeReadMat(_ptr, mat, defaultMat);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets a value indicating whether this instance is empty.
|
|
/// </summary>
|
|
/// <value>
|
|
/// <c>true</c> if this instance is empty; otherwise, <c>false</c>.
|
|
/// </value>
|
|
public bool IsEmpty
|
|
{
|
|
get { return CvInvoke.cveFileNodeIsEmpty(_ptr); }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the type of the node.
|
|
/// </summary>
|
|
/// <value>
|
|
/// The type of the node.
|
|
/// </value>
|
|
public Type NodeType
|
|
{
|
|
get { return (Type)CvInvoke.cveFileNodeGetType(_ptr); }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Release the unmanaged resources
|
|
/// </summary>
|
|
protected override void DisposeObject()
|
|
{
|
|
if (_ptr != IntPtr.Zero)
|
|
CvInvoke.cveFileNodeRelease(ref _ptr);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Reads the string from the node
|
|
/// </summary>
|
|
/// <returns>The string from the node</returns>
|
|
public String ReadString(String defaultString = null)
|
|
{
|
|
using (CvString s = new CvString())
|
|
using (CvString ds = new CvString(defaultString))
|
|
{
|
|
CvInvoke.cveFileNodeReadString(_ptr, s, ds);
|
|
return s.ToString();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Reads the int from the node.
|
|
/// </summary>
|
|
/// <returns>The int from the node.</returns>
|
|
public int ReadInt(int defaultInt = int.MinValue)
|
|
{
|
|
return CvInvoke.cveFileNodeReadInt(_ptr, defaultInt);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Reads the float from the node.
|
|
/// </summary>
|
|
/// <returns>The float from the node.</returns>
|
|
public float ReadFloat(float defaultFloat = float.MinValue)
|
|
{
|
|
return CvInvoke.cveFileNodeReadFloat(_ptr, defaultFloat);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Reads the double from the node.
|
|
/// </summary>
|
|
/// <returns>The double from the node.</returns>
|
|
public double ReadDouble(double defaultDouble = Double.MinValue)
|
|
{
|
|
return CvInvoke.cveFileNodeReadDouble(_ptr, defaultDouble);
|
|
}
|
|
|
|
}
|
|
|
|
public static partial class CvInvoke
|
|
{
|
|
|
|
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
|
|
internal static extern void cveFileNodeRelease(ref IntPtr node);
|
|
|
|
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
|
|
internal static extern void cveFileNodeReadMat(IntPtr node, IntPtr mat, IntPtr defaultMat);
|
|
|
|
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
|
|
internal static extern int cveFileNodeGetType(IntPtr node);
|
|
|
|
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
|
|
[return: MarshalAs(CvInvoke.BoolMarshalType)]
|
|
internal static extern bool cveFileNodeIsEmpty(IntPtr node);
|
|
|
|
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
|
|
internal static extern void cveFileNodeReadString(IntPtr node, IntPtr str, IntPtr defaultStr);
|
|
|
|
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
|
|
internal static extern int cveFileNodeReadInt(IntPtr node, int defaultInt);
|
|
|
|
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
|
|
internal static extern double cveFileNodeReadDouble(IntPtr node, double defaultDouble);
|
|
|
|
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
|
|
internal static extern float cveFileNodeReadFloat(IntPtr node, float defaultFloat);
|
|
}
|
|
}
|