I created the website https://online-camera-calibration.com/ where you can calibrate a camera without a checkerboard or any other custom-made calibration target. All you need is a flat, textured surface. Upload the images directly, or point it at a ROS bag and it will pull the frames out. That means no failing target detections, and you don’t have to buy a big board and try to glue a large print onto it without wrinkles.
What you need:
- A flat, textured surface. The method is based on matching feature points, so there must be sufficient texture for a feature detector
- One straight-on shot, which is going to be the reference
- 10 - 20 additional photos of the same surface. The entire image plane needs to be covered somewhere in the image set (you don’t need to cover the entire image plane in one shot)
- Tilt the camera in both directions across the set, but not in the reference image. (What pins down the focal length is foreshortening, the surface going perspectively squashed as you view it at an angle.)
- If you upload a ROS bag: the frames are sampled uniformly across the recording, so the recording has to be made with that in mind.
Currently supported is the pinhole camera model with Brown-Conrady distortion (the OpenCV standard model) and the double sphere camera model for fisheye cameras. The output is a JSON file with the intrinsics and distortion coefficients. There is no camera_info YAML export yet, so tell me if that’s what you’d want.
For the accuracy, take a look at Camera Calibration Without a Checkerboard — What It Is & How It Works | AutoCalib
In short: in my experiments it comes quite close to a checkerboard calibration, and the board I compared against was a very large, precisely made one.
Uploaded images and bags are deleted about 10 minutes after processing.
I would really like to get some feedback on this method. Is it helpful to you? Is the quality sufficient for your use case?