diff --git a/Emgu.CV.Extern/shape/shape_c.cpp b/Emgu.CV.Extern/shape/shape_c.cpp index d3683b0a0..94ffe6400 100644 --- a/Emgu.CV.Extern/shape/shape_c.cpp +++ b/Emgu.CV.Extern/shape/shape_c.cpp @@ -6,69 +6,65 @@ #include "shape_c.h" -cv::HistogramCostExtractor* cvNormHistogramCostExtractorCreate(int flag, int nDummies, float defaultCost, cv::Ptr** sharedPtr) +cv::HistogramCostExtractor* cveNormHistogramCostExtractorCreate(int flag, int nDummies, float defaultCost, cv::Ptr** sharedPtr) { cv::Ptr ptr = cv::createNormHistogramCostExtractor(flag, nDummies, defaultCost); *sharedPtr = new cv::Ptr(ptr); return ptr.get(); } -cv::HistogramCostExtractor* cvEMDHistogramCostExtractorCreate(int flag, int nDummies, float defaultCost, cv::Ptr** sharedPtr) +cv::HistogramCostExtractor* cveEMDHistogramCostExtractorCreate(int flag, int nDummies, float defaultCost, cv::Ptr** sharedPtr) { cv::Ptr ptr = cv::createEMDHistogramCostExtractor(flag, nDummies, defaultCost); *sharedPtr = new cv::Ptr(ptr); return ptr.get(); } -cv::HistogramCostExtractor* cvChiHistogramCostExtractorCreate(int nDummies, float defaultCost, cv::Ptr** sharedPtr) +cv::HistogramCostExtractor* cveChiHistogramCostExtractorCreate(int nDummies, float defaultCost, cv::Ptr** sharedPtr) { cv::Ptr ptr = cv::createChiHistogramCostExtractor(nDummies, defaultCost); *sharedPtr = new cv::Ptr(ptr); return ptr.get(); } -cv::HistogramCostExtractor* cvEMDL1HistogramCostExtractorCreate(int nDummies, float defaultCost, cv::Ptr** sharedPtr) +cv::HistogramCostExtractor* cveEMDL1HistogramCostExtractorCreate(int nDummies, float defaultCost, cv::Ptr** sharedPtr) { cv::Ptr ptr = cv::createEMDL1HistogramCostExtractor(nDummies, defaultCost); *sharedPtr = new cv::Ptr(ptr); return ptr.get(); } -void cvHistogramCostExtractorRelease(cv::HistogramCostExtractor** extractor, cv::Ptr** sharedPtr) +void cveHistogramCostExtractorRelease(cv::Ptr** sharedPtr) { delete *sharedPtr; - *extractor = 0; *sharedPtr = 0; } - -cv::ThinPlateSplineShapeTransformer* cvThinPlateSplineShapeTransformerCreate(double regularizationParameter, cv::ShapeTransformer** transformer, cv::Ptr** sharedPtr) +cv::ThinPlateSplineShapeTransformer* cveThinPlateSplineShapeTransformerCreate(double regularizationParameter, cv::ShapeTransformer** transformer, cv::Ptr** sharedPtr) { cv::Ptr ptr = cv::createThinPlateSplineShapeTransformer(regularizationParameter); *sharedPtr = new cv::Ptr(ptr); *transformer = dynamic_cast(ptr.get()); - return ptr.get(); + return (*sharedPtr)->get(); } -void cvThinPlateSplineShapeTransformerRelease(cv::ThinPlateSplineShapeTransformer** transformer, cv::Ptr** sharedPtr) +void cveThinPlateSplineShapeTransformerRelease(cv::Ptr** sharedPtr) { delete *sharedPtr; - *transformer = 0; *sharedPtr = 0; } -cv::AffineTransformer* cvAffineTransformerCreate(bool fullAffine, cv::ShapeTransformer** transformer, cv::Ptr** sharedPtr) +cv::AffineTransformer* cveAffineTransformerCreate(bool fullAffine, cv::ShapeTransformer** transformer, cv::Ptr** sharedPtr) { cv::Ptr ptr = cv::createAffineTransformer(fullAffine); *sharedPtr = new cv::Ptr(ptr); *transformer = dynamic_cast(ptr.get()); - return ptr.get(); + return (*sharedPtr)->get(); } -void cvAffineTransformerRelease(cv::AffineTransformer** transformer, cv::Ptr** sharedPtr) +void cveAffineTransformerRelease(cv::Ptr** sharedPtr) { delete *sharedPtr; - *transformer = 0; *sharedPtr = 0; } @@ -77,7 +73,7 @@ float cvShapeDistanceExtractorComputeDistance(cv::ShapeDistanceExtractor* extrac return extractor->computeDistance(*contour1, *contour2); } -cv::ShapeContextDistanceExtractor* cvShapeContextDistanceExtractorCreate( +cv::ShapeContextDistanceExtractor* cveShapeContextDistanceExtractorCreate( int nAngularBins, int nRadialBins, float innerRadius, float outerRadius, int iterations, cv::HistogramCostExtractor* comparer, cv::ShapeTransformer* transformer, cv::ShapeDistanceExtractor** e, cv::Ptr** sharedPtr) @@ -91,23 +87,21 @@ cv::ShapeContextDistanceExtractor* cvShapeContextDistanceExtractorCreate( return ptr.get(); } -void cvShapeContextDistanceExtractorRelease(cv::ShapeContextDistanceExtractor** extractor, cv::Ptr** sharedPtr) +void cveShapeContextDistanceExtractorRelease(cv::Ptr** sharedPtr) { delete *sharedPtr; - *extractor = 0; *sharedPtr = 0; } -cv::HausdorffDistanceExtractor* cvHausdorffDistanceExtractorCreate(int distanceFlag, float rankProp, cv::ShapeDistanceExtractor** e, cv::Ptr** sharedPtr) +cv::HausdorffDistanceExtractor* cveHausdorffDistanceExtractorCreate(int distanceFlag, float rankProp, cv::ShapeDistanceExtractor** e, cv::Ptr** sharedPtr) { cv::Ptr ptr = cv::createHausdorffDistanceExtractor(distanceFlag, rankProp); *sharedPtr = new cv::Ptr(ptr); *e = dynamic_cast(ptr.get()); return ptr.get(); } -void cvHausdorffDistanceExtractorRelease(cv::HausdorffDistanceExtractor** extractor, cv::Ptr** sharedPtr) +void cveHausdorffDistanceExtractorRelease(cv::Ptr** sharedPtr) { delete *sharedPtr; - *extractor = 0; *sharedPtr = 0; } \ No newline at end of file diff --git a/Emgu.CV.Extern/shape/shape_c.h b/Emgu.CV.Extern/shape/shape_c.h index f82d2014b..287dcebec 100644 --- a/Emgu.CV.Extern/shape/shape_c.h +++ b/Emgu.CV.Extern/shape/shape_c.h @@ -11,31 +11,31 @@ #include "opencv2/core/core_c.h" #include "opencv2/shape/shape.hpp" -CVAPI(cv::HistogramCostExtractor*) cvNormHistogramCostExtractorCreate(int flag, int nDummies, float defaultCost, cv::Ptr** sharedPtr); +CVAPI(cv::HistogramCostExtractor*) cveNormHistogramCostExtractorCreate(int flag, int nDummies, float defaultCost, cv::Ptr** sharedPtr); -CVAPI(cv::HistogramCostExtractor*) cvEMDHistogramCostExtractorCreate(int flag, int nDummies, float defaultCost, cv::Ptr** sharedPtr); +CVAPI(cv::HistogramCostExtractor*) cveEMDHistogramCostExtractorCreate(int flag, int nDummies, float defaultCost, cv::Ptr** sharedPtr); -CVAPI(cv::HistogramCostExtractor*) cvChiHistogramCostExtractorCreate(int nDummies, float defaultCost, cv::Ptr** sharedPtr); +CVAPI(cv::HistogramCostExtractor*) cveChiHistogramCostExtractorCreate(int nDummies, float defaultCost, cv::Ptr** sharedPtr); -CVAPI(cv::HistogramCostExtractor*) cvEMDL1HistogramCostExtractorCreate(int nDummies, float defaultCost, cv::Ptr** sharedPtr); +CVAPI(cv::HistogramCostExtractor*) cveEMDL1HistogramCostExtractorCreate(int nDummies, float defaultCost, cv::Ptr** sharedPtr); -CVAPI(void) cvHistogramCostExtractorRelease(cv::HistogramCostExtractor** extractor, cv::Ptr** sharedPtr); +CVAPI(void) cveHistogramCostExtractorRelease(cv::Ptr** sharedPtr); -CVAPI(cv::ThinPlateSplineShapeTransformer*) cvThinPlateSplineShapeTransformerCreate(double regularizationParameter, cv::ShapeTransformer** shapeTransformer, cv::Ptr** sharedPtr); -CVAPI(void) cvThinPlateSplineShapeTransformerRelease(cv::ThinPlateSplineShapeTransformer** transformer, cv::Ptr** sharedPtr); +CVAPI(cv::ThinPlateSplineShapeTransformer*) cveThinPlateSplineShapeTransformerCreate(double regularizationParameter, cv::ShapeTransformer** shapeTransformer, cv::Ptr** sharedPtr); +CVAPI(void) cveThinPlateSplineShapeTransformerRelease(cv::Ptr** sharedPtr); -CVAPI(cv::AffineTransformer*) cvAffineTransformerCreate(bool fullAffine, cv::ShapeTransformer** transformer, cv::Ptr** sharedPtr); -CVAPI(void) cvAffineTransformerRelease(cv::AffineTransformer** transformer, cv::Ptr** sharedPtr); +CVAPI(cv::AffineTransformer*) cveAffineTransformerCreate(bool fullAffine, cv::ShapeTransformer** transformer, cv::Ptr** sharedPtr); +CVAPI(void) cveAffineTransformerRelease(cv::Ptr** sharedPtr); -CVAPI(float) cvShapeDistanceExtractorComputeDistance(cv::ShapeDistanceExtractor* extractor, cv::_InputArray* contour1, cv::_InputArray* contour2); +CVAPI(float) cveShapeDistanceExtractorComputeDistance(cv::ShapeDistanceExtractor* extractor, cv::_InputArray* contour1, cv::_InputArray* contour2); -CVAPI(cv::ShapeContextDistanceExtractor*) cvShapeContextDistanceExtractorCreate( +CVAPI(cv::ShapeContextDistanceExtractor*) cveShapeContextDistanceExtractorCreate( int nAngularBins, int nRadialBins, float innerRadius, float outerRadius, int iterations, cv::HistogramCostExtractor* comparer, cv::ShapeTransformer* transformer, cv::ShapeDistanceExtractor** e, cv::Ptr** sharedPtr); -CVAPI(void) cvShapeContextDistanceExtractorRelease(cv::ShapeContextDistanceExtractor** extractor, cv::Ptr** sharedPtr); +CVAPI(void) cveShapeContextDistanceExtractorRelease(cv::Ptr** sharedPtr); -CVAPI(cv::HausdorffDistanceExtractor*) cvHausdorffDistanceExtractorCreate(int distanceFlag, float rankProp, cv::ShapeDistanceExtractor** e, cv::Ptr** sharedPtr); -CVAPI(void) cvHausdorffDistanceExtractorRelease(cv::HausdorffDistanceExtractor** extractor, cv::Ptr** sharedPtr); +CVAPI(cv::HausdorffDistanceExtractor*) cveHausdorffDistanceExtractorCreate(int distanceFlag, float rankProp, cv::ShapeDistanceExtractor** e, cv::Ptr** sharedPtr); +CVAPI(void) cveHausdorffDistanceExtractorRelease(cv::Ptr** sharedPtr); #endif \ No newline at end of file diff --git a/Emgu.CV/Shape/HistogramCostExtractor.cs b/Emgu.CV/Shape/HistogramCostExtractor.cs index 03f852092..ead064edf 100644 --- a/Emgu.CV/Shape/HistogramCostExtractor.cs +++ b/Emgu.CV/Shape/HistogramCostExtractor.cs @@ -12,18 +12,15 @@ using Emgu.CV; using Emgu.CV.Structure; using Emgu.Util; using System.Diagnostics; +using Emgu.CV.Util; namespace Emgu.CV.Shape { /// /// Abstract base class for histogram cost algorithms. /// - public abstract class HistogramCostExtractor : UnmanagedObject + public abstract class HistogramCostExtractor : SharedPtrObject { - /// - /// Pointer native cv::Ptr object. - /// - protected IntPtr _sharedPtr; /// /// Release the histogram cost extractor @@ -32,7 +29,7 @@ namespace Emgu.CV.Shape { if (_ptr != IntPtr.Zero) { - ShapeInvoke.cvHistogramCostExtractorRelease(ref _ptr, ref _sharedPtr); + ShapeInvoke.cveHistogramCostExtractorRelease(ref _sharedPtr); } } } @@ -51,7 +48,7 @@ namespace Emgu.CV.Shape /// Default cost public NormHistogramCostExtractor(CvEnum.DistType flag = CvEnum.DistType.L2, int nDummies = 25, float defaultCost = 0.2f) { - _ptr = ShapeInvoke.cvNormHistogramCostExtractorCreate(flag, nDummies, defaultCost, ref _sharedPtr); + _ptr = ShapeInvoke.cveNormHistogramCostExtractorCreate(flag, nDummies, defaultCost, ref _sharedPtr); } } @@ -68,7 +65,7 @@ namespace Emgu.CV.Shape /// Default cost public EMDHistogramCostExtractor(CvEnum.DistType flag = CvEnum.DistType.L2, int nDummies = 25, float defaultCost = 0.2f) { - _ptr = ShapeInvoke.cvEMDHistogramCostExtractorCreate(flag, nDummies, defaultCost, ref _sharedPtr); + _ptr = ShapeInvoke.cveEMDHistogramCostExtractorCreate(flag, nDummies, defaultCost, ref _sharedPtr); } } @@ -84,7 +81,7 @@ namespace Emgu.CV.Shape /// Default cost public ChiHistogramCostExtractor(int nDummies = 25, float defaultCost = 0.2f) { - _ptr = ShapeInvoke.cvChiHistogramCostExtractorCreate(nDummies, defaultCost, ref _sharedPtr); + _ptr = ShapeInvoke.cveChiHistogramCostExtractorCreate(nDummies, defaultCost, ref _sharedPtr); } } @@ -100,7 +97,7 @@ namespace Emgu.CV.Shape /// Default cost public EMDL1HistogramCostExtractor(int nDummies = 25, float defaultCost = 0.2f) { - _ptr = ShapeInvoke.cvEMDL1HistogramCostExtractorCreate(nDummies, defaultCost, ref _sharedPtr); + _ptr = ShapeInvoke.cveEMDL1HistogramCostExtractorCreate(nDummies, defaultCost, ref _sharedPtr); } } @@ -115,18 +112,18 @@ namespace Emgu.CV.Shape } [DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)] - internal extern static IntPtr cvNormHistogramCostExtractorCreate(CvEnum.DistType flag, int nDummies, float defaultCost, ref IntPtr sharedPtr); + internal extern static IntPtr cveNormHistogramCostExtractorCreate(CvEnum.DistType flag, int nDummies, float defaultCost, ref IntPtr sharedPtr); [DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)] - internal extern static IntPtr cvEMDHistogramCostExtractorCreate(CvEnum.DistType flag, int nDummies, float defaultCost, ref IntPtr sharedPtr); + internal extern static IntPtr cveEMDHistogramCostExtractorCreate(CvEnum.DistType flag, int nDummies, float defaultCost, ref IntPtr sharedPtr); [DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)] - internal extern static IntPtr cvChiHistogramCostExtractorCreate(int nDummies, float defaultCost, ref IntPtr sharedPtr); + internal extern static IntPtr cveChiHistogramCostExtractorCreate(int nDummies, float defaultCost, ref IntPtr sharedPtr); [DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)] - internal extern static IntPtr cvEMDL1HistogramCostExtractorCreate(int nDummies, float defaultCost, ref IntPtr sharedPtr); + internal extern static IntPtr cveEMDL1HistogramCostExtractorCreate(int nDummies, float defaultCost, ref IntPtr sharedPtr); [DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)] - internal extern static void cvHistogramCostExtractorRelease(ref IntPtr extractor, ref IntPtr sharedPtr); + internal extern static void cveHistogramCostExtractorRelease(ref IntPtr sharedPtr); } } diff --git a/Emgu.CV/Shape/ShapeDistanceExtractor.cs b/Emgu.CV/Shape/ShapeDistanceExtractor.cs index 7a86f2433..8ae6818a2 100644 --- a/Emgu.CV/Shape/ShapeDistanceExtractor.cs +++ b/Emgu.CV/Shape/ShapeDistanceExtractor.cs @@ -12,13 +12,14 @@ using Emgu.CV; using Emgu.CV.Structure; using Emgu.Util; using System.Diagnostics; +using Emgu.CV.Util; namespace Emgu.CV.Shape { /// /// Abstract base class for shape distance algorithms. /// - public abstract class ShapeDistanceExtractor : UnmanagedObject + public abstract class ShapeDistanceExtractor : SharedPtrObject { /// /// Pointer to the unmanaged ShapeDistanceExtractor @@ -50,7 +51,7 @@ namespace Emgu.CV.Shape { using (InputArray iaContour1 = contour1.GetInputArray()) using (InputArray iaContour2 = contour2.GetInputArray()) - return ShapeInvoke.cvShapeDistanceExtractorComputeDistance(_shapeDistanceExtractorPtr, iaContour1, iaContour2); + return ShapeInvoke.cveShapeDistanceExtractorComputeDistance(_shapeDistanceExtractorPtr, iaContour1, iaContour2); } /// @@ -67,7 +68,7 @@ namespace Emgu.CV.Shape /// public partial class ShapeContextDistanceExtractor : ShapeDistanceExtractor { - private IntPtr _sharedPtr; + //private IntPtr _sharedPtr; /// /// Create a shape context distance extractor @@ -87,7 +88,7 @@ namespace Emgu.CV.Shape float outerRadius = 3, int iterations = 3) { - _ptr = ShapeInvoke.cvShapeContextDistanceExtractorCreate(nAngularBins, nRadialBins, innerRadius, outerRadius, iterations, comparer, transformer.ShapeTransformerPtr, ref _shapeDistanceExtractorPtr, ref _sharedPtr); + _ptr = ShapeInvoke.cveShapeContextDistanceExtractorCreate(nAngularBins, nRadialBins, innerRadius, outerRadius, iterations, comparer, transformer.ShapeTransformerPtr, ref _shapeDistanceExtractorPtr, ref _sharedPtr); } /// @@ -96,7 +97,7 @@ namespace Emgu.CV.Shape protected override void DisposeObject() { if (IntPtr.Zero != _ptr) - ShapeInvoke.cvShapeContextDistanceExtractorRelease(ref _ptr, ref _sharedPtr); + ShapeInvoke.cveShapeContextDistanceExtractorRelease(ref _sharedPtr); base.DisposeObject(); } } @@ -106,7 +107,7 @@ namespace Emgu.CV.Shape /// public class HausdorffDistanceExtractor : ShapeDistanceExtractor { - private IntPtr _sharedPtr; + //private IntPtr _sharedPtr; /// /// Create Hausdorff distance extractor @@ -115,7 +116,7 @@ namespace Emgu.CV.Shape /// The rank proportion (or fractional value) that establish the Kth ranked value of the partial Hausdorff distance. Experimentally had been shown that 0.6 is a good value to compare shapes. public HausdorffDistanceExtractor(CvEnum.DistType distanceFlag = CvEnum.DistType.L2, float rankProp = 0.6f) { - _ptr = ShapeInvoke.cvHausdorffDistanceExtractorCreate(distanceFlag, rankProp, ref _shapeDistanceExtractorPtr, ref _sharedPtr); + _ptr = ShapeInvoke.cveHausdorffDistanceExtractorCreate(distanceFlag, rankProp, ref _shapeDistanceExtractorPtr, ref _sharedPtr); } /// @@ -123,7 +124,12 @@ namespace Emgu.CV.Shape /// protected override void DisposeObject() { - ShapeInvoke.cvHausdorffDistanceExtractorRelease(ref _ptr, ref _sharedPtr); + if (_sharedPtr != IntPtr.Zero) + { + ShapeInvoke.cveHausdorffDistanceExtractorRelease(ref _sharedPtr); + _ptr = IntPtr.Zero; + } + base.DisposeObject(); } } @@ -131,20 +137,20 @@ namespace Emgu.CV.Shape public static partial class ShapeInvoke { [DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)] - internal extern static IntPtr cvShapeContextDistanceExtractorCreate( + internal extern static IntPtr cveShapeContextDistanceExtractorCreate( int nAngularBins, int nRadialBins, float innerRadius, float outerRadius, int iterations, IntPtr comparer, IntPtr transformer, ref IntPtr shapeDistanceExtractor, ref IntPtr sharedPtr); [DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)] - internal extern static void cvShapeContextDistanceExtractorRelease(ref IntPtr extractor, ref IntPtr sharedPtr); + internal extern static void cveShapeContextDistanceExtractorRelease(ref IntPtr sharedPtr); [DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)] - internal extern static IntPtr cvHausdorffDistanceExtractorCreate(CvEnum.DistType distanceFlag, float rankProp, ref IntPtr shapeDistanceExtractor, ref IntPtr sharedPtr); + internal extern static IntPtr cveHausdorffDistanceExtractorCreate(CvEnum.DistType distanceFlag, float rankProp, ref IntPtr shapeDistanceExtractor, ref IntPtr sharedPtr); [DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)] - internal extern static void cvHausdorffDistanceExtractorRelease(ref IntPtr extractor, ref IntPtr sharedPtr); + internal extern static void cveHausdorffDistanceExtractorRelease(ref IntPtr sharedPtr); [DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)] - internal extern static float cvShapeDistanceExtractorComputeDistance(IntPtr extractor, IntPtr contour1, IntPtr contour2); + internal extern static float cveShapeDistanceExtractorComputeDistance(IntPtr extractor, IntPtr contour1, IntPtr contour2); } } diff --git a/Emgu.CV/Shape/ShapeTransformer.cs b/Emgu.CV/Shape/ShapeTransformer.cs index ab4ada17c..a1108897a 100644 --- a/Emgu.CV/Shape/ShapeTransformer.cs +++ b/Emgu.CV/Shape/ShapeTransformer.cs @@ -11,6 +11,7 @@ using Emgu.CV; using Emgu.CV.Structure; using Emgu.Util; using System.Diagnostics; +using Emgu.CV.Util; namespace Emgu.CV.Shape { @@ -26,11 +27,10 @@ namespace Emgu.CV.Shape } /// - /// Definition of the transformation ocupied in the paper “Principal Warps: Thin-Plate Splines and Decomposition of Deformations”, by F.L. Bookstein (PAMI 1989). + /// Definition of the transformation occupied in the paper “Principal Warps: Thin-Plate Splines and Decomposition of Deformations”, by F.L. Bookstein (PAMI 1989). /// - public class ThinPlateSplineShapeTransformer : UnmanagedObject, IShapeTransformer + public class ThinPlateSplineShapeTransformer : SharedPtrObject, IShapeTransformer { - private IntPtr _sharedPtr; private IntPtr _shapeTransformerPtr; /// @@ -39,7 +39,7 @@ namespace Emgu.CV.Shape /// The regularization parameter for relaxing the exact interpolation requirements of the TPS algorithm. public ThinPlateSplineShapeTransformer(double regularizationParameter = 0) { - _ptr = ShapeInvoke.cvThinPlateSplineShapeTransformerCreate(regularizationParameter, ref _shapeTransformerPtr, ref _sharedPtr); + _ptr = ShapeInvoke.cveThinPlateSplineShapeTransformerCreate(regularizationParameter, ref _shapeTransformerPtr, ref _sharedPtr); } /// @@ -58,9 +58,10 @@ namespace Emgu.CV.Shape /// protected override void DisposeObject() { - if (_ptr != IntPtr.Zero) + if (_sharedPtr != IntPtr.Zero) { - ShapeInvoke.cvThinPlateSplineShapeTransformerRelease(ref _ptr, ref _sharedPtr); + ShapeInvoke.cveThinPlateSplineShapeTransformerRelease(ref _sharedPtr); + _ptr = IntPtr.Zero; _shapeTransformerPtr = IntPtr.Zero; } } @@ -69,10 +70,8 @@ namespace Emgu.CV.Shape /// /// Wrapper class for the OpenCV Affine Transformation algorithm. /// - public class AffineTransformer : UnmanagedObject, IShapeTransformer + public class AffineTransformer : SharedPtrObject, IShapeTransformer { - private IntPtr _sharedPtr; - private IntPtr _shapeTransformerPtr; /// @@ -81,7 +80,7 @@ namespace Emgu.CV.Shape /// Full affine public AffineTransformer(bool fullAffine) { - _ptr = ShapeInvoke.cvAffineTransformerCreate(fullAffine, ref _shapeTransformerPtr, ref _sharedPtr); + _ptr = ShapeInvoke.cveAffineTransformerCreate(fullAffine, ref _shapeTransformerPtr, ref _sharedPtr); } /// @@ -89,9 +88,10 @@ namespace Emgu.CV.Shape /// protected override void DisposeObject() { - if (_ptr != IntPtr.Zero) + if (_sharedPtr != IntPtr.Zero) { - ShapeInvoke.cvAffineTransformerRelease(ref _ptr, ref _sharedPtr); + ShapeInvoke.cveAffineTransformerRelease(ref _sharedPtr); + _ptr = IntPtr.Zero; _shapeTransformerPtr = IntPtr.Zero; } } @@ -105,17 +105,17 @@ namespace Emgu.CV.Shape public static partial class ShapeInvoke { [DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)] - internal extern static IntPtr cvAffineTransformerCreate( + internal extern static IntPtr cveAffineTransformerCreate( [MarshalAs(CvInvoke.BoolMarshalType)] bool fullAffine, ref IntPtr transformer, ref IntPtr sharedPtr); [DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)] - internal extern static void cvAffineTransformerRelease(ref IntPtr transformer, ref IntPtr sharedPtr); + internal extern static void cveAffineTransformerRelease(ref IntPtr sharedPtr); [DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)] - internal extern static IntPtr cvThinPlateSplineShapeTransformerCreate(double regularizationParameter, ref IntPtr transformer, ref IntPtr sharedPtr); + internal extern static IntPtr cveThinPlateSplineShapeTransformerCreate(double regularizationParameter, ref IntPtr transformer, ref IntPtr sharedPtr); [DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)] - internal extern static void cvThinPlateSplineShapeTransformerRelease(ref IntPtr transformer, ref IntPtr sharedPtr); + internal extern static void cveThinPlateSplineShapeTransformerRelease(ref IntPtr sharedPtr); } }