Months and months ago I learned about ArUco markers and their usage for GCPs with ODM. I bought some tile to build one or two markers for testing and thought “I’ll get to that this weekend”. Well, last weekend was the weekend, and today I finally got to put the marker out in the yard and do some flying.
First attempt with tile-based ArUco markers - Album on Imgur Here’s some shots from directly overhead at a range of altitudes from 2m to 120m, plus one from 60m up but 30m west of the actual marker.
The marker was made from 3.75” tiles which were way cheaper than the 6” tiles I found (and the larger tiles were glossy so oh well) so I’m hoping I can use this size around the yard. What kind of processing can I do on these images to ensure the marker is usable before making more?
Use the find-gcp python project to make some detection tests and check if the size of the marker is compatible with your target height of flight with this tool.
For example, you are using 3x3 markers with 3.75’’ tiles so 5*3.75=18.75’’ = 47.63cm for the markers, using the tool you can flight up to 100m with a Phantom 4 Pro RTK :
Please confirm that I’m reading this right — it seems that at 120m my Mavic Air 2 should have a GSD of 1.9cm/pixel, which means I could use markers as small as 33cm?
You are reading this well according to me.
A note regarding the marker size. I have read some recommendations stating that a white border should be added around the black one to improve detection. Thoose recommandations seems to come from the original documentation of the ArUCo lib but it is difficult to find now days.
Based on our experience, depending on the color of the ground it can help indeed but it is not required to be as large as the other tile. It is useful for border segmentation (thresholding). Feel free to test with and without white border.
I ran the scripts somewhat naively against the pictures and got nothing useful this time around.
I was wondering about the white border since it was part of the marker generated by the software. Unfortunately that doubles the number of tiles per marker (5x5=25, 7x7=49) which doubles the cost but if that’s what it takes…
I’ll add in a white border and try again next sunny day I get – I’ll focus on pictures taken from the proper altitude, and I will spend a little more time on the script’s arguments, specifically ignore and minrate.
I will have a look at the pictures you provided an try a detection during the day if I can.
Ok, I just have a look, are the images in your first post the original ones ? They seems really low quality even for the lowest ones.
It’s possible that something about uploading them to Imgur caused them to be modified somehow.
Hub is unlisted but you should be able to access the images at the link.
Sorry about that – I completely blanked on dronedb as an option, heh!
Ok I had a look and I think your marker has several issues preventing detection:
- On the closest photo the black area seems grey. It is important to have a good contrast between black and white areas
- On the reverse white is “too white”, this imply burned areas.
- To worsen the case I have the impression that the tiles are a little glossy and they should be as matte as possible.
This is the consequences of this various points (extracting from your 60m picture) :
Here is a sample of a 50x50cm (not counting the white area) marker with the same pattern as yours, taken a 60m :
It is perfectly detected. I really believed your main issue is the grey look of the dark tiles, you should try to fix this first. (It will reduce the burn effect by the way)
Regarding your Mavic Air 2, are the photo you provided suppose to come from its sensor ? Because they are 4000x3000 and not 8000x6000 contrary to the hypothesis of the GSD/ArUco marker size calculator. (Event the last ones I download from droneDB)
The Mavic Air 2 is a quad-bayer sensor that uses pixel-binning, so the 48MP images will not resolve any more detail than the 12MP images.
I confess I was afraid that the grey and white tiles would have insufficient contrast. I placed the marker on a white sheet folded such that the sheet added an extra tile’s worth of white around the marker. Here’s a picture of the setup taken with my phone at the most reflective angle I could get.
I was able to do another of my regular mapping missions. The Mavic Air 2 was at 385 feet, which corresponds to roughly 1.6 inches per pixel. I manually identified one particular image which had the marker in it. The marker side including the sheet is about 20 pixels, which matches with its actual size of 26 inches. Alas, when I ran the detection script with minimum rate of 0.02 and ignore of 0.33, the actual marker was ignored but a rock in the pond and some litter in the neighbor’s yard were both falsely identified as markers.
I then reran the web tool with the 4000x3000 side and the 3x3 size. The tool suggested a width of 65 centimeters for 117 meters (the maximum altitude for the mission today) which is about 26 inches – but if I understand you correctly, that width is for the 5x5 part not including the 7x7 white border. Using the 47.63cm you calculated above for the 5x5 part, my maximum usable altitude with this marker would be 85 meters, which in retrospect makes more sense since that’s a bit less than the fancy machine you used as a reference.
Next I took some pictures at 85 meters and at 40 meters. The marker sides including the sheet were about 25 and 50 pixels, respectively. The ones at 85 meters is clearly too blurry (heh) but when I run the script against the image at 40 meters with those same arguments as above, here are the results:
Marker zero was correctly identified – and the false positive amuses me.
Adding the adjust flag caused the marker to be detected at 85 meters, but as 20 not 0. Huh. Ah well.
Am I correct in believing that “ArUco width” in the tool is for the 5x5 area when using 3x3 markers? If so, what might I be doing wrong – should I be tweaking some camera parameters like white balance to get better images? If not, then what does it mean?
Thank you for your help!
Interesting case, could you provide some pictures of the flights so I could investigate ?
In some rare case (from our experience) it is possible that a marker seems totally legit (for our human eyes) but is not detected in one picture whereas in all the other of the flight it is correctly detected. Perhaps, bad luck and you just select the wrong one.
Regarding false positive one agian, here it is pretty rare, we have like max 3 per flight and it is lost among all the correct detections. I always wonder how is ODM handling thoose false positive, does it ignore them because they are to “akward” as regard as the correct ones ? Or does a sort of average correction erase auto-magically the false positives. Anyways they do not seems to impact quality of reconstruction.
I also am super curious as to how ODM will handle them – I expect they will be thrown out as outliers if they’re too far from the image’s position as written by the EXIF tags but I confess I haven’t yet read the source to find out the truth.
I had the opportunity to try again yesterday after reading a little more about “the exposure triangle” and some other stuff. My drone has a fixed aperture but the ISO and shutter speed are adjustable. I set the ISO to 100 and bumped the shutter speed up until the “manual meter” was 0.00 (meaning my settings were equivalent with the drone’s automatic settings). I did not try to focus because I’m pretty sure my drone doesn’t have manual focus. The script was able to reliably identify the marker-with-sheet-border at 75m and below when adjusting the minimum rate to match the perimeter of the 5x5 pixel area. Here’s the marker from the 80m picture:
Doing this before every mapping flight will probably improve the quality of my photos considerably!
Next steps for me:
- find some matte black paint to see if that will get me to 85m
- try out the 6" tiles (though I think they’re too glossy sigh) for a 76cm marker side (good enough for 135m, so definitely good enough for 117m)
I spent the past week or so learning how to paint tile, and then painting it. I had to use primer (which was white) before putting on the flat black paint. It’s been cold and wet here so it took forever to dry. Today was the first day that I was able to see how it looked from up above. I remembered to adjust the shutter speed and to check it between shots but it didn’t need any adjusting after the first setting.
I took about 20 shots between 65 and 95 meters altitude. Of the 12 shots at or below 87 meters, the marker was detected in 10 of them – pretty nice! The rest were taken from further up with the highest successful identification at 92.6 meters! I think the flat black paint made the difference, and I really wish the tile folks sold them this way, heh.
It’ll take me a while to build the bigger marker – if this thread is still open, I’ll update here, else I’ll create another one and link to this one for context.
This is making me wonder what vantablack would do for the tiles, or any paint similar…
Thanks for giving us more in-field details and trials!
Can you share some thumbnails of what they looked like with your process after capture?
Thanks @mathuin and @bernarde for working through these experiments. I have been very curious about these tiles as well but have not made time to work with them yet.
This is the tile before painting:
And here’s after:
A significant difference!
Here’s the marker from 92.6 meters:
For the next marker with the 6" tiles, I’m going to try laying them out unpainted, then painting them individually and trying again, before gluing anything. It’ll be a lot easier to paint a bunch of tiles as individuals than to play games with masking tape.
Well, I’m back. I didn’t happen to have a single decent piece of wood that could support a 7x7 array of 6" tiles, so I ended up using two bits of plywood together. Here’s how it looked from the ground:
I took pictures from 65m to … somewhat above 120m, with and without adjusting exposure and was 95% successful at identifying the marker using
--minrate 0.010 --ignore 0.033 at all altitudes. So that’s awesome.
The weather was kind enough to allow me to fly my usual three double-grid missions (nadir at 370 feet, -5 degrees at 385 feet rotated 60 and 80 degrees off axis). Of a total of 333 photos, I manually identified 93 photos with the marker. Here’s one example from the nadir flight:
The business portion of the marker is about 20x20, which is better than suggested for 3x3 markers. With a perimeter of 80 pixels and the large edge of the image at 4000 pixels, the corresponding rate is 0.020. When I ran the find script with
--minrate 0.015 --maxrate 0.025 --ignore 0.33 I got 163 matches, 79 of which were for GCP 1. All of the script’s matches were on images I manually verified as having the marker, and I checked that each match was indeed on the right part of the picture. So that’s really awesome – especially considering these tiles are fresh out of the box and laid on the plywood, no gluing or painting.
- paint the tiles and glue them to something sturdy, in the hopes of getting the last 15% of images
- try another color combination like orange/blue to see whether that gets better results
Nice work !
You will see that once it’s done it is a charm to work with these.
If you plan to make them permanent or semi-permanent it is nice. Here we are always flying different places so we are now using soft canvas to improve convenience for displacements. We just have to unroll the canvas and here we go. At least it is the plan.
We have made various tests, for now the canvas are still too glossy. Wind and tension are also some issue but we are working on them.
So currently our detection is worsen than with our hard ArUco markers but still sufficient to achieve a correct reconstruction most of times. I will keep you up-to-date.