/* * Copyright (c) 2011-2016, Peter Abeles. All Rights Reserved. * * This file is part of BoofCV (http://boofcv.org). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package boofcv.gui; import boofcv.abst.scene.ImageClassifier; import boofcv.gui.image.ImagePanel; import boofcv.gui.image.ScaleOptions; import javax.swing.*; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import java.awt.*; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; /** * Displays a set of images and what their assigned labels are * * @author Peter Abeles */ public class ImageClassificationPanel extends JPanel implements ListSelectionListener { JTextArea textArea = new JTextArea(); JScrollPane listScroll; private JList listPanel; private ImagePanel centerImage = new ImagePanel(); DefaultListModel listModel = new DefaultListModel(); final List<Image> results = new ArrayList<>(); public ImageClassificationPanel() { super( new BorderLayout()); listPanel = new JList(listModel); listPanel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); listPanel.setSelectedIndex(0); listPanel.addListSelectionListener(this); listScroll = new JScrollPane(listPanel); listScroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); listScroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); final JPanel centerPanel = new JPanel(); SpringLayout spring = new SpringLayout(); centerPanel.setLayout(spring); centerPanel.add( textArea ); centerPanel.add( centerImage ); centerPanel.setPreferredSize(new Dimension(600,600)); // add a constraint to make this image be the same size as the window Spring pw = spring.getConstraint(SpringLayout.WIDTH, centerPanel); Spring ph = spring.getConstraint(SpringLayout.HEIGHT, centerPanel); SpringLayout.Constraints c = spring.getConstraints(centerImage); c.setWidth(Spring.scale(pw, 1.0f)); c.setHeight(Spring.scale(ph, 1.0f)); centerImage.setScaling(ScaleOptions.DOWN); centerImage.setOpaque(true); textArea.setFont(new Font("Courier New", Font.BOLD, 16)); textArea.setLineWrap(false); textArea.setOpaque(true); textArea.setForeground(Color.BLACK); textArea.setBackground(new Color(255,255,255,125)); add(centerPanel, BorderLayout.CENTER); add(listScroll, BorderLayout.WEST); } public void addImage(BufferedImage image , String name, List<ImageClassifier.Score> scores , List<String> categories ) { synchronized (results) { final Image a = new Image(); a.image = image; a.name = name; for( ImageClassifier.Score score : scores ) { a.results.add(String.format("%6.2f %s", score.score,categories.get(score.category))); } results.add( a ); SwingUtilities.invokeLater(new Runnable() { public void run() { listModel.addElement(a.name); if (listModel.size() == 1) { listPanel.setSelectedIndex(0); } // update the list's size Dimension d = listPanel.getMinimumSize(); listPanel.setPreferredSize(new Dimension(d.width + listScroll.getVerticalScrollBar().getWidth(), d.height)); validate(); } }); } repaint(); } @Override public void valueChanged(ListSelectionEvent e) { if( e.getValueIsAdjusting() ) return; final int index = listPanel.getSelectedIndex(); if( index >= 0 ) { final Image selected; synchronized (results) { selected = results.get(index); } SwingUtilities.invokeLater(new Runnable() { public void run() { centerImage.setBufferedImage(selected.image); centerImage.setPreferredSize(new Dimension(selected.image.getWidth(), selected.image.getHeight())); centerImage.validate(); centerImage.repaint(); String text = ""; int N = Math.min(5, selected.results.size()); for (String s : selected.results.subList(0, N)) { text += s+"\n"; } textArea.setText(text); // if( N > 0 ) { // Dimension d = textArea.getPreferredSize(); // textArea.setPreferredSize(new Dimension(d.width + 8, d.height * (N - 1) / N + 8)); // } }}); } } private static class Image { BufferedImage image; String name; List<String> results = new ArrayList<>(); } }