/*
* 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.abst.feature.tracker;
import boofcv.struct.image.ImageGray;
import org.junit.Test;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
* Standard tests for {@link PointTrackerTwoPass}
*
* @author Peter Abeles
*/
public abstract class StandardPointTrackerTwoPass<T extends ImageGray>
extends StandardPointTracker<T>
{
PointTrackerTwoPass<T> tracker2;
protected StandardPointTrackerTwoPass(boolean shouldCreateInactive, boolean shouldDropTracks) {
super(shouldCreateInactive, shouldDropTracks);
}
@Override
public abstract PointTrackerTwoPass<T> createTracker();
/**
* Tests basic functionality for process(), performSecondPass(), and finishTracking()
*/
@Test
public void process() {
tracker2 = createTracker();
tracker2.process((T)image);
tracker2.finishTracking();
tracker2.spawnTracks();
int allBefore = tracker2.getActiveTracks(null).size();
int activeBefore = tracker2.getAllTracks(null).size();
assertTrue(allBefore > 0 );
assertTrue(activeBefore > 0 );
tracker2.process((T)image);
List<PointTrack> tracks = tracker2.getAllTracks(null);
// since the image is the same the tracks should all be the same
assertEquals(allBefore, tracks.size());
assertEquals(activeBefore, tracker2.getActiveTracks(null).size());
// The bad hints below should cause stuff to break
for( PointTrack t : tracks ) {
tracker2.setHint(0,0,t);
}
tracker2.performSecondPass();
// make sure that lists which shouldn't change haven't changed
assertEquals(allBefore, tracker2.getAllTracks(null).size());
assertEquals(0, tracker2.getDroppedTracks(null).size());
assertEquals(0, tracker2.getNewTracks(null).size());
// active list can change
assertTrue(activeBefore != tracker2.getActiveTracks(null).size());
// now everything can change
tracker2.finishTracking();
checkInside(tracker2.getAllTracks(null));
if( shouldDropTracks ) {
assertTrue(allBefore > tracker2.getAllTracks(null).size());
assertTrue( tracker2.getDroppedTracks(null).size() > 0 );
}
assertTrue(activeBefore > tracker2.getActiveTracks(null).size());
checkInside(tracker2.getAllTracks(null));
}
/**
* Should be possible to do more than one second pass. Very minimal test, just checks number of elements in lists.
*/
@Test
public void performSecondPass_multiple() {
tracker2 = createTracker();
tracker2.process((T) image);
tracker2.finishTracking();
tracker2.spawnTracks();
int allBefore = tracker2.getActiveTracks(null).size();
int activeBefore = tracker2.getAllTracks(null).size();
tracker2.process((T) image);
tracker2.performSecondPass();
tracker2.performSecondPass();
// since the same image was processed twice nothing should change
tracker2.finishTracking();
checkInside(tracker2.getAllTracks(null));
assertEquals(allBefore, tracker2.getAllTracks(null).size());
assertEquals(activeBefore, tracker2.getActiveTracks(null).size());
}
/**
* Makes sure it can take a hint before process is called and not just for the second pass
*/
@Test
public void hintBeforeProcess() {
tracker2 = createTracker();
tracker2.process((T)image);
tracker2.finishTracking();
tracker2.spawnTracks();
int allBefore = tracker2.getActiveTracks(null).size();
int activeBefore = tracker2.getAllTracks(null).size();
assertTrue(allBefore > 0 );
assertTrue(activeBefore > 0 );
// provide bad hints before process is called
List<PointTrack> tracks = tracker2.getAllTracks(null);
for( PointTrack t : tracks ) {
tracker2.setHint(0,0,t);
}
// process should do bad stuff now
tracker2.process((T)image);
// make sure that lists which shouldn't change haven't changed
assertEquals(allBefore, tracker2.getAllTracks(null).size());
assertEquals(0, tracker2.getDroppedTracks(null).size());
assertEquals(0, tracker2.getNewTracks(null).size());
assertTrue(activeBefore != tracker2.getActiveTracks(null).size());
checkInside(tracker2.getAllTracks(null));
// and finalize the bad tracking
tracker2.finishTracking();
if( shouldDropTracks ) {
assertTrue(allBefore > tracker2.getAllTracks(null).size());
assertTrue( tracker2.getDroppedTracks(null).size() > 0 );
}
assertTrue(activeBefore > tracker2.getActiveTracks(null).size());
checkInside(tracker2.getAllTracks(null));
}
/**
* Calling process and finishTracking should be equivalent to process in PointTracker
*/
@Override
protected void processImage( T image ) {
PointTrackerTwoPass<T> tracker = (PointTrackerTwoPass<T>)this.tracker;
tracker.process(image);
tracker.finishTracking();
}
}