From d6850f73b1e0b451056f84fde09144a5c02658fa Mon Sep 17 00:00:00 2001 From: ori agranat Date: Sat, 14 Sep 2019 20:38:50 +0300 Subject: [PATCH] added target grouping --- .../java/Handlers/Vision/CameraProcess.java | 21 ++++-- .../java/Handlers/Vision/VisionProcess.java | 70 ++++++++++++++++++ Main/src/main/java/Main.java | 4 +- Main/src/main/java/Objects/Pipeline.java | 1 + .../classes/META-INF/Main.kotlin_module | Bin 0 -> 16 bytes 5 files changed, 87 insertions(+), 9 deletions(-) create mode 100644 Main/target/classes/META-INF/Main.kotlin_module diff --git a/Main/src/main/java/Handlers/Vision/CameraProcess.java b/Main/src/main/java/Handlers/Vision/CameraProcess.java index 123eba1ad..1a350f80e 100644 --- a/Main/src/main/java/Handlers/Vision/CameraProcess.java +++ b/Main/src/main/java/Handlers/Vision/CameraProcess.java @@ -20,15 +20,16 @@ public class CameraProcess implements Runnable{ @Override public void run() { + //calling all classes CameraServer cs = CameraServer.getInstance(); - NetworkTableInstance networkTableInstance = NetworkTableInstance.getDefault(); +// NetworkTableInstance networkTableInstance = NetworkTableInstance.getDefault(); SettingsManager manager = SettingsManager.getInstance(); - VisionProcess visionProcess = new VisionProcess(); + manager.CamerasCurrentPipeline.put(CameraName,manager.Cameras.get(CameraName).pipelines.keySet().toArray()[0].toString()); //Setting up camera and network table - var Table = networkTableInstance.getTable("/Chameleon-Vision/" + CameraName); - var PipeLineEntry = Table.getEntry("Pipeline"); - var DriverModeEntry = Table.getEntry("Driver_Mode"); +// var Table = networkTableInstance.getTable("/Chameleon-Vision/" + CameraName); +// var PipeLineEntry = Table.getEntry("Pipeline"); +// var DriverModeEntry = Table.getEntry("Driver_Mode"); var cv_sink = cs.getVideo(manager.UsbCameras.get(CameraName)); int Width = manager.Cameras.get(CameraName).camVideoMode.width; int Height = manager.Cameras.get(CameraName).camVideoMode.heigh; @@ -42,14 +43,20 @@ public class CameraProcess implements Runnable{ double VerticalView = FastMath.atan(FastMath.tan(DiagonalView/2) * (VerticalRatio / DiagonalView)) * 2; double H_FOCAL_LENGTH = Width / (2 * FastMath.tan(HorizontalView /2)); double V_FOCAL_LENGTH = Width / (2 * FastMath.tan(VerticalView /2)); + double CenterX = ((double) Width / 2) - 0.5; + double CenterY = ((double) Height/2) - 0.5; + double CamArea = (double)(Width * Height); + VisionProcess visionProcess = new VisionProcess(CenterX,CenterY,CamArea); Mat mat = new Mat(); long time; while (!Thread.interrupted()){ Pipeline pipeline = manager.Cameras.get(CameraName).pipelines.get(manager.CamerasCurrentPipeline.get(CameraName)); time = cv_sink.grabFrame(mat); - Mat HSVImage = visionProcess.HSVThreshold(pipeline.hue,pipeline.saturation,pipeline.value,mat,pipeline.erode,pipeline.dilate); - List Contours = visionProcess.FindContours(HSVImage); +// Mat HSVImage = visionProcess.HSVThreshold(pipeline.hue,pipeline.saturation,pipeline.value,mat,pipeline.erode,pipeline.dilate); +// List Contours = visionProcess.FindContours(HSVImage); +// List FilterdContours = visionProcess.FilterContours(Contours,pipeline.area,pipeline.ratio,pipeline.extent,pipeline.sort_mode,pipeline.target_intersection,pipeline.target_group); + cv_publish.putFrame(mat); } } diff --git a/Main/src/main/java/Handlers/Vision/VisionProcess.java b/Main/src/main/java/Handlers/Vision/VisionProcess.java index d1d3d3372..a53581808 100644 --- a/Main/src/main/java/Handlers/Vision/VisionProcess.java +++ b/Main/src/main/java/Handlers/Vision/VisionProcess.java @@ -4,10 +4,25 @@ import org.jetbrains.annotations.NotNull; import org.opencv.core.*; import org.opencv.imgproc.*; +import javax.swing.*; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public class VisionProcess { + private HashMapTargetGrouping= new HashMap(){{ + put("Single",1); + put("Dual",2); + put("Triple",3); + put("Quadruple",4); + put("Quintuple",5); + }}; + private double CamArea,CenterX, CenterY; + VisionProcess(double CenterX, double CenterY, double CamArea){ + this.CenterX = CenterX; + this.CenterY = CenterY; + this.CamArea = CamArea; + } private Mat Kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(5, 5)); public Mat HSVThreshold(@NotNull List hue, @NotNull List saturation , @NotNull List value, Mat image, boolean IsErode, boolean IsDilate){ @@ -29,4 +44,59 @@ public class VisionProcess { Imgproc.findContours(BinaryImage,Contours,new Mat(),Imgproc.RETR_EXTERNAL,Imgproc.CHAIN_APPROX_TC89_L1); return Contours; } + public List FilterContours(List InputContours, List area, List ratio, List extent, String SortMode,String TargetIntersection , String TargetGrouping){ + List FilteredContours = new ArrayList(); + for (MatOfPoint Contour : InputContours){ + try{ + var contourArea = Imgproc.contourArea(Contour); + double targetArea = (contourArea / CamArea) * 100; + if (targetArea >= area.get(0) || targetArea <= area.get(1)){ + continue; + } + var rect = Imgproc.minAreaRect(new MatOfPoint2f(Contour.toArray())); + var targetFullness = (contourArea/rect.size.area())*100; + if (targetFullness <= extent.get(0) || targetArea >= extent.get(1)){ + continue; + } + var aspectRatio = rect.size.width / rect.size.height; + if (aspectRatio <= ratio.get(0) || aspectRatio >= ratio.get(1)){ + continue; + } + FilteredContours.add(Contour); + } catch (Exception e){ + continue; + } + } + return FilteredContours; + } + private List GroupTargets(List InputContours, String IntersectionPoint,String TargetGroup){ + if (!TargetGroup.equals("Single")){ + List FinalCountours = new ArrayList(); + for (var i = 0; i < InputContours.size(); i++){ + var FinalContour = InputContours.get(i); + for (var c = 0; c < (TargetGrouping.get(TargetGroup)-1);c++){ + try{ + MatOfPoint firstContour = InputContours.get(i + c); + MatOfPoint secoundContour = InputContours.get(i+c+1); + if (IsIntersecting(firstContour,secoundContour, IntersectionPoint)){ + System.out.println(""); + } + } catch (IndexOutOfBoundsException e){ + FinalContour = new MatOfPoint(); + break; + } + } + } + + } + return InputContours; + } + private boolean IsIntersecting(MatOfPoint ContourOne, MatOfPoint ContourTwo, String IntersectionPoint){ + Mat LineA = new Mat(); + Imgproc.fitLine(ContourOne,LineA,Imgproc.CV_DIST_L2,0,0.01,0.01); + Mat LineB = new Mat(); + Imgproc.fitLine(ContourTwo,LineB,Imgproc.CV_DIST_L2,0,0.01,0.01); + return true; + } + } diff --git a/Main/src/main/java/Main.java b/Main/src/main/java/Main.java index 078c07dda..10ccd73f4 100644 --- a/Main/src/main/java/Main.java +++ b/Main/src/main/java/Main.java @@ -10,9 +10,9 @@ import java.util.Map; public class Main { public static void main(String [] args) { SettingsManager manager = SettingsManager.getInstance(); - NetworkTableInstance.getDefault().startClientTeam(SettingsManager.GeneralSettings.team_number); +// NetworkTableInstance.getDefault().startClientTeam(SettingsManager.GeneralSettings.team_number); for (Map.Entry entry: SettingsManager.UsbCameras.entrySet()){ - new Thread(new CameraProcess(entry.getKey())); + new Thread(new CameraProcess(entry.getKey())).start(); } Server.main(8888); } diff --git a/Main/src/main/java/Objects/Pipeline.java b/Main/src/main/java/Objects/Pipeline.java index 75a1eb15f..86344c11a 100644 --- a/Main/src/main/java/Objects/Pipeline.java +++ b/Main/src/main/java/Objects/Pipeline.java @@ -16,6 +16,7 @@ public class Pipeline { public List extent = Arrays.asList(0,100); public boolean is_binary = false; public String sort_mode = "Largest"; + public String target_group = "Single"; public String target_intersection = "Largest"; public double M = 1; public double B = 0; diff --git a/Main/target/classes/META-INF/Main.kotlin_module b/Main/target/classes/META-INF/Main.kotlin_module new file mode 100644 index 0000000000000000000000000000000000000000..2983af70661ad375cc499ebc4da5a68ca46c532e GIT binary patch literal 16 RcmZQzU|?ooU|@t|egFVe02KfL literal 0 HcmV?d00001