VectorOfImageFeatures.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. using OpenCvSharp.Detail;
  2. namespace OpenCvSharp.Internal.Vectors;
  3. /// <summary>
  4. /// </summary>
  5. public class VectorOfImageFeatures : DisposableCvObject, IStdVector<ImageFeatures>
  6. {
  7. /// <summary>
  8. /// Constructor
  9. /// </summary>
  10. public VectorOfImageFeatures()
  11. {
  12. ptr = NativeMethods.vector_ImageFeatures_new1();
  13. }
  14. /// <summary>
  15. /// Releases unmanaged resources
  16. /// </summary>
  17. protected override void DisposeUnmanaged()
  18. {
  19. NativeMethods.vector_ImageFeatures_delete(ptr);
  20. base.DisposeUnmanaged();
  21. }
  22. /// <summary>
  23. /// vector.size()
  24. /// </summary>
  25. public int Size
  26. {
  27. get
  28. {
  29. var res = NativeMethods.vector_ImageFeatures_getSize(ptr);
  30. GC.KeepAlive(this);
  31. return (int)res;
  32. }
  33. }
  34. /// <summary>
  35. /// Converts std::vector to managed array
  36. /// </summary>
  37. /// <returns></returns>
  38. public ImageFeatures[] ToArray()
  39. {
  40. var size = Size;
  41. if (size == 0)
  42. return Array.Empty<ImageFeatures>();
  43. VectorOfKeyPoint[]? keypointsVecs = null;
  44. Mat[]? descriptors = null;
  45. try
  46. {
  47. var nativeResult = new WImageFeatures[size];
  48. keypointsVecs = new VectorOfKeyPoint[size];
  49. descriptors = new Mat[size];
  50. for (int i = 0; i < size; i++)
  51. {
  52. keypointsVecs[i] = new VectorOfKeyPoint();
  53. descriptors[i] = new Mat();
  54. nativeResult[i].Keypoints = keypointsVecs[i].CvPtr;
  55. nativeResult[i].Descriptors = descriptors[i].CvPtr;
  56. }
  57. NativeMethods.vector_ImageFeatures_getElements(ptr, nativeResult);
  58. var result = new ImageFeatures[size];
  59. for (int i = 0; i < size; i++)
  60. {
  61. result[i] = new ImageFeatures(
  62. imgIdx: nativeResult[i].ImgIdx,
  63. imgSize: nativeResult[i].ImgSize,
  64. keypoints: keypointsVecs[i].ToArray(),
  65. descriptors: descriptors[i]);
  66. }
  67. // ElemPtr is IntPtr to memory held by this object, so make sure we are not disposed until finished with copy.
  68. GC.KeepAlive(this);
  69. return result;
  70. }
  71. catch
  72. {
  73. if (descriptors is not null)
  74. {
  75. foreach (var mat in descriptors)
  76. {
  77. mat.Dispose();
  78. }
  79. }
  80. throw;
  81. }
  82. finally
  83. {
  84. #pragma warning disable CA1508 // (???) Avoid dead conditional code
  85. if (keypointsVecs is not null)
  86. {
  87. foreach (var vec in keypointsVecs)
  88. {
  89. vec.Dispose();
  90. }
  91. }
  92. #pragma warning restore CA1508
  93. }
  94. }
  95. private int[] KeypointsSizes(int size)
  96. {
  97. var ret = new nuint[size];
  98. NativeMethods.vector_ImageFeatures_getKeypointsSize(ptr, ret);
  99. GC.KeepAlive(this);
  100. return ret.Select(v => (int)v).ToArray();
  101. }
  102. }