Browse Source

Use SharedPtrObject instead of UnmanagedObject as the based class in Shape module.

pull/348/head
Canming Huang 5 years ago
parent
commit
0177ed19f7
  1. 36
      Emgu.CV.Extern/shape/shape_c.cpp
  2. 28
      Emgu.CV.Extern/shape/shape_c.h
  3. 27
      Emgu.CV/Shape/HistogramCostExtractor.cs
  4. 32
      Emgu.CV/Shape/ShapeDistanceExtractor.cs
  5. 32
      Emgu.CV/Shape/ShapeTransformer.cs

36
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<cv::HistogramCostExtractor>** sharedPtr)
cv::HistogramCostExtractor* cveNormHistogramCostExtractorCreate(int flag, int nDummies, float defaultCost, cv::Ptr<cv::HistogramCostExtractor>** sharedPtr)
{
cv::Ptr<cv::HistogramCostExtractor> ptr = cv::createNormHistogramCostExtractor(flag, nDummies, defaultCost);
*sharedPtr = new cv::Ptr<cv::HistogramCostExtractor>(ptr);
return ptr.get();
}
cv::HistogramCostExtractor* cvEMDHistogramCostExtractorCreate(int flag, int nDummies, float defaultCost, cv::Ptr<cv::HistogramCostExtractor>** sharedPtr)
cv::HistogramCostExtractor* cveEMDHistogramCostExtractorCreate(int flag, int nDummies, float defaultCost, cv::Ptr<cv::HistogramCostExtractor>** sharedPtr)
{
cv::Ptr<cv::HistogramCostExtractor> ptr = cv::createEMDHistogramCostExtractor(flag, nDummies, defaultCost);
*sharedPtr = new cv::Ptr<cv::HistogramCostExtractor>(ptr);
return ptr.get();
}
cv::HistogramCostExtractor* cvChiHistogramCostExtractorCreate(int nDummies, float defaultCost, cv::Ptr<cv::HistogramCostExtractor>** sharedPtr)
cv::HistogramCostExtractor* cveChiHistogramCostExtractorCreate(int nDummies, float defaultCost, cv::Ptr<cv::HistogramCostExtractor>** sharedPtr)
{
cv::Ptr<cv::HistogramCostExtractor> ptr = cv::createChiHistogramCostExtractor(nDummies, defaultCost);
*sharedPtr = new cv::Ptr<cv::HistogramCostExtractor>(ptr);
return ptr.get();
}
cv::HistogramCostExtractor* cvEMDL1HistogramCostExtractorCreate(int nDummies, float defaultCost, cv::Ptr<cv::HistogramCostExtractor>** sharedPtr)
cv::HistogramCostExtractor* cveEMDL1HistogramCostExtractorCreate(int nDummies, float defaultCost, cv::Ptr<cv::HistogramCostExtractor>** sharedPtr)
{
cv::Ptr<cv::HistogramCostExtractor> ptr = cv::createEMDL1HistogramCostExtractor(nDummies, defaultCost);
*sharedPtr = new cv::Ptr<cv::HistogramCostExtractor>(ptr);
return ptr.get();
}
void cvHistogramCostExtractorRelease(cv::HistogramCostExtractor** extractor, cv::Ptr<cv::HistogramCostExtractor>** sharedPtr)
void cveHistogramCostExtractorRelease(cv::Ptr<cv::HistogramCostExtractor>** sharedPtr)
{
delete *sharedPtr;
*extractor = 0;
*sharedPtr = 0;
}
cv::ThinPlateSplineShapeTransformer* cvThinPlateSplineShapeTransformerCreate(double regularizationParameter, cv::ShapeTransformer** transformer, cv::Ptr<cv::ThinPlateSplineShapeTransformer>** sharedPtr)
cv::ThinPlateSplineShapeTransformer* cveThinPlateSplineShapeTransformerCreate(double regularizationParameter, cv::ShapeTransformer** transformer, cv::Ptr<cv::ThinPlateSplineShapeTransformer>** sharedPtr)
{
cv::Ptr<cv::ThinPlateSplineShapeTransformer> ptr = cv::createThinPlateSplineShapeTransformer(regularizationParameter);
*sharedPtr = new cv::Ptr<cv::ThinPlateSplineShapeTransformer>(ptr);
*transformer = dynamic_cast<cv::ShapeTransformer*>(ptr.get());
return ptr.get();
return (*sharedPtr)->get();
}
void cvThinPlateSplineShapeTransformerRelease(cv::ThinPlateSplineShapeTransformer** transformer, cv::Ptr<cv::ThinPlateSplineShapeTransformer>** sharedPtr)
void cveThinPlateSplineShapeTransformerRelease(cv::Ptr<cv::ThinPlateSplineShapeTransformer>** sharedPtr)
{
delete *sharedPtr;
*transformer = 0;
*sharedPtr = 0;
}
cv::AffineTransformer* cvAffineTransformerCreate(bool fullAffine, cv::ShapeTransformer** transformer, cv::Ptr<cv::AffineTransformer>** sharedPtr)
cv::AffineTransformer* cveAffineTransformerCreate(bool fullAffine, cv::ShapeTransformer** transformer, cv::Ptr<cv::AffineTransformer>** sharedPtr)
{
cv::Ptr<cv::AffineTransformer> ptr = cv::createAffineTransformer(fullAffine);
*sharedPtr = new cv::Ptr<cv::AffineTransformer>(ptr);
*transformer = dynamic_cast<cv::ShapeTransformer*>(ptr.get());
return ptr.get();
return (*sharedPtr)->get();
}
void cvAffineTransformerRelease(cv::AffineTransformer** transformer, cv::Ptr<cv::AffineTransformer>** sharedPtr)
void cveAffineTransformerRelease(cv::Ptr<cv::AffineTransformer>** 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<cv::ShapeContextDistanceExtractor>** sharedPtr)
@ -91,23 +87,21 @@ cv::ShapeContextDistanceExtractor* cvShapeContextDistanceExtractorCreate(
return ptr.get();
}
void cvShapeContextDistanceExtractorRelease(cv::ShapeContextDistanceExtractor** extractor, cv::Ptr<cv::ShapeContextDistanceExtractor>** sharedPtr)
void cveShapeContextDistanceExtractorRelease(cv::Ptr<cv::ShapeContextDistanceExtractor>** sharedPtr)
{
delete *sharedPtr;
*extractor = 0;
*sharedPtr = 0;
}
cv::HausdorffDistanceExtractor* cvHausdorffDistanceExtractorCreate(int distanceFlag, float rankProp, cv::ShapeDistanceExtractor** e, cv::Ptr<cv::HausdorffDistanceExtractor>** sharedPtr)
cv::HausdorffDistanceExtractor* cveHausdorffDistanceExtractorCreate(int distanceFlag, float rankProp, cv::ShapeDistanceExtractor** e, cv::Ptr<cv::HausdorffDistanceExtractor>** sharedPtr)
{
cv::Ptr<cv::HausdorffDistanceExtractor> ptr = cv::createHausdorffDistanceExtractor(distanceFlag, rankProp);
*sharedPtr = new cv::Ptr<cv::HausdorffDistanceExtractor>(ptr);
*e = dynamic_cast<cv::ShapeDistanceExtractor*>(ptr.get());
return ptr.get();
}
void cvHausdorffDistanceExtractorRelease(cv::HausdorffDistanceExtractor** extractor, cv::Ptr<cv::HausdorffDistanceExtractor>** sharedPtr)
void cveHausdorffDistanceExtractorRelease(cv::Ptr<cv::HausdorffDistanceExtractor>** sharedPtr)
{
delete *sharedPtr;
*extractor = 0;
*sharedPtr = 0;
}

