use of boofcv.abst.fiducial.calib.ConfigChessboard in project BoofCV by lessthanoptimal.
the class CalibrateFisheyePlanarGuiApp method main.
public static void main(String[] args) {
DetectorFiducialCalibration detector = // FactoryFiducialCalibration.squareGrid(new ConfigSquareGrid(4,3,30,30));
FactoryFiducialCalibration.chessboard(new ConfigChessboard(7, 5, 30));
// FactoryFiducialCalibration.circleHexagonalGrid(new ConfigCircleHexagonalGrid(5, 8, 1, 6));
List<String> images;
images = UtilIO.listAll(UtilIO.pathExample("calibration/fisheye/chessboard"));
// images = UtilIO.listAll(UtilIO.pathExample("calibration/fisheye/square_grid"));
CalibrateFisheyePlanarGuiApp app = new CalibrateFisheyePlanarGuiApp();
app.configure(detector, images).configureUniversalOmni(true, 2, false);
JFrame frame = new JFrame("Fisheye Calibration with Planar Targets");
frame.add(app, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
app.process("intrinsic.yaml");
}
use of boofcv.abst.fiducial.calib.ConfigChessboard in project BoofCV by lessthanoptimal.
the class CameraCalibrationGui method calibrationParametersChanged.
@Override
public void calibrationParametersChanged(CalibrationTargetPanel.TargetType type, Object _config) {
final RenderCalibrationTargetsGraphics2D renderer = new RenderCalibrationTargetsGraphics2D(20, 1);
if (type == CalibrationTargetPanel.TargetType.CHESSBOARD) {
ConfigChessboard chess = (ConfigChessboard) _config;
renderer.chessboard(chess.numRows, chess.numCols, 20);
} else if (type == CalibrationTargetPanel.TargetType.SQUARE_GRID) {
ConfigSquareGrid config = (ConfigSquareGrid) _config;
double space = 20 * config.spaceWidth / config.squareWidth;
renderer.squareGrid(config.numRows, config.numCols, 20, space);
} else if (type == CalibrationTargetPanel.TargetType.CIRCLE_GRID) {
ConfigCircleRegularGrid config = (ConfigCircleRegularGrid) _config;
double space = 10 * config.centerDistance / config.circleDiameter;
renderer.circleRegular(config.numRows, config.numCols, 10, space);
} else if (type == CalibrationTargetPanel.TargetType.CIRCLE_HEX) {
ConfigCircleHexagonalGrid config = (ConfigCircleHexagonalGrid) _config;
double space = 10 * config.centerDistance / config.circleDiameter;
renderer.circleHex(config.numRows, config.numCols, 10, space);
}
renderingPanel.setImageUI(renderer.getBufferred());
}
use of boofcv.abst.fiducial.calib.ConfigChessboard in project BoofCV by lessthanoptimal.
the class CreateCalibrationTargetGui method saveFile.
private void saveFile(boolean sendToPrinter) {
// grab the focus and force what the user is editing to be saved
File f;
// see where the document is to be sent
if (sendToPrinter) {
// dummy to make the code below happy and less complex
f = new File("");
} else {
f = FileSystemView.getFileSystemView().getHomeDirectory();
f = new File(f, "calibration_target.pdf");
f = BoofSwingUtil.fileChooser(this, false, f.getPath());
if (f == null) {
return;
}
if (f.isDirectory()) {
JOptionPane.showMessageDialog(this, "Can't save to a directory!");
return;
}
}
// Make sure the file has the correct extension
String outputFile = f.getAbsolutePath();
String ext = FilenameUtils.getExtension(outputFile);
if (ext.compareToIgnoreCase("pdf") != 0) {
outputFile = FilenameUtils.removeExtension(outputFile);
outputFile += "." + "pdf";
}
try {
switch(selectedType) {
case CHESSBOARD:
{
ConfigChessboard config = (ConfigChessboard) selectedCalib;
CreateCalibrationTargetGenerator generator = new CreateCalibrationTargetGenerator(outputFile, paper, config.numRows, config.numCols, units);
generator.sendToPrinter = sendToPrinter;
generator.chessboard((float) config.squareWidth);
}
break;
case SQUARE_GRID:
{
ConfigSquareGrid config = (ConfigSquareGrid) selectedCalib;
CreateCalibrationTargetGenerator generator = new CreateCalibrationTargetGenerator(outputFile, paper, config.numRows, config.numCols, units);
generator.sendToPrinter = sendToPrinter;
generator.squareGrid((float) config.squareWidth, (float) config.spaceWidth);
}
break;
case CIRCLE_GRID:
{
ConfigCircleRegularGrid config = (ConfigCircleRegularGrid) selectedCalib;
CreateCalibrationTargetGenerator generator = new CreateCalibrationTargetGenerator(outputFile, paper, config.numRows, config.numCols, units);
generator.sendToPrinter = sendToPrinter;
generator.circleGrid((float) config.circleDiameter, (float) config.centerDistance);
}
break;
case CIRCLE_HEX:
{
ConfigCircleHexagonalGrid config = (ConfigCircleHexagonalGrid) selectedCalib;
CreateCalibrationTargetGenerator generator = new CreateCalibrationTargetGenerator(outputFile, paper, config.numRows, config.numCols, units);
generator.sendToPrinter = sendToPrinter;
generator.circleHexagonal((float) config.circleDiameter, (float) config.centerDistance);
}
break;
default:
throw new RuntimeException("Unknown type " + selectedType);
}
} catch (IOException e) {
BoofSwingUtil.warningDialog(this, e);
}
}
use of boofcv.abst.fiducial.calib.ConfigChessboard in project BoofCV by lessthanoptimal.
the class ExamplePoseOfCalibrationTarget method main.
public static void main(String[] args) {
// Load camera calibration
CameraPinholeRadial intrinsic = CalibrationIO.load(UtilIO.pathExample("calibration/mono/Sony_DSC-HX5V_Chess/intrinsic.yaml"));
LensDistortionNarrowFOV lensDistortion = new LensDistortionRadialTangential(intrinsic);
// load the video file
String fileName = UtilIO.pathExample("tracking/chessboard_SonyDSC_01.mjpeg");
SimpleImageSequence<GrayF32> video = DefaultMediaManager.INSTANCE.openVideo(fileName, ImageType.single(GrayF32.class));
// DefaultMediaManager.INSTANCE.openCamera(null, 640, 480, ImageType.single(GrayF32.class));
// Let's use the FiducialDetector interface since it is much easier than coding up
// the entire thing ourselves. Look at FiducialDetector's code if you want to understand how it works.
CalibrationFiducialDetector<GrayF32> detector = FactoryFiducial.calibChessboard(new ConfigChessboard(4, 5, 0.03), GrayF32.class);
detector.setLensDistortion(lensDistortion, intrinsic.width, intrinsic.height);
// Get the 2D coordinate of calibration points for visualization purposes
List<Point2D_F64> calibPts = detector.getCalibrationPoints();
// Set up visualization
PointCloudViewer viewer = new PointCloudViewer(intrinsic, 0.01);
// make the view more interest. From the side.
DMatrixRMaj rotY = ConvertRotation3D_F64.rotY(-Math.PI / 2.0, null);
viewer.setWorldToCamera(new Se3_F64(rotY, new Vector3D_F64(0.75, 0, 1.25)));
ImagePanel imagePanel = new ImagePanel(intrinsic.width, intrinsic.height);
viewer.setPreferredSize(new Dimension(intrinsic.width, intrinsic.height));
PanelGridPanel gui = new PanelGridPanel(1, imagePanel, viewer);
gui.setMaximumSize(gui.getPreferredSize());
ShowImages.showWindow(gui, "Calibration Target Pose", true);
// Allows the user to click on the image and pause
MousePauseHelper pauseHelper = new MousePauseHelper(gui);
// saves the target's center location
List<Point3D_F64> path = new ArrayList<>();
// Process each frame in the video sequence
Se3_F64 targetToCamera = new Se3_F64();
while (video.hasNext()) {
// detect calibration points
detector.detect(video.next());
if (detector.totalFound() == 1) {
detector.getFiducialToCamera(0, targetToCamera);
// Visualization. Show a path with green points and the calibration points in black
viewer.reset();
Point3D_F64 center = new Point3D_F64();
SePointOps_F64.transform(targetToCamera, center, center);
path.add(center);
for (Point3D_F64 p : path) {
viewer.addPoint(p.x, p.y, p.z, 0x00FF00);
}
for (int j = 0; j < calibPts.size(); j++) {
Point2D_F64 p = calibPts.get(j);
Point3D_F64 p3 = new Point3D_F64(p.x, p.y, 0);
SePointOps_F64.transform(targetToCamera, p3, p3);
viewer.addPoint(p3.x, p3.y, p3.z, 0);
}
}
imagePanel.setImage((BufferedImage) video.getGuiImage());
viewer.repaint();
imagePanel.repaint();
BoofMiscOps.pause(30);
while (pauseHelper.isPaused()) {
BoofMiscOps.pause(30);
}
}
}
Aggregations