use of boofcv.struct.calib.CameraPinholeRadial in project BoofCV by lessthanoptimal.
the class ExampleFiducialBinary method main.
public static void main(String[] args) {
String directory = UtilIO.pathExample("fiducial/binary");
// load the lens distortion parameters and the input image
CameraPinholeRadial param = CalibrationIO.load(new File(directory, "intrinsic.yaml"));
LensDistortionNarrowFOV lensDistortion = new LensDistortionRadialTangential(param);
BufferedImage input = UtilImageIO.loadImage(directory, "image0000.jpg");
// BufferedImage input = UtilImageIO.loadImage(directory , "image0001.jpg");
// BufferedImage input = UtilImageIO.loadImage(directory , "image0002.jpg");
GrayF32 original = ConvertBufferedImage.convertFrom(input, true, ImageType.single(GrayF32.class));
// Detect the fiducial
FiducialDetector<GrayF32> detector = FactoryFiducial.squareBinary(new ConfigFiducialBinary(0.1), ConfigThreshold.local(ThresholdType.LOCAL_MEAN, 21), GrayF32.class);
// new ConfigFiducialBinary(0.1), ConfigThreshold.fixed(100),GrayF32.class);
detector.setLensDistortion(lensDistortion, param.width, param.height);
detector.detect(original);
// print the results
Graphics2D g2 = input.createGraphics();
Se3_F64 targetToSensor = new Se3_F64();
Point2D_F64 locationPixel = new Point2D_F64();
Polygon2D_F64 bounds = new Polygon2D_F64();
for (int i = 0; i < detector.totalFound(); i++) {
detector.getCenter(i, locationPixel);
detector.getBounds(i, bounds);
g2.setColor(new Color(50, 50, 255));
g2.setStroke(new BasicStroke(10));
VisualizeShapes.drawPolygon(bounds, true, 1.0, g2);
if (detector.hasUniqueID())
System.out.println("Target ID = " + detector.getId(i));
if (detector.hasMessage())
System.out.println("Message = " + detector.getMessage(i));
System.out.println("2D Image Location = " + locationPixel);
if (detector.is3D()) {
detector.getFiducialToCamera(i, targetToSensor);
System.out.println("3D Location:");
System.out.println(targetToSensor);
VisualizeFiducial.drawCube(targetToSensor, param, detector.getWidth(i), 3, g2);
VisualizeFiducial.drawLabelCenter(targetToSensor, param, "" + detector.getId(i), g2);
} else {
VisualizeFiducial.drawLabel(locationPixel, "" + detector.getId(i), g2);
}
}
ShowImages.showWindow(input, "Fiducials", true);
}
use of boofcv.struct.calib.CameraPinholeRadial in project BoofCV by lessthanoptimal.
the class ExampleFiducialImage method main.
public static void main(String[] args) {
String imagePath = UtilIO.pathExample("fiducial/image/examples/");
String patternPath = UtilIO.pathExample("fiducial/image/patterns/");
// String imageName = "image00.jpg";
String imageName = "image01.jpg";
// String imageName = "image02.jpg";
// load the lens distortion parameters and the input image
CameraPinholeRadial param = CalibrationIO.load(new File(imagePath, "intrinsic.yaml"));
LensDistortionNarrowFOV lensDistortion = new LensDistortionRadialTangential(param);
BufferedImage input = UtilImageIO.loadImage(imagePath, imageName);
GrayF32 original = ConvertBufferedImage.convertFrom(input, true, ImageType.single(GrayF32.class));
// Detect the fiducial
SquareImage_to_FiducialDetector<GrayF32> detector = FactoryFiducial.squareImage(new ConfigFiducialImage(), ConfigThreshold.local(ThresholdType.LOCAL_MEAN, 21), GrayF32.class);
// new ConfigFiducialImage(), ConfigThreshold.fixed(100), GrayF32.class);
// give it a description of all the targets
// 4 cm
double width = 4;
detector.addPatternImage(loadImage(patternPath, "ke.png", GrayF32.class), 100, width);
detector.addPatternImage(loadImage(patternPath, "dog.png", GrayF32.class), 100, width);
detector.addPatternImage(loadImage(patternPath, "yu.png", GrayF32.class), 100, width);
detector.addPatternImage(loadImage(patternPath, "yu_inverted.png", GrayF32.class), 100, width);
detector.addPatternImage(loadImage(patternPath, "pentarose.png", GrayF32.class), 100, width);
detector.addPatternImage(loadImage(patternPath, "text_boofcv.png", GrayF32.class), 100, width);
detector.addPatternImage(loadImage(patternPath, "leaf01.png", GrayF32.class), 100, width);
detector.addPatternImage(loadImage(patternPath, "leaf02.png", GrayF32.class), 100, width);
detector.addPatternImage(loadImage(patternPath, "hand01.png", GrayF32.class), 100, width);
detector.addPatternImage(loadImage(patternPath, "chicken.png", GrayF32.class), 100, width);
detector.addPatternImage(loadImage(patternPath, "h2o.png", GrayF32.class), 100, width);
detector.addPatternImage(loadImage(patternPath, "yinyang.png", GrayF32.class), 100, width);
detector.setLensDistortion(lensDistortion, param.width, param.height);
detector.detect(original);
// print the results
Graphics2D g2 = input.createGraphics();
Se3_F64 targetToSensor = new Se3_F64();
Point2D_F64 locationPixel = new Point2D_F64();
Polygon2D_F64 bounds = new Polygon2D_F64();
for (int i = 0; i < detector.totalFound(); i++) {
detector.getCenter(i, locationPixel);
detector.getBounds(i, bounds);
g2.setColor(new Color(50, 50, 255));
g2.setStroke(new BasicStroke(10));
VisualizeShapes.drawPolygon(bounds, true, 1.0, g2);
if (detector.hasUniqueID())
System.out.println("Target ID = " + detector.getId(i));
if (detector.hasMessage())
System.out.println("Message = " + detector.getMessage(i));
System.out.println("2D Image Location = " + locationPixel);
if (detector.is3D()) {
detector.getFiducialToCamera(i, targetToSensor);
System.out.println("3D Location:");
System.out.println(targetToSensor);
VisualizeFiducial.drawCube(targetToSensor, param, detector.getWidth(i), 3, g2);
VisualizeFiducial.drawLabelCenter(targetToSensor, param, "" + detector.getId(i), g2);
} else {
VisualizeFiducial.drawLabel(locationPixel, "" + detector.getId(i), g2);
}
}
ShowImages.showWindow(input, "Fiducials", true);
}
use of boofcv.struct.calib.CameraPinholeRadial 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);
}
}
}
use of boofcv.struct.calib.CameraPinholeRadial in project BoofCV by lessthanoptimal.
the class ExampleRemoveLensDistortion method main.
public static void main(String[] args) {
String calibDir = UtilIO.pathExample("calibration/mono/Sony_DSC-HX5V_Chess/");
String imageDir = UtilIO.pathExample("structure/");
// load calibration parameters from the previously calibrated camera
CameraPinholeRadial param = CalibrationIO.load(new File(calibDir, "intrinsic.yaml"));
// Specify a transform that has no lens distortion that you wish to re-render the image as having
CameraPinhole desired = new CameraPinhole(param);
// load images and convert the image into a color BoofCV format
BufferedImage orig = UtilImageIO.loadImage(imageDir, "dist_cyto_01.jpg");
Planar<GrayF32> distortedImg = ConvertBufferedImage.convertFromPlanar(orig, null, true, GrayF32.class);
int numBands = distortedImg.getNumBands();
// create new transforms which optimize view area in different ways.
// EXPAND makes sure there are no black outside of image pixels inside the image
// FULL_VIEW will include the entire original image
// The border is VALUE, which defaults to black, just so you can see it
ImageDistort allInside = LensDistortionOps.changeCameraModel(AdjustmentType.EXPAND, BorderType.ZERO, param, desired, null, ImageType.pl(numBands, GrayF32.class));
ImageDistort fullView = LensDistortionOps.changeCameraModel(AdjustmentType.FULL_VIEW, BorderType.ZERO, param, desired, null, ImageType.pl(numBands, GrayF32.class));
// NOTE: After lens distortion has been removed the intrinsic parameters is changed. If you pass
// in a set of IntrinsicParameters to the 4th variable it will save it there.
// NOTE: Type information was stripped from ImageDistort simply because it becomes too verbose with it here.
// Would be nice if this verbosity issue was addressed by the Java language.
// render and display the different types of views in a window
displayResults(orig, distortedImg, allInside, fullView);
}
use of boofcv.struct.calib.CameraPinholeRadial in project BoofCV by lessthanoptimal.
the class TestCalibrateMonoPlanar method fullBasic.
/**
* Give it a fake feature detector and a fairly benign scenario and see if it can correctly
* estimate the camera parameters.
*/
@Test
public void fullBasic() {
CalibrateMonoPlanar alg = new CalibrateMonoPlanar(layout);
alg.configurePinhole(true, 2, true);
for (int i = 0; i < targetToCamera.size(); i++) {
alg.addImage(createFakeObservations(i));
}
CameraPinholeRadial found = alg.process();
assertEquals(intrinsic.fx, found.fx, 1e-3);
assertEquals(intrinsic.fy, found.fy, 1e-3);
assertEquals(intrinsic.cx, found.cx, 1e-3);
assertEquals(intrinsic.cy, found.cy, 1e-3);
assertEquals(intrinsic.skew, found.skew, 1e-3);
assertEquals(intrinsic.radial[0], found.radial[0], 1e-5);
assertEquals(intrinsic.radial[1], found.radial[1], 1e-5);
assertEquals(intrinsic.t1, found.t1, 1e-5);
assertEquals(intrinsic.t2, found.t2, 1e-5);
assertEquals(intrinsic.width, found.width, 1e-3);
assertEquals(intrinsic.height, found.height, 1e-3);
}
Aggregations