/* * 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.tracker; import boofcv.struct.feature.NccFeature; import javax.swing.*; import java.awt.*; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; import java.util.Stack; /** * @author Peter Abeles */ public class TldTemplatePanel extends JPanel { int featureWidth; int scale = 2; List<BufferedImage> templates = new ArrayList<>(); Stack<BufferedImage> unused = new Stack<>(); public TldTemplatePanel(int featureWidth) { this.featureWidth = featureWidth; setAutoscrolls(true); setPreferredSize(new Dimension(featureWidth*scale,30)); setMinimumSize(getPreferredSize()); } public synchronized void update( List<NccFeature> features , boolean gray ) { unused.addAll(templates); templates.clear(); for( NccFeature f : features ) { BufferedImage img; if( unused.isEmpty() ) { img = new BufferedImage(featureWidth,featureWidth,BufferedImage.TYPE_INT_RGB); } else { img = unused.pop(); } templates.add(img); int index = 0; int rgb; if( gray ) { for( int y = 0; y < featureWidth; y++ ) { for( int x = 0; x < featureWidth; x++ ) { int v = (int)(f.value[ index++ ] + f.mean); rgb = v << 16 | v << 8 | v; img.setRGB(x,y,rgb); } } } else { double maxAbs = 0; for( int i = 0; i < f.value.length; i++ ) { double v = Math.abs(f.value[i]); if( v > maxAbs ) maxAbs = v; } if( maxAbs == 0 ) continue; for( int y = 0; y < featureWidth; y++ ) { for( int x = 0; x < featureWidth; x++ ) { int v = (int)(255.0*f.value[ index++ ]/maxAbs); if( v < 0 ) rgb = -v; else rgb = v << 16; img.setRGB(x,y,rgb); } } } } setPreferredSize(new Dimension(featureWidth*scale,featureWidth*features.size()*scale)); setMinimumSize(getPreferredSize()); revalidate(); } @Override protected synchronized void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; g2.scale(scale,scale); for( int i = 0; i < templates.size(); i++ ) { int y = i * featureWidth; g2.drawImage(templates.get(i),0,y,featureWidth,featureWidth,null); } } }