blob: c880cee5ca920179515ca2dbffecaf63a0a665ee (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
/*
* GNU AFFERO GENERAL PUBLIC LICENSE
* Version 3, 19 November 2007
* Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/
using System;
using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Util;
namespace UVtools.GUI
{
public sealed class LayerCache
{
private Mat _image;
private Array _layerHierarchyJagged;
private VectorOfVectorOfPoint _layerContours;
private Mat _layerHierarchy;
public Mat Image
{
get => _image;
set
{
Clear();
_image = value;
}
}
public VectorOfVectorOfPoint LayerContours
{
get
{
if (_layerContours is null) CacheContours();
return _layerContours;
}
private set => _layerContours = value;
}
public Mat LayerHierarchy
{
get
{
if (_layerHierarchy is null) CacheContours();
return _layerHierarchy;
}
private set => _layerHierarchy = value;
}
public Array LayerHierarchyJagged
{
get
{
if(_layerHierarchyJagged is null) CacheContours();
return _layerHierarchyJagged;
}
private set => _layerHierarchyJagged = value;
}
public void CacheContours(bool refresh = false)
{
if(refresh) Clear();
if (!ReferenceEquals(_layerContours, null)) return;
_layerContours = new VectorOfVectorOfPoint();
_layerHierarchy = new Mat();
CvInvoke.FindContours(Image, _layerContours, _layerHierarchy, RetrType.Ccomp,
ChainApproxMethod.ChainApproxSimple);
_layerHierarchyJagged = _layerHierarchy.GetData();
}
/// <summary>
/// Clears the cache
/// </summary>
public void Clear()
{
_layerContours?.Dispose();
_layerContours = null;
_layerHierarchy?.Dispose();
_layerHierarchy = null;
_layerHierarchyJagged = null;
}
}
}
|