use of boofcv.abst.fiducial.calib.ConfigGridDimen in project BoofCV by lessthanoptimal.
the class ExamplePoseOfCalibrationTarget method main.
public static void main(String[] args) {
// Load camera calibration
CameraPinholeBrown intrinsic = CalibrationIO.load(UtilIO.pathExample("calibration/mono/Sony_DSC-HX5V_Chess/intrinsic.yaml"));
LensDistortionNarrowFOV lensDistortion = new LensDistortionBrown(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.calibChessboardX(null, new ConfigGridDimen(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 = VisualizeData.createPointCloudViewer();
viewer.setCameraHFov(PerspectiveOps.computeHFov(intrinsic));
viewer.setTranslationStep(0.01);
// white background
viewer.setBackgroundColor(0xFFFFFF);
// make the view more interest. From the side.
DMatrixRMaj rotY = ConvertRotation3D_F64.rotY(-Math.PI / 2.0, null);
viewer.setCameraToWorld(new Se3_F64(rotY, new Vector3D_F64(0.75, 0, 1.25)).invert(null));
var imagePanel = new ImagePanel(intrinsic.width, intrinsic.height);
var viewerComponent = viewer.getComponent();
viewerComponent.setPreferredSize(new Dimension(intrinsic.width, intrinsic.height));
var gui = new PanelGridPanel(1, imagePanel, viewerComponent);
gui.setMaximumSize(gui.getPreferredSize());
ShowImages.showWindow(gui, "Calibration Target Pose", true);
// Allows the user to click on the image and pause
var pauseHelper = new MousePauseHelper(gui);
// saves the target's center location
var path = new ArrayList<Point3D_F64>();
// Process each frame in the video sequence
var 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.clearPoints();
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());
viewerComponent.repaint();
imagePanel.repaint();
BoofMiscOps.pause(30);
while (pauseHelper.isPaused()) {
BoofMiscOps.pause(30);
}
}
}
use of boofcv.abst.fiducial.calib.ConfigGridDimen in project BoofCV by lessthanoptimal.
the class UtilCalibrationGui method renderTargetBuffered.
public static BufferedImage renderTargetBuffered(CalibrationPatterns type, Object config, int squareWidth) {
int circle = squareWidth / 2;
if (type == CalibrationPatterns.ECOCHECK) {
ConfigECoCheckMarkers c = (ConfigECoCheckMarkers) config;
ECoCheckUtils utils = new ECoCheckUtils();
utils.codec.setErrorCorrectionLevel(c.errorCorrectionLevel);
utils.codec.setChecksumBitCount(c.checksumBits);
c.convertToGridList(utils.markers);
utils.fixate();
ConfigECoCheckMarkers.MarkerShape shape = c.markerShapes.get(0);
int markerWidth = squareWidth * (shape.numCols - 1);
int markerHeight = squareWidth * (shape.numRows - 1);
FiducialRenderEngineGraphics2D render = configureRenderGraphics2D(markerWidth, markerHeight, squareWidth / 2);
ECoCheckGenerator generator = new ECoCheckGenerator(utils);
generator.squareWidth = squareWidth;
generator.setRender(render);
generator.render(0);
return render.getImage();
} else if (type == CalibrationPatterns.HAMMING_CHESSBOARD) {
ConfigHammingChessboard c = (ConfigHammingChessboard) config;
int markerWidth = squareWidth * c.numCols;
int markerHeight = squareWidth * c.numRows;
FiducialRenderEngineGraphics2D render = configureRenderGraphics2D(markerWidth, markerHeight, squareWidth / 2);
HammingChessboardGenerator generator = new HammingChessboardGenerator(c);
generator.squareWidth = squareWidth;
generator.setRender(render);
generator.render();
return render.getImage();
} else if (type == CalibrationPatterns.HAMMING_GRID) {
ConfigHammingGrid c = (ConfigHammingGrid) config;
int markerWidth = (int) Math.round(squareWidth * c.getMarkerWidth() / c.squareSize);
int markerHeight = (int) Math.round(squareWidth * c.getMarkerHeight() / c.squareSize);
FiducialRenderEngineGraphics2D render = configureRenderGraphics2D(markerWidth, markerHeight, squareWidth / 2);
var generator = new HammingGridGenerator(c);
generator.squareWidth = squareWidth;
generator.setRender(render);
generator.render();
return render.getImage();
}
final RenderCalibrationTargetsGraphics2D renderer = new RenderCalibrationTargetsGraphics2D(20, 1);
if (type == CalibrationPatterns.CHESSBOARD) {
ConfigGridDimen c = (ConfigGridDimen) config;
renderer.chessboard(c.numRows, c.numCols, squareWidth);
} else if (type == CalibrationPatterns.SQUARE_GRID) {
ConfigGridDimen c = (ConfigGridDimen) config;
double space = squareWidth * c.shapeDistance / c.shapeSize;
renderer.squareGrid(c.numRows, c.numCols, squareWidth, space);
} else if (type == CalibrationPatterns.CIRCLE_GRID) {
ConfigGridDimen c = (ConfigGridDimen) config;
double space = circle * c.shapeDistance / c.shapeSize;
renderer.circleRegular(c.numRows, c.numCols, circle, space);
} else if (type == CalibrationPatterns.CIRCLE_HEXAGONAL) {
ConfigGridDimen c = (ConfigGridDimen) config;
double space = circle * c.shapeDistance / c.shapeSize;
renderer.circleHex(c.numRows, c.numCols, circle, space);
}
return renderer.getBuffered();
}
Aggregations