/*
 * Copyright (c) 2011-2015, 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.tracker;

import boofcv.gui.feature.VisualizeFeatures;
import boofcv.gui.feature.VisualizeShapes;
import georegression.geometry.UtilPolygons2D_F64;
import georegression.struct.point.Point2D_F64;
import georegression.struct.shapes.Quadrilateral_F64;
import georegression.struct.shapes.RectangleLength2D_I32;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;

/**
 * Panel for displaying results of {@link boofcv.abst.tracker.TrackerObjectQuad}.
 *
 * @author Peter Abeles
 */
public class TrackerObjectQuadPanel extends JPanel implements MouseListener {

	boolean selectMode = true;

	int numSelected = 0;

	Quadrilateral_F64 quad = new Quadrilateral_F64();
	boolean targetVisible;

	Listener listener;

	BufferedImage bg;

	public TrackerObjectQuadPanel(Listener listener) {
		super(new BorderLayout());
		this.listener = listener;
		if( listener != null ){
			addMouseListener(this);
			grabFocus();
		}
	}

	public synchronized void setBackGround( BufferedImage image ) {
		if( bg == null || bg.getWidth() != image.getWidth() || bg.getHeight() != image.getHeight() ) {
			bg = new BufferedImage(image.getWidth(),image.getHeight(),BufferedImage.TYPE_INT_RGB);
		}
		bg.createGraphics().drawImage(image,0,0,null);
	}

	public synchronized void enterSelectMode() {
		selectMode = true;
		numSelected = 0;
		repaint();
	}

	public synchronized void setTarget( Quadrilateral_F64 quad , boolean visible ) {
		if( quad != null )
			this.quad.set(quad);
		selectMode = false;
		targetVisible = visible;
		repaint();
	}

	public synchronized void setTarget( RectangleLength2D_I32 rect , boolean visible ) {
		if( quad != null )
			UtilPolygons2D_F64.convert(rect, quad);
		selectMode = false;
		targetVisible = visible;
		repaint();
	}

	@Override
	protected synchronized void paintComponent(Graphics g) {
		super.paintComponent(g);
		Graphics2D g2 = (Graphics2D)g;

		g2.drawImage(bg,0,0,null);

		g2.setStroke(new BasicStroke(5));
		g2.setColor(Color.gray);

		if( selectMode ) {
			if( numSelected == 1 ) {
				drawCorner(g2, quad.a, Color.RED);
			} else if( numSelected == 2 ) {
				drawLine(g2, quad.a, quad.b);
				drawCorner(g2,quad.a,Color.RED);
				drawCorner(g2,quad.b,Color.ORANGE);
			} else if( numSelected == 3 ) {
				drawLine(g2,quad.a,quad.b);
				drawLine(g2, quad.b, quad.c);
				drawCorner(g2,quad.a,Color.RED);
				drawCorner(g2,quad.b,Color.ORANGE);
				drawCorner(g2,quad.c,Color.CYAN);
			} else if( numSelected == 4 ) {
				VisualizeShapes.drawQuad(quad, g2, true, Color.gray , Color.CYAN);
				drawCorner(g2,quad.a,Color.RED);
				drawCorner(g2,quad.b,Color.ORANGE);
				drawCorner(g2,quad.c,Color.CYAN);
				drawCorner(g2,quad.d,Color.BLUE);
			}
		} else if( targetVisible ) {
			VisualizeShapes.drawQuad(quad, g2,true, Color.gray , Color.CYAN);
			drawCorner(g2,quad.a,Color.RED);
			drawCorner(g2,quad.b,Color.RED);
			drawCorner(g2,quad.c,Color.RED);
			drawCorner(g2,quad.d,Color.RED);
		}
	}

	private void drawLine( Graphics2D g2 , Point2D_F64 a , Point2D_F64 b ) {
		g2.drawLine((int)(a.x+0.5),(int)(a.y+0.5),(int)(b.x+0.5),(int)(b.y+0.5));
	}

	private void drawCorner( Graphics2D g2 , Point2D_F64 a , Color color ) {
		VisualizeFeatures.drawPoint(g2,a.x,a.y,6,color,false);
	}

	@Override
	public synchronized void mouseClicked(MouseEvent e) {
		if( !selectMode || numSelected >= 4 )
			return;

		if( numSelected == 0 ) {
			quad.a.set(e.getX(),e.getY());
		} else if( numSelected == 1 ) {
			quad.b.set(e.getX(),e.getY());
		} else if( numSelected == 2 ) {
			quad.c.set(e.getX(),e.getY());
		} else if( numSelected == 3 ) {
			quad.d.set(e.getX(),e.getY());
		}
		numSelected++;
		repaint();

		if( numSelected == 4 ) {
			listener.selectedTarget(quad);
			selectMode = false;
		}
	}

	@Override
	public void mousePressed(MouseEvent e) {
		if( !selectMode ) {
			if( e.getButton() == 2 ) {
				System.out.println("Entering select mode");
				enterSelectMode();
			} else {
				listener.togglePause();
			}
		}
	}

	@Override
	public void mouseReleased(MouseEvent e) {}

	@Override
	public void mouseEntered(MouseEvent e) {}

	@Override
	public void mouseExited(MouseEvent e) {}

	public boolean isSelectMode() {
		return selectMode;
	}

	public synchronized void setDefaultTarget(Quadrilateral_F64 target) {
		this.quad.set(target);
		numSelected = 4;
		selectMode = false;
		targetVisible = true;
		repaint();
	}

	public static interface Listener
	{
		public void selectedTarget( Quadrilateral_F64 target );

		public void togglePause();
	}
}

 

Ads help maintain this website.