/*
* 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.alg.feature.disparity;
import boofcv.alg.feature.disparity.impl.*;
import boofcv.alg.misc.GImageMiscOps;
import boofcv.core.image.GConvertImage;
import boofcv.misc.PerformerBase;
import boofcv.misc.ProfileOperation;
import boofcv.struct.image.GrayF32;
import boofcv.struct.image.GrayU8;
import java.util.Random;
/**
* @author Peter Abeles
*/
public class BenchmarkDisparityAlgs {
static final long TEST_TIME = 1000;
static final Random rand = new Random(234234);
static final int width=640;
static final int height=480;
static final int min=0;
static final int max=20;
static final int radiusX=2;
static final int radiusY=2;
static final GrayU8 left = new GrayU8(width,height);
static final GrayU8 right = new GrayU8(width,height);
static final GrayF32 left_F32 = new GrayF32(width,height);
static final GrayF32 right_F32 = new GrayF32(width,height);
static final GrayU8 outU8 = new GrayU8(width,height);
static final GrayF32 out_F32 = new GrayF32(width,height);
public static class Naive extends PerformerBase {
StereoDisparityWtoNaive<GrayU8> alg =
new StereoDisparityWtoNaive<>(0, max, radiusX, radiusY);
@Override
public void process() {
alg.process(left,right,out_F32);
}
}
public static class EfficientSad_U8 extends PerformerBase {
// DisparitySelect<int[],GrayU8> compDisp =
// new ImplSelectRectBasicWta_S32_U8();
DisparitySelect<int[],GrayU8> compDisp =
new ImplSelectRectStandard_S32_U8(250,2,0.1);
ImplDisparityScoreSadRect_U8<GrayU8> alg =
new ImplDisparityScoreSadRect_U8<>(min,max,radiusX,radiusY,compDisp);
@Override
public void process() {
alg.process(left,right, outU8);
}
}
public static class EfficientSad_F32 extends PerformerBase {
// DisparitySelect<int[],GrayU8> compDisp =
// new ImplSelectRectBasicWta_S32_U8();
DisparitySelect<float[],GrayU8> compDisp =
new ImplSelectRectStandard_F32_U8(250,2,0.1);
ImplDisparityScoreSadRect_F32<GrayU8> alg =
new ImplDisparityScoreSadRect_F32<>(min,max,radiusX,radiusY,compDisp);
@Override
public void process() {
alg.process(left_F32,right_F32, outU8);
}
}
public static class EfficientSubpixelSad extends PerformerBase {
DisparitySelect<int[],GrayF32> compDisp =
new SelectRectSubpixel.S32_F32(250,2,0.1);
ImplDisparityScoreSadRect_U8<GrayF32> alg =
new ImplDisparityScoreSadRect_U8<>(min,max,radiusX,radiusY,compDisp);
@Override
public void process() {
alg.process(left,right, out_F32);
}
}
public static class EfficientSadFive_U8 extends PerformerBase {
// DisparitySelect<int[],GrayU8> compDisp =
// new ImplSelectRectBasicWta_S32_U8();
DisparitySelect<int[],GrayU8> compDisp =
new ImplSelectRectStandard_S32_U8(250,2,0.1);
ImplDisparityScoreSadRectFive_U8<GrayU8> alg =
new ImplDisparityScoreSadRectFive_U8<>(min,max,radiusX,radiusY,compDisp);
@Override
public void process() {
alg.process(left,right, outU8);
}
}
public static void main( String argsp[ ] ) {
System.out.println("========= Image Size "+ width +" "+height+" disparity "+max);
System.out.println();
GImageMiscOps.fillUniform(left, rand, 0, 30);
GImageMiscOps.fillUniform(right, rand, 0, 30);
GConvertImage.convert(left, left_F32);
GConvertImage.convert(right,right_F32);
// the "fastest" seems to always be the first one tested
ProfileOperation.printOpsPerSec(new EfficientSad_U8(),TEST_TIME);
ProfileOperation.printOpsPerSec(new EfficientSadFive_U8(),TEST_TIME);
ProfileOperation.printOpsPerSec(new EfficientSad_F32(),TEST_TIME);
ProfileOperation.printOpsPerSec(new EfficientSubpixelSad(),TEST_TIME);
ProfileOperation.printOpsPerSec(new Naive(), TEST_TIME);
}
}