Browse Source

Added XImgproc.ScanSegment class.

pull/703/head
Canming Huang 4 years ago
parent
commit
a048019039
  1. 106
      Emgu.CV.Contrib/XImgproc/ScanSegment.cs
  2. 52
      Emgu.CV.Extern/ximgproc/ximgproc_c.cpp
  3. 13
      Emgu.CV.Extern/ximgproc/ximgproc_c.h
  4. 17
      Emgu.CV.Test/AutoTestVarious.cs
  5. 2
      Emgu.CV.Test/Emgu.CV.Test.NetFramework.csproj
  6. 2
      Emgu.CV.Test/Emgu.CV.Test.Netcore/Emgu.CV.Test.Netcore.csproj

106
Emgu.CV.Contrib/XImgproc/ScanSegment.cs

@ -0,0 +1,106 @@
//----------------------------------------------------------------------------
// Copyright (C) 2004-2021 by EMGU Corporation. All rights reserved.
//----------------------------------------------------------------------------
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
using Emgu.Util;
using Emgu.CV;
using Emgu.CV.Util;
namespace Emgu.CV.XImgproc
{
public class ScanSegment : SharedPtrObject, IAlgorithm
{
private IntPtr _algorithm;
/// <summary>
/// Pointer to cv::Algorithm
/// </summary>
public IntPtr AlgorithmPtr
{
get { return _algorithm; }
}
public ScanSegment(
int imageWidth,
int imageHeight,
int numSuperpixels,
int slices = 8,
bool mergeSmall = true)
{
_ptr = XImgprocInvoke.cveScanSegmentCreate(
imageWidth,
imageHeight,
numSuperpixels,
slices,
mergeSmall,
ref _algorithm,
ref _sharedPtr);
}
public void Iterate(IInputArray img)
{
using(InputArray iaImg = img.GetInputArray())
XImgprocInvoke.cveScanSegmentIterate(_ptr, iaImg);
}
public void GetLabels(IOutputArray labelsOut)
{
using (OutputArray oaLabelsOut = labelsOut.GetOutputArray())
XImgprocInvoke.cveScanSegmentGetLabels(_ptr, oaLabelsOut);
}
public void GetLabelContourMask(IOutputArray image, bool thickLine=false)
{
using (OutputArray oaImage = image.GetOutputArray())
XImgprocInvoke.cveScanSegmentGetLabelContourMask(_ptr, oaImage, thickLine);
}
/// <inheritdoc />
protected override void DisposeObject()
{
if (_sharedPtr != IntPtr.Zero)
{
XImgprocInvoke.cveScanSegmentRelease(ref _sharedPtr);
_ptr = IntPtr.Zero;
}
}
}
public static partial class XImgprocInvoke
{
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern IntPtr cveScanSegmentCreate(
int imageWidth,
int imageHeight,
int numSuperpixels,
int slices,
[MarshalAs(CvInvoke.BoolMarshalType)]
bool mergeSmall,
ref IntPtr algorithm,
ref IntPtr sharedPtr);
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern void cveScanSegmentIterate(IntPtr scanSegment, IntPtr img);
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern void cveScanSegmentGetLabels(IntPtr scanSegment, IntPtr labelsOut);
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern void cveScanSegmentGetLabelContourMask(
IntPtr scanSegment,
IntPtr image,
[MarshalAs(CvInvoke.BoolMarshalType)]
bool thickLine);
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern void cveScanSegmentRelease(ref IntPtr sharedPtr);
}
}

52
Emgu.CV.Extern/ximgproc/ximgproc_c.cpp

