123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- namespace OpenCvSharp.Internal.Vectors;
- /// <summary>
- /// </summary>
- public class VectorOfMat : DisposableCvObject, IStdVector<Mat>
- {
- /// <summary>
- /// Constructor
- /// </summary>
- public VectorOfMat()
- {
- ptr = NativeMethods.vector_Mat_new1();
- }
- /// <summary>
- /// Constructor
- /// </summary>
- /// <param name="size"></param>
- public VectorOfMat(int size)
- {
- if (size < 0)
- throw new ArgumentOutOfRangeException(nameof(size));
- ptr = NativeMethods.vector_Mat_new2((uint)size);
- }
-
- /// <summary>
- /// Constructor
- /// </summary>
- /// <param name="mats"></param>
- public VectorOfMat(IEnumerable<Mat> mats)
- {
- if (mats is null)
- throw new ArgumentNullException(nameof(mats));
- var matsArray = mats.ToArray();
- var matPointers = matsArray.Select(x => x.CvPtr).ToArray();
- ptr = NativeMethods.vector_Mat_new3(
- matPointers,
- (uint) matPointers.Length);
- GC.KeepAlive(matPointers);
- GC.KeepAlive(mats); // todo: rsb - should probably generate Mat[] and then get CvPtrs
- foreach (var m in matsArray)
- {
- GC.KeepAlive(m);
- }
- }
- /// <summary>
- /// Releases unmanaged resources
- /// </summary>
- protected override void DisposeUnmanaged()
- {
- NativeMethods.vector_Mat_delete(ptr);
- base.DisposeUnmanaged();
- }
- /// <summary>
- /// vector.size()
- /// </summary>
- public int Size
- {
- get
- {
- var res = NativeMethods.vector_Mat_getSize(ptr);
- GC.KeepAlive(this);
- return (int)res;
- }
- }
- /// <summary>
- /// &vector[0]
- /// </summary>
- public IntPtr ElemPtr
- {
- get
- {
- var res = NativeMethods.vector_Mat_getPointer(ptr);
- GC.KeepAlive(this);
- return res;
- }
- }
- /// <summary>
- /// Converts std::vector to managed array
- /// </summary>
- /// <returns></returns>
- public Mat[] ToArray()
- {
- return ToArray<Mat>();
- }
- /// <summary>
- /// Converts std::vector to managed array
- /// </summary>
- /// <returns></returns>
- public T[] ToArray<T>()
- where T : Mat, new()
- {
- var size = Size;
- if (size == 0)
- return Array.Empty<T>();
- var dst = new T[size];
- var dstPtr = new IntPtr[size];
- for (var i = 0; i < size; i++)
- {
- var m = new T();
- dst[i] = m;
- dstPtr[i] = m.CvPtr;
- }
- NativeMethods.vector_Mat_assignToArray(ptr, dstPtr);
- GC.KeepAlive(this);
- return dst;
- }
- }
|