28
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<cv::HistogramCostExtractor>** sharedPtr);
CVAPI(cv::HistogramCostExtractor*) cveNormHistogramCostExtractorCreate(int flag, int nDummies, float defaultCost, cv::Ptr<cv::HistogramCostExtractor>** sharedPtr);
CVAPI(cv::HistogramCostExtractor*) cvEMDHistogramCostExtractorCreate(int flag, int nDummies, float defaultCost, cv::Ptr<cv::HistogramCostExtractor>** sharedPtr);
CVAPI(cv::HistogramCostExtractor*) cveEMDHistogramCostExtractorCreate(int flag, int nDummies, float defaultCost, cv::Ptr<cv::HistogramCostExtractor>** sharedPtr);
CVAPI(cv::HistogramCostExtractor*) cvChiHistogramCostExtractorCreate(int nDummies, float defaultCost, cv::Ptr<cv::HistogramCostExtractor>** sharedPtr);
CVAPI(cv::HistogramCostExtractor*) cveChiHistogramCostExtractorCreate(int nDummies, float defaultCost, cv::Ptr<cv::HistogramCostExtractor>** sharedPtr);
CVAPI(cv::HistogramCostExtractor*) cvEMDL1HistogramCostExtractorCreate(int nDummies, float defaultCost, cv::Ptr<cv::HistogramCostExtractor>** sharedPtr);
CVAPI(cv::HistogramCostExtractor*) cveEMDL1HistogramCostExtractorCreate(int nDummies, float defaultCost, cv::Ptr<cv::HistogramCostExtractor>** sharedPtr);
CVAPI(void) cvHistogramCostExtractorRelease(cv::HistogramCostExtractor** extractor, cv::Ptr<cv::HistogramCostExtractor>** sharedPtr);
CVAPI(void) cveHistogramCostExtractorRelease(cv::Ptr<cv::HistogramCostExtractor>** sharedPtr);
CVAPI(cv::ThinPlateSplineShapeTransformer*) cvThinPlateSplineShapeTransformerCreate(double regularizationParameter, cv::ShapeTransformer** shapeTransformer, cv::Ptr<cv::ThinPlateSplineShapeTransformer>** sharedPtr);
CVAPI(void) cvThinPlateSplineShapeTransformerRelease(cv::ThinPlateSplineShapeTransformer** transformer, cv::Ptr<cv::ThinPlateSplineShapeTransformer>** sharedPtr);
CVAPI(cv::ThinPlateSplineShapeTransformer*) cveThinPlateSplineShapeTransformerCreate(double regularizationParameter, cv::ShapeTransformer** shapeTransformer, cv::Ptr<cv::ThinPlateSplineShapeTransformer>** sharedPtr);
CVAPI(void) cveThinPlateSplineShapeTransformerRelease(cv::Ptr<cv::ThinPlateSplineShapeTransformer>** sharedPtr);
CVAPI(cv::AffineTransformer*) cvAffineTransformerCreate(bool fullAffine, cv::ShapeTransformer** transformer, cv::Ptr<cv::AffineTransformer>** sharedPtr);
CVAPI(void) cvAffineTransformerRelease(cv::AffineTransformer** transformer, cv::Ptr<cv::AffineTransformer>** sharedPtr);
CVAPI(cv::AffineTransformer*) cveAffineTransformerCreate(bool fullAffine, cv::ShapeTransformer** transformer, cv::Ptr<cv::AffineTransformer>** sharedPtr);
CVAPI(void) cveAffineTransformerRelease(cv::Ptr<cv::AffineTransformer>** 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<cv::ShapeContextDistanceExtractor>** sharedPtr);
CVAPI(void) cvShapeContextDistanceExtractorRelease(cv::ShapeContextDistanceExtractor** extractor, cv::Ptr<cv::ShapeContextDistanceExtractor>** sharedPtr);
CVAPI(void) cveShapeContextDistanceExtractorRelease(cv::Ptr<cv::ShapeContextDistanceExtractor>** sharedPtr);
CVAPI(cv::HausdorffDistanceExtractor*) cvHausdorffDistanceExtractorCreate(int distanceFlag, float rankProp, cv::ShapeDistanceExtractor** e, cv::Ptr<cv::HausdorffDistanceExtractor>** sharedPtr);
CVAPI(void) cvHausdorffDistanceExtractorRelease(cv::HausdorffDistanceExtractor** extractor, cv::Ptr<cv::HausdorffDistanceExtractor>** sharedPtr);
CVAPI(cv::HausdorffDistanceExtractor*) cveHausdorffDistanceExtractorCreate(int distanceFlag, float rankProp, cv::ShapeDistanceExtractor** e, cv::Ptr<cv::HausdorffDistanceExtractor>** sharedPtr);
CVAPI(void) cveHausdorffDistanceExtractorRelease(cv::Ptr<cv::HausdorffDistanceExtractor>** sharedPtr);
#endif

