package org.openpnp.vision.pipeline.ui;
import java.awt.BorderLayout;
import java.awt.event.HierarchyEvent;
import java.awt.event.HierarchyListener;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import org.openpnp.vision.pipeline.CvPipeline;
import org.openpnp.vision.pipeline.CvStage;
import org.openpnp.vision.pipeline.stages.BlurGaussian;
import org.openpnp.vision.pipeline.stages.BlurMedian;
import org.openpnp.vision.pipeline.stages.BottomVisionCriS;
import org.openpnp.vision.pipeline.stages.ConvertColor;
import org.openpnp.vision.pipeline.stages.ConvertModelToPoints;
import org.openpnp.vision.pipeline.stages.DetectCirclesHough;
import org.openpnp.vision.pipeline.stages.DetectEdgesCanny;
import org.openpnp.vision.pipeline.stages.DetectEdgesLaplacian;
import org.openpnp.vision.pipeline.stages.DetectEdgesRobertsCross;
import org.openpnp.vision.pipeline.stages.DrawCircles;
import org.openpnp.vision.pipeline.stages.DrawContours;
import org.openpnp.vision.pipeline.stages.DrawKeyPoints;
import org.openpnp.vision.pipeline.stages.DrawRotatedRects;
import org.openpnp.vision.pipeline.stages.DrawTemplateMatches;
import org.openpnp.vision.pipeline.stages.FilterContours;
import org.openpnp.vision.pipeline.stages.FindContours;
import org.openpnp.vision.pipeline.stages.HistogramEqualize;
import org.openpnp.vision.pipeline.stages.ImageCapture;
import org.openpnp.vision.pipeline.stages.ImageRead;
import org.openpnp.vision.pipeline.stages.ImageRecall;
import org.openpnp.vision.pipeline.stages.ImageWrite;
import org.openpnp.vision.pipeline.stages.ImageWriteDebug;
import org.openpnp.vision.pipeline.stages.MaskCircle;
import org.openpnp.vision.pipeline.stages.MaskHsv;
import org.openpnp.vision.pipeline.stages.MatchTemplate;
import org.openpnp.vision.pipeline.stages.MinAreaRect;
import org.openpnp.vision.pipeline.stages.Normalize;
import org.openpnp.vision.pipeline.stages.ReadModelProperty;
import org.openpnp.vision.pipeline.stages.Rotate;
import org.openpnp.vision.pipeline.stages.SetColor;
import org.openpnp.vision.pipeline.stages.SimpleBlobDetector;
import org.openpnp.vision.pipeline.stages.Threshold;
/**
* A JPanel based component for editing a CvPipeline. Allows the user to add and remove stages,
* modify properties of each stage, see the image and model results from each stage and export and
* import the pipeline from the clipboard.
*
* The static method #registerStageClass can be used to register a CvStage implementation with this
* component, allowing the user to select the implementation from the list when creating a new
* stage.
*
* The core CvStage classes are automatically registered during startup.
*/
@SuppressWarnings("serial")
public class CvPipelineEditor extends JPanel {
static {
stageClasses = new HashSet<>();
registerStageClass(BlurMedian.class);
registerStageClass(BlurGaussian.class);
registerStageClass(BottomVisionCriS.class);
registerStageClass(ConvertColor.class);
registerStageClass(ConvertModelToPoints.class);
registerStageClass(DetectCirclesHough.class);
registerStageClass(DetectEdgesCanny.class);
registerStageClass(DetectEdgesRobertsCross.class);
registerStageClass(DetectEdgesLaplacian.class);
registerStageClass(DrawCircles.class);
registerStageClass(DrawContours.class);
registerStageClass(DrawKeyPoints.class);
registerStageClass(DrawRotatedRects.class);
registerStageClass(DrawTemplateMatches.class);
registerStageClass(FilterContours.class);
registerStageClass(FindContours.class);
registerStageClass(HistogramEqualize.class);
registerStageClass(ImageCapture.class);
registerStageClass(ImageRead.class);
registerStageClass(ImageRecall.class);
registerStageClass(ImageWrite.class);
registerStageClass(ImageWriteDebug.class);
registerStageClass(MaskCircle.class);
registerStageClass(MaskHsv.class);
registerStageClass(MatchTemplate.class);
registerStageClass(MinAreaRect.class);
registerStageClass(Normalize.class);
registerStageClass(ReadModelProperty.class);
registerStageClass(Rotate.class);
registerStageClass(SetColor.class);
registerStageClass(SimpleBlobDetector.class);
registerStageClass(Threshold.class);
}
private final static Set<Class<? extends CvStage>> stageClasses;
private final CvPipeline pipeline;
private PipelinePanel pipelinePanel;
private ResultsPanel resultsPanel;
public CvPipelineEditor(CvPipeline pipeline) {
this.pipeline = pipeline;
setLayout(new BorderLayout(0, 0));
JSplitPane inputAndOutputSplitPane = new JSplitPane();
inputAndOutputSplitPane.setContinuousLayout(true);
add(inputAndOutputSplitPane, BorderLayout.CENTER);
pipelinePanel = new PipelinePanel(this);
inputAndOutputSplitPane.setLeftComponent(pipelinePanel);
resultsPanel = new ResultsPanel(this);
inputAndOutputSplitPane.setRightComponent(resultsPanel);
addHierarchyListener(new HierarchyListener() {
@Override
public void hierarchyChanged(HierarchyEvent e) {
inputAndOutputSplitPane.setDividerLocation(0.25);
}
});
process();
}
public CvPipeline getPipeline() {
return pipeline;
}
public void process() {
getPipeline().process();
resultsPanel.refresh();
}
public void stageSelected(CvStage stage) {
resultsPanel.setSelectedStage(stage);
}
public static Set<Class<? extends CvStage>> getStageClasses() {
return Collections.unmodifiableSet(stageClasses);
}
public static void registerStageClass(Class<? extends CvStage> cls) {
stageClasses.add(cls);
}
}