VectorOfMat.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. namespace OpenCvSharp.Internal.Vectors;
  2. /// <summary>
  3. /// </summary>
  4. public class VectorOfMat : DisposableCvObject, IStdVector<Mat>
  5. {
  6. /// <summary>
  7. /// Constructor
  8. /// </summary>
  9. public VectorOfMat()
  10. {
  11. ptr = NativeMethods.vector_Mat_new1();
  12. }
  13. /// <summary>
  14. /// Constructor
  15. /// </summary>
  16. /// <param name="size"></param>
  17. public VectorOfMat(int size)
  18. {
  19. if (size < 0)
  20. throw new ArgumentOutOfRangeException(nameof(size));
  21. ptr = NativeMethods.vector_Mat_new2((uint)size);
  22. }
  23. /// <summary>
  24. /// Constructor
  25. /// </summary>
  26. /// <param name="mats"></param>
  27. public VectorOfMat(IEnumerable<Mat> mats)
  28. {
  29. if (mats is null)
  30. throw new ArgumentNullException(nameof(mats));
  31. var matsArray = mats.ToArray();
  32. var matPointers = matsArray.Select(x => x.CvPtr).ToArray();
  33. ptr = NativeMethods.vector_Mat_new3(
  34. matPointers,
  35. (uint) matPointers.Length);
  36. GC.KeepAlive(matPointers);
  37. GC.KeepAlive(mats); // todo: rsb - should probably generate Mat[] and then get CvPtrs
  38. foreach (var m in matsArray)
  39. {
  40. GC.KeepAlive(m);
  41. }
  42. }
  43. /// <summary>
  44. /// Releases unmanaged resources
  45. /// </summary>
  46. protected override void DisposeUnmanaged()
  47. {
  48. NativeMethods.vector_Mat_delete(ptr);
  49. base.DisposeUnmanaged();
  50. }
  51. /// <summary>
  52. /// vector.size()
  53. /// </summary>
  54. public int Size
  55. {
  56. get
  57. {
  58. var res = NativeMethods.vector_Mat_getSize(ptr);
  59. GC.KeepAlive(this);
  60. return (int)res;
  61. }
  62. }
  63. /// <summary>
  64. /// &amp;vector[0]
  65. /// </summary>
  66. public IntPtr ElemPtr
  67. {
  68. get
  69. {
  70. var res = NativeMethods.vector_Mat_getPointer(ptr);
  71. GC.KeepAlive(this);
  72. return res;
  73. }
  74. }
  75. /// <summary>
  76. /// Converts std::vector to managed array
  77. /// </summary>
  78. /// <returns></returns>
  79. public Mat[] ToArray()
  80. {
  81. return ToArray<Mat>();
  82. }
  83. /// <summary>
  84. /// Converts std::vector to managed array
  85. /// </summary>
  86. /// <returns></returns>
  87. public T[] ToArray<T>()
  88. where T : Mat, new()
  89. {
  90. var size = Size;
  91. if (size == 0)
  92. return Array.Empty<T>();
  93. var dst = new T[size];
  94. var dstPtr = new IntPtr[size];
  95. for (var i = 0; i < size; i++)
  96. {
  97. var m = new T();
  98. dst[i] = m;
  99. dstPtr[i] = m.CvPtr;
  100. }
  101. NativeMethods.vector_Mat_assignToArray(ptr, dstPtr);
  102. GC.KeepAlive(this);
  103. return dst;
  104. }
  105. }