I am trying to add a list of ground control points (GCPs) to scale a beaver skull model. I first created a GCP coords and then generate a gcp_list.txt files to input into the ODM. I then manually masked the background.
However, the resolution of the texture drops a lot when including the gcp_list.txt into WebODM comparing to the one using the same data set without inputting the gcp_list.txt.
For example, you can see the number from the model using gcp_list.txt (the 1st picture) is much more blurred comparing to the number from the one without using gcp_list.txt (the 2nd picture).
Turning off the texture in MeshLab. You can see that the surface of the model (1st one) with gcp_list.txt is less smooth than the one (2nd one) without gcp_list.txt. But the quality of the models is overall consistent.
I used all pictures from the six folders in the zip file (a total of 320 images). The folder “horizontal_gcp_masked” contains the pictures with GCPs (masked out mostly). The gcp_coords.txt contains the raw coordinates of 10 GCPs. The gcp_list.txt is the one input into the WebODM for scaling. You can try it with and without gcp_list.txt.
Do you happen to have a good estimate of the GSD (spatial resolution of the images, so how many cm/px) for your dataset? Try forcing --orthophoto-resolution to that or finer to see if that helps preserve texture detail.
As for the model, what does the pointcloud look like (since the model is derived from the pointcloud)? Is the one with GCPs noticeably less dense?
Echoing Brett’s points, you might multiply your GCP values by 10 or 100 and then set the orthophoto-resolution. As a last resort you could set the ignore-gsd flag. I know you can run a machine with a lot of memory. But start with the first two: it’s undoubtedly related to the estimation of resolution for the output, so manipulate the output size and you should get a more suitable results. Bonus points if you estimate your desired skull sampling distance.
Thank you! Both approaches work well for a model by setting up the resolution properly! In one test, I changed the orthophoto resolution to 0.05 (1st figure). In another one I multiplied the GCP coordinates by 10 and scaled the orthophoto resolution to 0.5 (2nd figure).
The orthrophoto resolution 0.05 one has relatively poorer quality with more small holes.
Just one more question. Is there a recommended range for the orthophoto resolution for texturing? For example, if I enter an orthophoto resolution smaller than it should be in the photo with GCPs (e.g., the resolution calculated from the photo is around 0.5, but I set the resolution is 0.05), will it cause any problem?
Nope! Provided you don’t use an absurdly small number alongside --ignore-gsd that value passed to --orthophoto-resolution sets the floor for how fine your spatial resolution can be, up to the calculated GSD estimated during reconstruction.
If the estimate is way off, you can pass the --ignore-gsd flag alongside a really fine --orthophoto-resolution and it will force the products to be interpolated to whatever value you pass (this normally makes resource usage go sky-high and can lead to crashing, so be very judicious with its usage)
The point cloud with GCPs/GSD look similarly dense regardless of the orthophoto resolution I set, and they look much denser than the ones without GCPs for most cases (though the latter has better texture with default orthophoto resolution setting).
I see. 0.05 is approximately the resolution I calculated from GCD using (distance between two GCPs/pixels in between). I did try to set up the resolution to 0.01, and there is no apparent improvement (probably very minimal improvement). I assume that, as you said, there is a lower floor for the texture resolution, probably depending on the both photo and input GSD/GCP file？Perhaps I can calculate an approximate cm/pixel from GCPs and then input a somewhat lower value for orthophoto resolution in practice for ensure best quality of texture?
One more question, I wonder if the average GSD shown in the drop-down menu of a finished reconstruction should be the lower floor of orthophoto resolution for each specimen?
My specimens usually show an average GSD about 0.03 or 0.04 using both the default and calculated orthophoto resolution. In practice, should I just run a few models with the default to see the average GSD and input it as the orthophoto resolution?
That sounds like a really good approach. I’m assuming your subject-distance is pretty well controlled for this work, right? Provided that and the sensor don’t change, what you’ve proposed sounds really sensible Great stuff!