@@ -45,6 +45,19 @@ public class FilterContoursOperation implements Operation {
45
45
private final SocketHint <List > solidityHint =
46
46
SocketHints .Inputs .createNumberListRangeSocketHint ("Solidity" , 0 , 100 );
47
47
48
+ private final SocketHint <Number > minVertexHint =
49
+ SocketHints .Inputs .createNumberSpinnerSocketHint ("Min Vertices" , 0 , 0 , Integer .MAX_VALUE );
50
+
51
+ private final SocketHint <Number > maxVertexHint =
52
+ SocketHints .Inputs .createNumberSpinnerSocketHint ("Max Vertices" , 0 , 1000000 , Integer .MAX_VALUE );
53
+
54
+ private final SocketHint <Number > minRatioHint =
55
+ SocketHints .Inputs .createNumberSpinnerSocketHint ("Min Ratio" , 0 , 0 , Integer .MAX_VALUE );
56
+
57
+ private final SocketHint <Number > maxRatioHint =
58
+ SocketHints .Inputs .createNumberSpinnerSocketHint ("Max Ratio" , 1000 , 0 , Integer .MAX_VALUE );
59
+
60
+
48
61
@ Override
49
62
public String getName () {
50
63
return "Filter Contours" ;
@@ -76,6 +89,10 @@ public InputSocket<?>[] createInputSockets(EventBus eventBus) {
76
89
new InputSocket <>(eventBus , minHeightHint ),
77
90
new InputSocket <>(eventBus , maxHeightHint ),
78
91
new InputSocket <>(eventBus , solidityHint ),
92
+ new InputSocket <>(eventBus , minVertexHint ),
93
+ new InputSocket <>(eventBus , maxVertexHint ),
94
+ new InputSocket <>(eventBus , minRatioHint ),
95
+ new InputSocket <>(eventBus , maxRatioHint ),
79
96
};
80
97
}
81
98
@@ -96,6 +113,11 @@ public void perform(InputSocket<?>[] inputs, OutputSocket<?>[] outputs) {
96
113
final double maxHeight = ((Number ) inputs [6 ].getValue ().get ()).doubleValue ();
97
114
final double minSolidity = ((List <Number >) inputs [7 ].getValue ().get ()).get (0 ).doubleValue ();
98
115
final double maxSolidity = ((List <Number >) inputs [7 ].getValue ().get ()).get (1 ).doubleValue ();
116
+ final double minVertexCount = ((Number ) inputs [8 ].getValue ().get ()).doubleValue ();
117
+ final double maxVertexCount = ((Number ) inputs [9 ].getValue ().get ()).doubleValue ();
118
+ final double minRatio = ((Number ) inputs [10 ].getValue ().get ()).doubleValue ();
119
+ final double maxRatio = ((Number ) inputs [11 ].getValue ().get ()).doubleValue ();
120
+
99
121
100
122
final MatVector inputContours = inputSocket .getValue ().get ().getContours ();
101
123
final MatVector outputContours = new MatVector (inputContours .size ());
@@ -119,6 +141,11 @@ public void perform(InputSocket<?>[] inputs, OutputSocket<?>[] outputs) {
119
141
final double solidity = 100 * area / contourArea (hull );
120
142
if (solidity < minSolidity || solidity > maxSolidity ) continue ;
121
143
144
+ if (contour .rows () < minVertexCount || contour .rows () > maxVertexCount ) continue ;
145
+
146
+ final double ratio = bb .width () / bb .height ();
147
+ if (ratio < minRatio || ratio > maxRatio ) continue ;
148
+
122
149
outputContours .put (filteredContourCount ++, contour );
123
150
}
124
151
0 commit comments