27
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
{
/// <summary>
/// Abstract base class for histogram cost algorithms.
/// </summary>
public abstract class HistogramCostExtractor : UnmanagedObject
public abstract class HistogramCostExtractor : SharedPtrObject
{
/// <summary>
/// Pointer native cv::Ptr object.
/// </summary>
protected IntPtr _sharedPtr;
/// <summary>
/// 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
/// <param name="defaultCost">Default cost</param>
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
/// <param name="defaultCost">Default cost</param>
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
/// <param name="defaultCost">Default cost</param>
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
/// <param name="defaultCost">Default cost</param>
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);
}
}

32
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
{
/// <summary>
/// Abstract base class for shape distance algorithms.
/// </summary>
public abstract class ShapeDistanceExtractor : UnmanagedObject
public abstract class ShapeDistanceExtractor : SharedPtrObject
{
/// <summary>
/// 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);
}
/// <summary>
@ -67,7 +68,7 @@ namespace Emgu.CV.Shape
/// </summary>
public partial class ShapeContextDistanceExtractor : ShapeDistanceExtractor
{
private IntPtr _sharedPtr;
//private IntPtr _sharedPtr;
/// <summary>
/// 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);
}
/// <summary>
@ -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
/// </summary>
public class HausdorffDistanceExtractor : ShapeDistanceExtractor
{
private IntPtr _sharedPtr;
//private IntPtr _sharedPtr;
/// <summary>
/// Create Hausdorff distance extractor
@ -115,7 +116,7 @@ namespace Emgu.CV.Shape
/// <param name="rankProp">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.</param>
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);
}
/// <summary>
@ -123,7 +124,12 @@ namespace Emgu.CV.Shape
/// </summary>
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);
}
}

