VectorOfVec6f.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. using System.Runtime.InteropServices;
  2. using OpenCvSharp.Internal.Util;
  3. namespace OpenCvSharp.Internal.Vectors;
  4. /// <summary>
  5. /// </summary>
  6. // ReSharper disable once InconsistentNaming
  7. internal class VectorOfVec6f : DisposableCvObject, IStdVector<Vec6f>
  8. {
  9. /// <summary>
  10. /// Constructor
  11. /// </summary>
  12. public VectorOfVec6f()
  13. {
  14. ptr = NativeMethods.vector_Vec6f_new1();
  15. }
  16. /// <summary>
  17. /// Releases unmanaged resources
  18. /// </summary>
  19. protected override void DisposeUnmanaged()
  20. {
  21. NativeMethods.vector_Vec6f_delete(ptr);
  22. base.DisposeUnmanaged();
  23. }
  24. /// <summary>
  25. /// vector.size()
  26. /// </summary>
  27. public int Size
  28. {
  29. get
  30. {
  31. var res = NativeMethods.vector_Vec6f_getSize(ptr);
  32. GC.KeepAlive(this);
  33. return (int)res;
  34. }
  35. }
  36. /// <summary>
  37. /// &amp;vector[0]
  38. /// </summary>
  39. public IntPtr ElemPtr
  40. {
  41. get
  42. {
  43. var res = NativeMethods.vector_Vec6f_getPointer(ptr);
  44. GC.KeepAlive(this);
  45. return res;
  46. }
  47. }
  48. /// <summary>
  49. /// Converts std::vector to managed array
  50. /// </summary>
  51. /// <returns></returns>
  52. public Vec6f[] ToArray()
  53. {
  54. return ToArray<Vec6f>();
  55. }
  56. /// <summary>
  57. /// Converts std::vector to managed array
  58. /// </summary>
  59. /// <typeparam name="T">structure that has four int members (ex. CvLineSegmentPoint, CvRect)</typeparam>
  60. /// <returns></returns>
  61. public T[] ToArray<T>() where T : unmanaged
  62. {
  63. var typeSize = Marshal.SizeOf<T>();
  64. if (typeSize != sizeof (float)*6)
  65. throw new OpenCvSharpException($"Unsupported type '{typeof(T)}'");
  66. var arySize = Size;
  67. if (arySize == 0)
  68. {
  69. return Array.Empty<T>();
  70. }
  71. var dst = new T[arySize];
  72. using (var dstPtr = new ArrayAddress1<T>(dst))
  73. {
  74. long bytesToCopy = typeSize * dst.Length;
  75. unsafe
  76. {
  77. Buffer.MemoryCopy(ElemPtr.ToPointer(), dstPtr.Pointer.ToPointer(), bytesToCopy, bytesToCopy);
  78. }
  79. }
  80. GC.KeepAlive(this); // ElemPtr is IntPtr to memory held by this object, so
  81. // make sure we are not disposed until finished with copy.
  82. return dst;
  83. }
  84. }