|
@@ -15,11 +15,16 @@ namespace bbiwarg.Recognition.FingerRecognition
|
|
|
{
|
|
|
class FingerDetector
|
|
|
{
|
|
|
+ private CoordinateConverter coordinateConverter;
|
|
|
private DepthImage depthImage;
|
|
|
private EdgeImage edgeImageOriginal;
|
|
|
private EdgeImage edgeImageAdapted;
|
|
|
private List<Finger> fingers;
|
|
|
|
|
|
+ public FingerDetector(CoordinateConverter coordinateConverter) {
|
|
|
+ this.coordinateConverter = coordinateConverter;
|
|
|
+ }
|
|
|
+
|
|
|
public void detectFingers(FrameData frameData)
|
|
|
{
|
|
|
depthImage = frameData.DepthImage;
|
|
@@ -97,9 +102,7 @@ namespace bbiwarg.Recognition.FingerRecognition
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
return null;
|
|
|
-
|
|
|
}
|
|
|
|
|
|
private FingerSliceTrail expandTrail(FingerSliceTrail trail, bool reversed = false)
|
|
@@ -147,34 +150,43 @@ namespace bbiwarg.Recognition.FingerRecognition
|
|
|
{
|
|
|
if (edgeImageAdapted.isRoughEdgeAt(position)) return null;
|
|
|
|
|
|
+ Int16 depth = depthImage.getDepthAt(position);
|
|
|
+ int maxWidth2D = (int)coordinateConverter.convertLength3Dto2D(Parameters.FingerMaxWidth3D, depth);
|
|
|
+
|
|
|
Vector2D dirStart = direction.getOrthogonal(reversed);
|
|
|
Vector2D dirEnd = direction.getOrthogonal(!reversed);
|
|
|
|
|
|
- Vector2D start = edgeImageAdapted.findNextRoughEdge(position, dirStart, Parameters.FingerMaxWidth);
|
|
|
+ Vector2D startPositionStart = position + 0.5f*Parameters.FingerMinWidth2D * dirStart;
|
|
|
+ Vector2D start = edgeImageAdapted.findNextRoughEdge(startPositionStart, dirStart, maxWidth2D);
|
|
|
if (start == null) return null;
|
|
|
|
|
|
- Vector2D end = edgeImageAdapted.findNextRoughEdge(position, dirEnd, Parameters.FingerMaxWidth);
|
|
|
+ Vector2D endPositionStart = position + 0.5f*Parameters.FingerMinWidth2D * dirEnd;
|
|
|
+ Vector2D end = edgeImageAdapted.findNextRoughEdge(position, dirEnd, maxWidth2D);
|
|
|
if (end == null) return null;
|
|
|
-
|
|
|
- return getFingerSlice(start, end);
|
|
|
+
|
|
|
+ FingerSlice slice = new FingerSlice(start, end);
|
|
|
+ if (!fingerSliceDepthTest(slice) || slice.Length > maxWidth2D)
|
|
|
+ return null;
|
|
|
+
|
|
|
+ return slice;
|
|
|
}
|
|
|
+
|
|
|
private FingerSlice findFingerSliceFromStartEdge(Vector2D start, Vector2D direction)
|
|
|
{
|
|
|
- Vector2D searchStart = start + Parameters.FingerContourMargin * direction;
|
|
|
- Vector2D end = edgeImageAdapted.findNextRoughEdge(searchStart, direction, Parameters.FingerMaxWidth);
|
|
|
+ Vector2D searchStart = start + Parameters.FingerMinWidth2D * direction;
|
|
|
+
|
|
|
+ Int16 depth = depthImage.getDepthAt(start);
|
|
|
+ int maxWidth2D = (int)coordinateConverter.convertLength3Dto2D(Parameters.FingerMaxWidth3D, depth);
|
|
|
+
|
|
|
+ Vector2D end = edgeImageAdapted.findNextRoughEdge(searchStart, direction, maxWidth2D);
|
|
|
if (end == null)
|
|
|
return null;
|
|
|
|
|
|
- return getFingerSlice(start, end);
|
|
|
- }
|
|
|
-
|
|
|
- private FingerSlice getFingerSlice(Vector2D start, Vector2D end)
|
|
|
- {
|
|
|
FingerSlice slice = new FingerSlice(start, end);
|
|
|
- if (slice.Length >= Parameters.FingerMinWidth && slice.Length <= Parameters.FingerMaxWidth && fingerSliceDepthTest(slice))
|
|
|
- return slice;
|
|
|
+ if (!fingerSliceDepthTest(slice))
|
|
|
+ return null;
|
|
|
|
|
|
- return null;
|
|
|
+ return slice;
|
|
|
}
|
|
|
|
|
|
private bool fingerSliceDepthTest(FingerSlice slice)
|