/*
* 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.app;
import boofcv.alg.distort.AdjustmentType;
import boofcv.alg.distort.ImageDistort;
import boofcv.alg.distort.LensDistortionOps;
import boofcv.core.image.border.BorderType;
import boofcv.io.UtilIO;
import boofcv.io.image.ConvertBufferedImage;
import boofcv.io.image.UtilImageIO;
import boofcv.misc.BoofMiscOps;
import boofcv.struct.calib.CameraPinholeRadial;
import boofcv.struct.image.GrayF32;
import boofcv.struct.image.ImageType;
import boofcv.struct.image.Planar;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* Removes lens distortion from all the images in a directory
*
* @author Peter Abeles
*/
public class BatchRemoveLensDistortion {
public static void printHelpAndExit(String[] args) {
System.out.println("Expected 1 flag and 3 arguments, had "+args.length+" instead");
System.out.println();
System.out.println("<file path regex> <path to intrinsic.yaml> <output directory>");
System.out.println("path/to/input/image\\d*.jpg path/to/intrinsic.yaml");
System.out.println();
System.out.println("Flags:");
System.out.println("-rename Rename files on output to image%0d.png");
System.out.println("-EXPAND Output image will be expanded until there are no dark regions");
System.out.println("-FULL_VIEW Output image will contain the entire undistorted image");
System.out.println();
System.out.println("Default is FULL_VIEW and it doesn't rename the images");
}
public static void main(String[] args) {
String regex,pathIntrinsic,outputDir;
AdjustmentType adjustmentType = AdjustmentType.FULL_VIEW;
boolean rename = false;
if( args.length >= 3 ) {
int numFlags = args.length-3;
for (int i = 0; i < numFlags; i++) {
if( args[i].compareToIgnoreCase("-rename") == 0 ) {
rename = true;
} else if( args[i].compareToIgnoreCase("-EXPAND") == 0 ) {
adjustmentType = AdjustmentType.EXPAND;
} else if( args[i].compareToIgnoreCase("-FULL_VIEW") == 0 ) {
adjustmentType = AdjustmentType.FULL_VIEW;
} else {
System.err.println("Unknown flag "+args[i]);
}
}
regex = args[numFlags];
pathIntrinsic = args[numFlags+1];
outputDir = args[numFlags+2];
}else {
printHelpAndExit(args);
System.exit(0);
return;
}
System.out.println("AdjustmentType = "+adjustmentType);
System.out.println("rename = "+rename);
System.out.println("input regex = "+regex);
System.out.println("output dir = "+outputDir);
File fileOutputDir = new File(outputDir);
if( !fileOutputDir.exists() ) {
if( !fileOutputDir.mkdirs() ) {
throw new RuntimeException("Output directory did not exist and failed to create it");
} else {
System.out.println(" created output directory");
}
}
CameraPinholeRadial param = UtilIO.loadXML(pathIntrinsic);
CameraPinholeRadial paramAdj = new CameraPinholeRadial();
List<File> files = Arrays.asList(BoofMiscOps.findMatches(regex));
Collections.sort(files);
System.out.println("Found a total of "+files.size()+" matching files");
Planar<GrayF32> distoredImg = new Planar<>(GrayF32.class,param.width,param.height,3);
Planar<GrayF32> undistoredImg = new Planar<>(GrayF32.class,param.width,param.height,3);
ImageDistort distort = LensDistortionOps.imageRemoveDistortion(adjustmentType, BorderType.ZERO, param, paramAdj,
(ImageType) distoredImg.getImageType());
UtilIO.saveXML(paramAdj,new File(outputDir,"intrinsicUndistorted.xml").getAbsolutePath());
BufferedImage out = new BufferedImage(param.width,param.height,BufferedImage.TYPE_INT_RGB);
for( int i = 0; i < files.size(); i++ ) {
File file = files.get(i);
System.out.println("processing " + file.getName());
BufferedImage orig = UtilImageIO.loadImage(file.getAbsolutePath());
if( orig == null ) {
throw new RuntimeException("Can't load file");
}
if( orig.getWidth() != param.width || orig.getHeight() != param.height ) {
System.err.println("intrinsic parameters and image size do not match!");
System.exit(-1);
}
ConvertBufferedImage.convertFromMulti(orig, distoredImg, true, GrayF32.class);
distort.apply(distoredImg,undistoredImg);
ConvertBufferedImage.convertTo(undistoredImg,out,true);
String nameOut;
if( rename ) {
nameOut = String.format("image%05d.png",i);
} else {
nameOut = file.getName().split("\\.")[0]+"_undistorted.png";
}
UtilImageIO.saveImage(out,new File(outputDir,nameOut).getAbsolutePath());
}
}
}