diff --git a/src/OpenCvSharp/Modules/core/Mat/MatOfT.cs b/src/OpenCvSharp/Modules/core/Mat/MatOfT.cs index e008c6bc9..46a98ce6d 100644 --- a/src/OpenCvSharp/Modules/core/Mat/MatOfT.cs +++ b/src/OpenCvSharp/Modules/core/Mat/MatOfT.cs @@ -90,7 +90,6 @@ private static MatType GetMatType() throw new NotSupportedException($"Type parameter {type} is not supported by Mat"); } - #region FromArray #if LANG_JP /// @@ -125,6 +124,7 @@ public static Mat FromArray(params TElem[] arr) return mat; } + #if LANG_JP /// /// M x N の行列として初期化し、指定した配列からデータをコピーする @@ -965,11 +965,64 @@ public Mat Reshape(params int[] newDims) public void Add(TElem value) { ThrowIfDisposed(); - //NativeMethods.core_Mat_push_back_Vec6f(ptr, value); - throw new NotImplementedException(); + + var methodInfo = typeof(AddFunctions).GetMethod( + "Run", + BindingFlags.Public | BindingFlags.Static, + null, + new[] { typeof(IntPtr), typeof(TElem) }, + null); + if (methodInfo == null) + throw new NotSupportedException($"Invalid argument type {typeof(TElem)}"); + methodInfo.Invoke(this, new object[] { ptr, value }); + GC.KeepAlive(this); } + private static class AddFunctions + { + public static void Run(IntPtr ptr, byte v) => NativeMethods.core_Mat_push_back_uchar(ptr, v); + public static void Run(IntPtr ptr, sbyte v) => NativeMethods.core_Mat_push_back_char(ptr, v); + public static void Run(IntPtr ptr, ushort v) => NativeMethods.core_Mat_push_back_ushort(ptr, v); + public static void Run(IntPtr ptr, short v) => NativeMethods.core_Mat_push_back_short(ptr, v); + public static void Run(IntPtr ptr, int v) => NativeMethods.core_Mat_push_back_int(ptr, v); + public static void Run(IntPtr ptr, float v) => NativeMethods.core_Mat_push_back_float(ptr, v); + public static void Run(IntPtr ptr, double v) => NativeMethods.core_Mat_push_back_double(ptr, v); + public static void Run(IntPtr ptr, Vec2b v) => NativeMethods.core_Mat_push_back_Vec2b(ptr, v); + public static void Run(IntPtr ptr, Vec3b v) => NativeMethods.core_Mat_push_back_Vec3b(ptr, v); + public static void Run(IntPtr ptr, Vec4b v) => NativeMethods.core_Mat_push_back_Vec4b(ptr, v); + public static void Run(IntPtr ptr, Vec6b v) => NativeMethods.core_Mat_push_back_Vec6b(ptr, v); + public static void Run(IntPtr ptr, Vec2w v) => NativeMethods.core_Mat_push_back_Vec2w(ptr, v); + public static void Run(IntPtr ptr, Vec3w v) => NativeMethods.core_Mat_push_back_Vec3w(ptr, v); + public static void Run(IntPtr ptr, Vec4w v) => NativeMethods.core_Mat_push_back_Vec4w(ptr, v); + public static void Run(IntPtr ptr, Vec6w v) => NativeMethods.core_Mat_push_back_Vec6w(ptr, v); + public static void Run(IntPtr ptr, Vec2s v) => NativeMethods.core_Mat_push_back_Vec2s(ptr, v); + public static void Run(IntPtr ptr, Vec3s v) => NativeMethods.core_Mat_push_back_Vec3s(ptr, v); + public static void Run(IntPtr ptr, Vec4s v) => NativeMethods.core_Mat_push_back_Vec4s(ptr, v); + public static void Run(IntPtr ptr, Vec6s v) => NativeMethods.core_Mat_push_back_Vec6s(ptr, v); + public static void Run(IntPtr ptr, Vec2i v) => NativeMethods.core_Mat_push_back_Vec2i(ptr, v); + public static void Run(IntPtr ptr, Vec3i v) => NativeMethods.core_Mat_push_back_Vec3i(ptr, v); + public static void Run(IntPtr ptr, Vec4i v) => NativeMethods.core_Mat_push_back_Vec4i(ptr, v); + public static void Run(IntPtr ptr, Vec6i v) => NativeMethods.core_Mat_push_back_Vec6i(ptr, v); + public static void Run(IntPtr ptr, Vec2f v) => NativeMethods.core_Mat_push_back_Vec2f(ptr, v); + public static void Run(IntPtr ptr, Vec3f v) => NativeMethods.core_Mat_push_back_Vec3f(ptr, v); + public static void Run(IntPtr ptr, Vec4f v) => NativeMethods.core_Mat_push_back_Vec4f(ptr, v); + public static void Run(IntPtr ptr, Vec6f v) => NativeMethods.core_Mat_push_back_Vec6f(ptr, v); + public static void Run(IntPtr ptr, Vec2d v) => NativeMethods.core_Mat_push_back_Vec2d(ptr, v); + public static void Run(IntPtr ptr, Vec3d v) => NativeMethods.core_Mat_push_back_Vec3d(ptr, v); + public static void Run(IntPtr ptr, Vec4d v) => NativeMethods.core_Mat_push_back_Vec4d(ptr, v); + public static void Run(IntPtr ptr, Vec6d v) => NativeMethods.core_Mat_push_back_Vec6d(ptr, v); + public static void Run(IntPtr ptr, Point v) => NativeMethods.core_Mat_push_back_Point(ptr, v); + public static void Run(IntPtr ptr, Point2d v) => NativeMethods.core_Mat_push_back_Point2d(ptr, v); + public static void Run(IntPtr ptr, Point2f v) => NativeMethods.core_Mat_push_back_Point2f(ptr, v); + public static void Run(IntPtr ptr, Point3i v) => NativeMethods.core_Mat_push_back_Point3i(ptr, v); + public static void Run(IntPtr ptr, Point3d v) => NativeMethods.core_Mat_push_back_Point3d(ptr, v); + public static void Run(IntPtr ptr, Point3f v) => NativeMethods.core_Mat_push_back_Point3f(ptr, v); + public static void Run(IntPtr ptr, Size v) => NativeMethods.core_Mat_push_back_Size(ptr, v); + public static void Run(IntPtr ptr, Size2f v) => NativeMethods.core_Mat_push_back_Size2f(ptr, v); + public static void Run(IntPtr ptr, Rect v) => NativeMethods.core_Mat_push_back_Rect(ptr, v); + } + /// /// Removes the first occurrence of a specific object from the ICollection<T>. /// diff --git a/src/OpenCvSharp/PInvoke/core/NativeMethods_core_Mat.cs b/src/OpenCvSharp/PInvoke/core/NativeMethods_core_Mat.cs index 4690d2e68..ef33be12c 100644 --- a/src/OpenCvSharp/PInvoke/core/NativeMethods_core_Mat.cs +++ b/src/OpenCvSharp/PInvoke/core/NativeMethods_core_Mat.cs @@ -508,6 +508,8 @@ public static extern unsafe int core_Mat_nGetRect(IntPtr obj, int row, int col, [DllImport(DllExtern, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] public static extern void core_Mat_push_back_Vec3d(IntPtr self, Vec3d v); [DllImport(DllExtern, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] + public static extern void core_Mat_push_back_Vec4d(IntPtr self, Vec4d v); + [DllImport(DllExtern, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] public static extern void core_Mat_push_back_Vec6d(IntPtr self, Vec6d v); [DllImport(DllExtern, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] diff --git a/test/OpenCvSharp.Tests/core/MatTest.cs b/test/OpenCvSharp.Tests/core/MatTest.cs index b5d0ac28b..a2435aa1a 100644 --- a/test/OpenCvSharp.Tests/core/MatTest.cs +++ b/test/OpenCvSharp.Tests/core/MatTest.cs @@ -131,6 +131,22 @@ public void Diag() Assert.Equal(100, diag.Get(2, 2)); } } + + [Fact] + public void Add() + { + using (var m = new Mat()) + { + m.Add(1.2); + m.Add(3.4); + m.Add(5.6); + + var indexer = m.GetIndexer(); + Assert.Equal(1.2, m.Get(0), 6); + Assert.Equal(3.4, m.Get(1), 6); + Assert.Equal(5.6, m.Get(2), 6); + } + } [Fact] public void MatOfDoubleFromArray()