VectorOfVectorPoint.cs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using OpenCvSharp.Internal.Util;
  2. namespace OpenCvSharp.Internal.Vectors;
  3. /// <summary>
  4. /// </summary>
  5. public class VectorOfVectorPoint : DisposableCvObject, IStdVector<Point[]>
  6. {
  7. /// <summary>
  8. /// Constructor
  9. /// </summary>
  10. public VectorOfVectorPoint()
  11. {
  12. ptr = NativeMethods.vector_vector_Point_new1();
  13. }
  14. /// <summary>
  15. /// Constructor
  16. /// </summary>
  17. /// <param name="size"></param>
  18. public VectorOfVectorPoint(nuint size)
  19. {
  20. if (size < 0)
  21. throw new ArgumentOutOfRangeException(nameof(size));
  22. ptr = NativeMethods.vector_vector_Point_new2(size);
  23. }
  24. /// <summary>
  25. /// Releases unmanaged resources
  26. /// </summary>
  27. protected override void DisposeUnmanaged()
  28. {
  29. NativeMethods.vector_vector_Point_delete(ptr);
  30. base.DisposeUnmanaged();
  31. }
  32. /// <summary>
  33. /// vector.size()
  34. /// </summary>
  35. public int GetSize1()
  36. {
  37. var res = NativeMethods.vector_vector_Point_getSize1(ptr);
  38. GC.KeepAlive(this);
  39. return (int)res;
  40. }
  41. /// <summary>
  42. ///
  43. /// </summary>
  44. public int Size => GetSize1();
  45. /// <summary>
  46. /// vector.size()
  47. /// </summary>
  48. public IReadOnlyList<long> GetSize2()
  49. {
  50. var size1 = GetSize1();
  51. var size2 = new nuint[size1];
  52. NativeMethods.vector_vector_Point_getSize2(ptr, size2);
  53. GC.KeepAlive(this);
  54. return size2.Select(s => (long)s).ToArray();
  55. }
  56. /// <summary>
  57. /// Converts std::vector to managed array
  58. /// </summary>
  59. /// <returns></returns>
  60. public Point[][] ToArray()
  61. {
  62. var size1 = GetSize1();
  63. if (size1 == 0)
  64. return Array.Empty<Point[]>();
  65. var size2 = GetSize2();
  66. var ret = new Point[size1][];
  67. for (var i = 0; i < size1; i++)
  68. {
  69. ret[i] = new Point[size2[i]];
  70. }
  71. using var retPtr = new ArrayAddress2<Point>(ret);
  72. NativeMethods.vector_vector_Point_copy(ptr, retPtr.GetPointer());
  73. GC.KeepAlive(this);
  74. return ret;
  75. }
  76. }