All Downloads are FREE. Search and download functionalities are using the official Maven repository.

boofcv.gui.stereo.RectifiedPairPanel Maven / Gradle / Ivy

Go to download

BoofCV is an open source Java library for real-time computer vision and robotics applications.

The newest version!
/*
 * Copyright (c) 2011-2013, 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.stereo;

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

/**
 * Draws two images side by side and draws a line across the whole window where the user clicks.
 *
 * @author Peter Abeles
 */
public class RectifiedPairPanel extends JPanel implements MouseListener {

	// left image
	BufferedImage image1;
	// right image
	BufferedImage image2;

	// where the red line is drawn
	int mouseY = -10;
	int mouseX;

	// if true it will scale the images to fit the display
	boolean scaleToWindow;

	public RectifiedPairPanel( boolean scaleToWindow ) {
		addMouseListener(this);
		this.scaleToWindow = scaleToWindow;
	}

	public RectifiedPairPanel( boolean scaleToWindow , BufferedImage image1 , BufferedImage image2) {
		this(scaleToWindow);
		setImages(image1,image2);
		int h = Math.max(image1.getHeight(),image2.getHeight());
		int w = image1.getWidth() + image2.getWidth();
		setPreferredSize(new Dimension(w,h));
		setMinimumSize(new Dimension(w,h));
	}

	public void setImages( BufferedImage image1 , BufferedImage image2 ) {
		this.image1 = image1;
		this.image2 = image2;
	}

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

		if( image1 == null || image2 == null )
			return;

		double scale = 1;
		if( scaleToWindow ) {
			int h = Math.max(image1.getHeight(),image2.getHeight());
			int w = image1.getWidth() + image2.getWidth();

			double scaleX = getWidth()/(double)w;
			double scaleY = getHeight()/(double)h;
			scale = Math.min(scaleX,scaleY);
			if( scale > 1 ) scale = 1;

			AffineTransform orig = g2.getTransform();
			AffineTransform combined = (AffineTransform)orig.clone();
			combined.concatenate(AffineTransform.getScaleInstance(scale, scale));
			g2.setTransform(combined);
			g2.drawImage(image1,0,0,null);
			g2.drawImage(image2,image1.getWidth(),0,null);
			g2.setTransform(orig);
		} else {
			g2.drawImage(image1,0,0,null);
			g2.drawImage(image2,image1.getWidth(),0,null);
		}

		// draw a vertical line to make it easy to see how
		if( mouseY >= 0 ) {
			int x = mouseX >= image1.getWidth() ? mouseX-image1.getWidth() : mouseX;
			x *= scale;
			g2.setStroke(new BasicStroke(1));
			g2.setColor(Color.RED);
			g2.drawLine(x,0,x,getHeight());
			x += image1.getWidth();
			g2.drawLine(x,0,x,getHeight());
		}

		g2.setColor(Color.RED);
		g2.setStroke(new BasicStroke(3));

		g2.drawLine(0,mouseY,getWidth(),mouseY);
	}

	@Override
	public void mouseClicked(MouseEvent e) {
		mouseY = e.getY();
		mouseX = e.getX();
		repaint();
	}

	@Override
	public void mousePressed(MouseEvent e) {}

	@Override
	public void mouseReleased(MouseEvent e) {}

	@Override
	public void mouseEntered(MouseEvent e) {}

	@Override
	public void mouseExited(MouseEvent e) {}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy