CameraUniversalOmni in ExampleFiducialBinary

Skip to first unread message

Feb 17, 2021, 1:35:26 PM2/17/21
to BoofCV
Did some testing ExampleFiducialBinary to detect binaryFiducial with calibration. 

Testing using a 175 degree fish eye camera to detect binary fiducials with the goal of getting a reasonable distortion correction of the location of the detected object. Don't need to do an image conversion as the goal is high FPS.

Searching for some example code

How would you go from  CameraUniversalOmni  to a LensDistortionUniversalOmni that could be used in the FiducialDetector. 

Peter A

Feb 17, 2021, 10:59:19 PM2/17/21
to boofcv
If you can detect the markers you could detect them in the fisheye camera then do the correction later on by adjusting the corners. However it might just be too distorted to do that.

As I think you know, there is built in code to handle distorted images and only undistort the sparse contours. Unfortunately this is only for "narrow" camera models (i.e. Brown) and nothing yet for "wide" camera models like Universal Omni. The way the code works is that it does a sparse undistort along the contours into a synthetic distortion free pinhole camera. The problem with these wide FOV cameras is that it might be impossible to undistort the lens into a pinhole camera. You can do it for a local region, just not the entire image. This is possible but it will take a bit of development to implement.

Does this answer your question?

You received this message because you are subscribed to the Google Groups "BoofCV" group.
To unsubscribe from this group and stop receiving emails from it, send an email to
To view this discussion on the web visit

"Now, now my good man, this is no time for making enemies."    — Voltaire (1694-1778), on his deathbed in response to a priest asking that he renounce Satan.

Scooter Willis

Feb 18, 2021, 5:01:42 AM2/18/21
Thanks for the explanation and completely understand the constraints. Detection of the binary fiducial is working better than expected without correction. 

The camera is mounted in the ceiling 20ft in the air so have a fairly large area being covered which helps. 

Yesterday printed a 3'x3" chessboard target and treating the 175 degree fisheye camera as a pinhole camera the image correction isnt bad. Helps to be 20ft in the air looking down. Trying to avoid image correction of a fish eye at a local field of view to keep FPS high.  

Using the bounds of detected fiducial to determine heading(fiducial is on a robot) it appears to be very accurate when placing the fiducial based on construction lines for the concrete floor that in theory are square.

Ultimate goal is accurate location of fiducial plus heading for indoor robot navigation that is big and fast. Will do some testing today of corrected location using pin hole camera for error estimation. 

Given that the current heading of the fiducial appears to be accurate near the outer edges if undistored coordinate correction maintains accuracy then should be able to solve the location problem. Should be easy enough to survey the actual x, y locations as a grid in the field of view and build a map for the location correction.

This is all running on a $50 jetson nano 2g with 4k+ image using gstreamer. Have large area to cover in a warehouse so trying to minimize costs of the overhead camera grid. Want to detect robot location as well as humans and other moving objects below.

Thanks again for boofcv and showing what Java can do in image processing running on a low resource embedded system. 


You received this message because you are subscribed to a topic in the Google Groups "BoofCV" group.
To unsubscribe from this topic, visit
To unsubscribe from this group and all its topics, send an email to
To view this discussion on the web visit

Peter A

Feb 18, 2021, 11:26:22 AM2/18/21
to boofcv
Have you tried a QR Code? I would recommend using BoofCV to generate the PDF since you know it would be compliant then. For ensuring you read the ID correctly it's probably the most robust. The binary fiducial has some read errors that go uncaught. I've been wanting to deprecate that and replace it with another binary pattern for a bit, but haven't been able to prioritize it!

Not sure if it will make it in the new release, but there is a potentially much faster blob detector planned. That would speed up all these fiducials, except for chessboard.

If you get this working please post the project online! Sounds interesting.

Scooter Willis

Feb 18, 2021, 12:59:01 PM2/18/21

The resolving power of the QR code for the distance(20 ft) took me in the direction of the binary fiducials. Do see some false positives on occasion and was planning to use the size of the expected fiducial as an error check. The fiducial will technically always be perpendicular and at the same height with a dimension of 20"x20". 

Currently getting 5 FPS with a 1640x132 image using gstreamer pipeline where the java application launches the gstreamer pipeline and then hooks itself into the input and output stream to process the image. Need to do some profiling and see if it makes sense to push the grayscale conversion to the GPU via the pipeline to save that step in Java. 

The first picture is distorted view of 175 degree camera running on Jetson Nano with 2gb of ram. The robot is big next to the foosball table in the center and the fiducial would go on top for position tracking. The second picture is the undistorted view treating the fish eye camera modeled as a pin hole and does a reasonably good job of cleaning up the three white tables in the middle. 

I have on my todo list to figure out how the "top" of the binary fiducial is preserved in the binary pattern. If needed can place two binary fiducials on top of robot for error correction and heading precision. So far haven't needed it. 





Reply all
Reply to author
0 new messages