105 lines
3.0 KiB
C#
105 lines
3.0 KiB
C#
using DlibDotNet;
|
|
using System.Runtime.Serialization;
|
|
|
|
namespace View_by_Distance.FaceRecognitionDotNet;
|
|
|
|
/// <summary>
|
|
/// Represents a feature data of face. This class cannot be inherited.
|
|
/// </summary>
|
|
[Serializable]
|
|
public sealed class FaceEncoding : DisposableObject, ISerializable
|
|
{
|
|
|
|
#region Fields
|
|
|
|
[NonSerialized]
|
|
private readonly Matrix<double> _Encoding;
|
|
|
|
#endregion
|
|
|
|
#region Constructors
|
|
|
|
internal FaceEncoding(Matrix<double> encoding) => _Encoding = encoding;
|
|
|
|
private FaceEncoding(SerializationInfo info, StreamingContext context)
|
|
{
|
|
if (info == null)
|
|
throw new NullReferenceException(nameof(info));
|
|
|
|
double[]? array = info.GetValue(nameof(_Encoding), typeof(double[])) as double[];
|
|
int? row = (int?)info.GetValue(nameof(_Encoding.Rows), typeof(int));
|
|
int? column = (int?)info.GetValue(nameof(_Encoding.Columns), typeof(int));
|
|
if (row is null)
|
|
throw new NullReferenceException(nameof(row));
|
|
if (column is null)
|
|
throw new NullReferenceException(nameof(column));
|
|
_Encoding = new Matrix<double>(array, row.Value, column.Value);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Properties
|
|
|
|
internal Matrix<double> Encoding => _Encoding;
|
|
|
|
/// <summary>
|
|
/// Gets the size of feature data.
|
|
/// </summary>
|
|
/// <exception cref="ObjectDisposedException">This object is disposed.</exception>
|
|
public int Size
|
|
{
|
|
get
|
|
{
|
|
ThrowIfDisposed();
|
|
return _Encoding.Size;
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Methods
|
|
|
|
/// <summary>
|
|
/// Gets a feature data of face as raw format.
|
|
/// </summary>
|
|
/// <returns>A <see cref="double"/> array that represents a feature data.</returns>
|
|
/// <remarks><see cref="FaceEncoding"/> class supports serialization. This method is for interoperability between FaceRecognitionotNet and dlib.</remarks>
|
|
/// <exception cref="ObjectDisposedException">This object is disposed.</exception>
|
|
public double[] GetRawEncoding()
|
|
{
|
|
ThrowIfDisposed();
|
|
return _Encoding.ToArray();
|
|
}
|
|
|
|
#region Overrides
|
|
|
|
/// <summary>
|
|
/// Releases all unmanaged resources.
|
|
/// </summary>
|
|
protected override void DisposeUnmanaged()
|
|
{
|
|
base.DisposeUnmanaged();
|
|
_Encoding?.Dispose();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#endregion
|
|
|
|
#region ISerializable Members
|
|
|
|
/// <summary>
|
|
/// Populates a <see cref="SerializationInfo"/> with the data needed to serialize the target object.
|
|
/// </summary>
|
|
/// <param name="info">The <see cref="SerializationInfo"/> to populate with data.</param>
|
|
/// <param name="context">The destination (see <see cref="StreamingContext"/>) for this serialization.</param>
|
|
public void GetObjectData(SerializationInfo info, StreamingContext context)
|
|
{
|
|
info.AddValue(nameof(_Encoding), _Encoding.ToArray());
|
|
info.AddValue(nameof(_Encoding.Rows), _Encoding.Rows);
|
|
info.AddValue(nameof(_Encoding.Columns), _Encoding.Columns);
|
|
}
|
|
|
|
#endregion
|
|
|
|
} |