using OpenCvSharp.Detail;
namespace OpenCvSharp.Internal.Vectors;
///
///
public class VectorOfImageFeatures : DisposableCvObject, IStdVector
{
///
/// Constructor
///
public VectorOfImageFeatures()
{
ptr = NativeMethods.vector_ImageFeatures_new1();
}
///
/// Releases unmanaged resources
///
protected override void DisposeUnmanaged()
{
NativeMethods.vector_ImageFeatures_delete(ptr);
base.DisposeUnmanaged();
}
///
/// vector.size()
///
public int Size
{
get
{
var res = NativeMethods.vector_ImageFeatures_getSize(ptr);
GC.KeepAlive(this);
return (int)res;
}
}
///
/// Converts std::vector to managed array
///
///
public ImageFeatures[] ToArray()
{
var size = Size;
if (size == 0)
return Array.Empty();
VectorOfKeyPoint[]? keypointsVecs = null;
Mat[]? descriptors = null;
try
{
var nativeResult = new WImageFeatures[size];
keypointsVecs = new VectorOfKeyPoint[size];
descriptors = new Mat[size];
for (int i = 0; i < size; i++)
{
keypointsVecs[i] = new VectorOfKeyPoint();
descriptors[i] = new Mat();
nativeResult[i].Keypoints = keypointsVecs[i].CvPtr;
nativeResult[i].Descriptors = descriptors[i].CvPtr;
}
NativeMethods.vector_ImageFeatures_getElements(ptr, nativeResult);
var result = new ImageFeatures[size];
for (int i = 0; i < size; i++)
{
result[i] = new ImageFeatures(
imgIdx: nativeResult[i].ImgIdx,
imgSize: nativeResult[i].ImgSize,
keypoints: keypointsVecs[i].ToArray(),
descriptors: descriptors[i]);
}
// ElemPtr is IntPtr to memory held by this object, so make sure we are not disposed until finished with copy.
GC.KeepAlive(this);
return result;
}
catch
{
if (descriptors is not null)
{
foreach (var mat in descriptors)
{
mat.Dispose();
}
}
throw;
}
finally
{
#pragma warning disable CA1508 // (???) Avoid dead conditional code
if (keypointsVecs is not null)
{
foreach (var vec in keypointsVecs)
{
vec.Dispose();
}
}
#pragma warning restore CA1508
}
}
private int[] KeypointsSizes(int size)
{
var ret = new nuint[size];
NativeMethods.vector_ImageFeatures_getKeypointsSize(ptr, ret);
GC.KeepAlive(this);
return ret.Select(v => (int)v).ToArray();
}
}