32
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
}
/// <summary>
/// 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).
/// </summary>
public class ThinPlateSplineShapeTransformer : UnmanagedObject, IShapeTransformer
public class ThinPlateSplineShapeTransformer : SharedPtrObject, IShapeTransformer
{
private IntPtr _sharedPtr;
private IntPtr _shapeTransformerPtr;
/// <summary>
@ -39,7 +39,7 @@ namespace Emgu.CV.Shape
/// <param name="regularizationParameter">The regularization parameter for relaxing the exact interpolation requirements of the TPS algorithm.</param>
public ThinPlateSplineShapeTransformer(double regularizationParameter = 0)
{
_ptr = ShapeInvoke.cvThinPlateSplineShapeTransformerCreate(regularizationParameter, ref _shapeTransformerPtr, ref _sharedPtr);
_ptr = ShapeInvoke.cveThinPlateSplineShapeTransformerCreate(regularizationParameter, ref _shapeTransformerPtr, ref _sharedPtr);
}
/// <summary>
@ -58,9 +58,10 @@ namespace Emgu.CV.Shape
/// </summary>
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
/// <summary>
/// Wrapper class for the OpenCV Affine Transformation algorithm.
/// </summary>
public class AffineTransformer : UnmanagedObject, IShapeTransformer
public class AffineTransformer : SharedPtrObject, IShapeTransformer
{
private IntPtr _sharedPtr;
private IntPtr _shapeTransformerPtr;
/// <summary>
@ -81,7 +80,7 @@ namespace Emgu.CV.Shape
/// <param name="fullAffine">Full affine</param>
public AffineTransformer(bool fullAffine)
{
_ptr = ShapeInvoke.cvAffineTransformerCreate(fullAffine, ref _shapeTransformerPtr, ref _sharedPtr);
_ptr = ShapeInvoke.cveAffineTransformerCreate(fullAffine, ref _shapeTransformerPtr, ref _sharedPtr);
}
/// <summary>
@ -89,9 +88,10 @@ namespace Emgu.CV.Shape
/// </summary>
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);
}
}
Loading…
Cancel
Save