/*
* 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.demonstrations.tracker;
import boofcv.alg.misc.PixelMath;
import boofcv.alg.tracker.circulant.CirculantTracker;
import boofcv.core.image.ConvertImage;
import boofcv.gui.image.VisualizeImageData;
import boofcv.io.image.ConvertBufferedImage;
import boofcv.struct.ImageRectangle;
import boofcv.struct.image.GrayF32;
import boofcv.struct.image.GrayF64;
import georegression.struct.shapes.RectangleLength2D_F32;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
/**
* @author Peter Abeles
*/
public class CirculantVisualizationPanel extends JPanel implements MouseListener{
BufferedImage frame;
CenterPanel centerPanel = new CenterPanel();
Listener listener;
int numClicks;
ImageRectangle selected = new ImageRectangle();
boolean hasSelected = false;
BufferedImage template;
BufferedImage response;
GrayF32 tmp = new GrayF32(1,1);
public CirculantVisualizationPanel(Listener listener) {
setLayout(new BorderLayout());
this.listener = listener;
JPanel right = new JPanel();
right.setLayout(new BoxLayout(right,BoxLayout.Y_AXIS));
right.setPreferredSize(new Dimension(150,400));
right.add(new TemplatePanel());
right.add(new ResponsePanel());
add(centerPanel,BorderLayout.CENTER);
add(right, BorderLayout.EAST);
centerPanel.addMouseListener(this);
centerPanel.grabFocus();
}
public void setSelectRectangle( boolean value ) {
if( value )
numClicks = 0;
else
numClicks = 2;
}
public void setFrame( final BufferedImage frame) {
SwingUtilities.invokeLater( new Runnable() {
@Override
public void run() {
CirculantVisualizationPanel.this.frame = frame;
centerPanel.setPreferredSize(new Dimension(frame.getWidth(),frame.getHeight()));
centerPanel.setMinimumSize(centerPanel.getPreferredSize());
centerPanel.revalidate();
}
});
}
public synchronized void update( final CirculantTracker tracker ) {
if( hasSelected ) {
RectangleLength2D_F32 r = tracker.getTargetLocation();
selected.x0 = (int)r.x0;
selected.y0 = (int)r.y0;
selected.x1 = selected.x0 + (int)r.width;
selected.y1 = selected.y0 + (int)r.height;
GrayF64 template = tracker.getTargetTemplate();
GrayF64 response = tracker.getResponse();
if( this.template == null ) {
this.template = new BufferedImage(template.width,template.height,BufferedImage.TYPE_INT_RGB);
this.response = new BufferedImage(template.width,template.height,BufferedImage.TYPE_INT_RGB);
tmp.reshape(template.width,template.height);
}
ConvertImage.convert(template,tmp);
PixelMath.plus(tmp, 0.5f, tmp);
PixelMath.multiply(tmp,255,0,255,tmp);
ConvertBufferedImage.convertTo(tmp,this.template,true);
ConvertImage.convert(response,tmp);
VisualizeImageData.colorizeSign(tmp,this.response,-1);
}
repaint();
}
public void discardSelected() {
hasSelected = false;
numClicks = 0;
}
private class CenterPanel extends JPanel {
@Override
protected synchronized void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.drawImage(frame,0,0,null);
if( hasSelected ) {
// drawRectangle(g2,trackingRect,Color.GREEN,6);
drawRectangle(g2,selected,Color.RED,3);
}
}
}
private class TemplatePanel extends JPanel {
@Override
protected synchronized void paintComponent(Graphics g) {
super.paintComponent(g);
if( template == null )return;
Graphics2D g2 = (Graphics2D)g;
// g2.setTransform(AffineTransform.getScaleInstance(2,2));
g2.drawImage(template,0,0,null);
}
}
private class ResponsePanel extends JPanel {
@Override
protected synchronized void paintComponent(Graphics g) {
super.paintComponent(g);
if( response == null )return;
Graphics2D g2 = (Graphics2D)g;
// g2.setTransform(AffineTransform.getScaleInstance(2,2));
g2.drawImage(response,0,0,null);
}
}
private void drawRectangle(Graphics2D g2 , ImageRectangle r , Color c , int size) {
g2.setColor(c);
g2.setStroke(new BasicStroke(size));
g2.drawLine(r.x0,r.y0,r.x1,r.y0);
g2.drawLine(r.x1,r.y0,r.x1,r.y1);
g2.drawLine(r.x1,r.y1,r.x0,r.y1);
g2.drawLine(r.x0,r.y1,r.x0,r.y0);
}
@Override
public void mouseClicked(MouseEvent e) {
if( numClicks == 0 ) {
selected.x0 = e.getX();
selected.y0 = e.getY();
} else if( numClicks == 1 ) {
selected.x1 = e.getX();
selected.y1 = e.getY();
hasSelected = true;
listener.startTracking(selected.x0,selected.y0,selected.x1,selected.y1);
} else {
listener.togglePause();
}
numClicks++;
}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
public static interface Listener
{
public void startTracking(int x0, int y0, int x1, int y1);
public void togglePause();
}
}
Ads help maintain this website.