VectorOfVectorKeyPoint.cs 2.3 KB

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