From ee13c0b2f9c3d98c23b288957945bdfe82d4bd43 Mon Sep 17 00:00:00 2001 From: Matt Date: Mon, 24 Feb 2020 22:12:42 -0800 Subject: [PATCH] Use goodFeaturesToTrack, update test --- .../vision/pipeline/pipes/SolvePNPPipe.java | 57 ++++++++++++++++--- .../vision/pipeline/SolvePNPtest.java | 19 +++++-- 2 files changed, 63 insertions(+), 13 deletions(-) diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/SolvePNPPipe.java b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/SolvePNPPipe.java index 8a7467fb1..1340e83e7 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/SolvePNPPipe.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/SolvePNPPipe.java @@ -14,6 +14,7 @@ import org.opencv.core.*; import org.opencv.imgproc.Imgproc; import java.util.*; +import java.util.stream.Collectors; public class SolvePNPPipe implements Pipe, Mat>, List> { @@ -108,14 +109,18 @@ public class SolvePNPPipe implements Pipe(corners.toList()); + approxf1.fromList(origCornerList.stream() + .map(it -> new Point(it.x - target.boundingRect.x, it.y - target.boundingRect.y)) + .collect(Collectors.toList()) + ); + var croppedImage = greyImg.submat(target.boundingRect); + + Imgproc.goodFeaturesToTrack(croppedImage, approxf1, 0, 0.01, 5); + + // at this point corners is still unmodified so let's map it + List tempList = new ArrayList<>(); + + // shift all points back into global pose + var reshiftedList = approxf1.toList().stream().map(it -> new Point(it.x + target.boundingRect.x, it.y + target.boundingRect.y)) + .collect(Collectors.toList()); + for(Point p: origCornerList) { + // find the goodFeaturesToTrack corner closest to me + var closestPoint = reshiftedList.stream().min(Comparator.comparingDouble(p_ -> distanceBetween(p_, p))); + if(closestPoint.isEmpty()) { + tempList.add(p); + reshiftedList.remove(p); + } else { + tempList.add(closestPoint.get()); + reshiftedList.remove(closestPoint.get()); + } + } + + goodFeatureToTrackRetval.fromList(tempList); + return goodFeatureToTrackRetval; + } + // Set the needed parameters to find the refined corners - Size winSize = new Size(12, 12); + Size winSize = new Size(4, 4); Size zeroZone = new Size(-1, -1); // we don't need a zero zone - TermCriteria criteria = new TermCriteria(TermCriteria.EPS + TermCriteria.COUNT, 50, 0.001); + TermCriteria criteria = new TermCriteria(TermCriteria.EPS + TermCriteria.COUNT, 90, 0.001); private boolean shouldRefineCorners = true; @@ -305,19 +346,17 @@ public class SolvePNPPipe implements Pipe