@ -820,4 +820,56 @@ void cveEdgeDrawingRelease(cv::Ptr<cv::ximgproc::EdgeDrawing>** sharedPtr)
#else
throw_no_ximgproc();
#endif
}
cv::ximgproc::ScanSegment* cveScanSegmentCreate(
int imageWidth,
int imageHeight,
int numSuperpixels,
int slices,
bool mergeSmall,
cv::Algorithm** algorithm,
cv::Ptr< cv::ximgproc::ScanSegment >** sharedPtr)
{
#ifdef HAVE_OPENCV_XIMGPROC
cv::Ptr<cv::ximgproc::ScanSegment> ptr = cv::ximgproc::createScanSegment(imageWidth, imageHeight, numSuperpixels, slices, mergeSmall);
*sharedPtr = new cv::Ptr<cv::ximgproc::ScanSegment>(ptr);
*algorithm = (*sharedPtr)->dynamicCast<cv::Algorithm>();
return (*sharedPtr)->get();
#else
throw_no_ximgproc();
#endif
}
void cveScanSegmentIterate(cv::ximgproc::ScanSegment* scanSegment, cv::_InputArray* img)
{
#ifdef HAVE_OPENCV_XIMGPROC
scanSegment->iterate(*img);
#else
throw_no_ximgproc();
#endif
}
void cveScanSegmentGetLabels(cv::ximgproc::ScanSegment* scanSegment, cv::_OutputArray* labelsOut)
{
#ifdef HAVE_OPENCV_XIMGPROC
scanSegment->getLabels(*labelsOut);
#else
throw_no_ximgproc();
#endif
}
void cveScanSegmentGetLabelContourMask(cv::ximgproc::ScanSegment* scanSegment, cv::_OutputArray* image, bool thickLine)
{
#ifdef HAVE_OPENCV_XIMGPROC
scanSegment->getLabelContourMask(*image, thickLine);
#else
throw_no_ximgproc();
#endif
}
void cveScanSegmentRelease(cv::Ptr<cv::ximgproc::ScanSegment>** sharedPtr)
{
#ifdef HAVE_OPENCV_XIMGPROC
delete* sharedPtr;
*sharedPtr = 0;
#else
throw_no_ximgproc();
#endif
}

13
Emgu.CV.Extern/ximgproc/ximgproc_c.h

@ -190,4 +190,17 @@ CVAPI(void) cveEdgeDrawingGetGradientImage(cv::ximgproc::EdgeDrawing* edgeDrawin
CVAPI(void) cveEdgeDrawingDetectLines(cv::ximgproc::EdgeDrawing* edgeDrawing, cv::_OutputArray* lines);
CVAPI(void) cveEdgeDrawingDetectEllipses(cv::ximgproc::EdgeDrawing* edgeDrawing, cv::_OutputArray* ellipses);
CVAPI(void) cveEdgeDrawingRelease(cv::Ptr<cv::ximgproc::EdgeDrawing>** sharedPtr);
CVAPI(cv::ximgproc::ScanSegment*) cveScanSegmentCreate(
int imageWidth,
int imageHeight,
int numSuperpixels,
int slices,
bool mergeSmall,
cv::Algorithm** algorithm,
cv::Ptr< cv::ximgproc::ScanSegment > ** sharedPtr);
CVAPI(void) cveScanSegmentIterate(cv::ximgproc::ScanSegment* scanSegment, cv::_InputArray* img);
CVAPI(void) cveScanSegmentGetLabels(cv::ximgproc::ScanSegment* scanSegment, cv::_OutputArray* labelsOut);
CVAPI(void) cveScanSegmentGetLabelContourMask(cv::ximgproc::ScanSegment* scanSegment, cv::_OutputArray* image, bool thickLine);
CVAPI(void) cveScanSegmentRelease(cv::Ptr<cv::ximgproc::ScanSegment>** sharedPtr);
#endif

17
Emgu.CV.Test/AutoTestVarious.cs

@ -4400,6 +4400,23 @@ namespace Emgu.CV.Test
}
}
[Test]
public void TestScanSegment()
{
using (Mat image = EmguAssert.LoadMat("lena.jpg"))
using (ScanSegment ss = new ScanSegment(image.Width, image.Height, 1))
using (Mat contours = new Mat())
using (Mat contoursBgr = new Mat())
{
ss.Iterate(image);
ss.GetLabelContourMask(contours);
CvInvoke.CvtColor(contours, contoursBgr, ColorConversion.Gray2Bgr);
CvInvoke.BitwiseOr(image, contoursBgr, image);
//Emgu.CV.UI.ImageViewer.Show(image);
}
}
#if VS_TEST
[Ignore]
#else

2
Emgu.CV.Test/Emgu.CV.Test.NetFramework.csproj

@ -350,7 +350,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="System.Drawing.Common">
<Version>5.0.1</Version>
<Version>6.0.0</Version>
</PackageReference>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />

2
Emgu.CV.Test/Emgu.CV.Test.Netcore/Emgu.CV.Test.Netcore.csproj

@ -31,7 +31,7 @@
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="nunit" Version="3.13.2" />
<PackageReference Include="NUnit3TestAdapter" Version="4.1.0">
<PackageReference Include="NUnit3TestAdapter" Version="4.2.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>

Loading…
Cancel
Save