Creating 2.5D oblique orthophoto

Is it possible to generate “2.5D” oblique orthophotos similar to 2.5 Inch Sample (click compass at bottom to see the site at an angle)? It appears to be normal map tiles coming into the viewer. If so, how would this be accomplished in ODM?



That’s a pretty awesome tool!

From my understanding, this would be non-trivial to implement, as our process for selecting the best pixels for texturing tries to prioritize pixels directly overhead, in a move that greatly improved our Orhtophoto quality about a year or so ago.

It seems like we’d need to do a few things…

  1. Enforce a minimum gimbal angle for producing 2.5D/Oblique products. Something like -75 or shallower. Not going to have terribly useful oblique imagery on a nadir survey.
  2. Create a process to generate these obliques… But how many? One oblique every 90deg? 180deg? 45deg? This likely entails modifying our texturing algorithm as well as many other things I don’t know well enough to comment upon.

But, this is awesome, and a great Feature Suggestion.

Are you in a position to help us work towards this goal?

Thanks for the reply! I can probably provide imagery; my company is planning to do some test flights with the camera pointed at 45 degrees or so, and we were just going to run those images naively through ODM to see what happens. In terms of development, I have some Python skills but no familiarity with the ODM codebase itself so there would be a big learning curve.

1 Like

Hi @cwilley100,

Excellent question! It is possible with some extension to the existing approach. After all, an oblique orthometric is simply an orthophoto from another perspective:

So, there are layers to this. First parts are in ODM, and then you’ll need to add some pieces to WebODM to take advantage of those parts you’ve added in ODM, and then if you are doing more than just one additional perspective in the map viewer, there may be some other complications. So let’s break this down starting with the simplest use case: an orthophoto and a single oblique from the south:

ODM Bits:

  1. Orthophotos are usually generated from a 2.5D model, so to generate a good oblique, you’ll need to default to using the use-3dmesh: true when you are running your new oblique pipeline. This will force it to generate the orthophoto (or in your case oblique) from the 3D mesh rather than the 2.5D mesh. Bonus points if the ortho is from the 2.5D mesh. Double bonus points if you generate a 2.5D mesh(s) for your new oblique perspective(s). The full 3D model is in the odm_texturing directory and is made up of an odm_textured_model_geo.obj file, an odm_textured_model_geo.mtl file, and a bunch of textures as pngs. The 2.5D data is mirrored in a directory called odm_texturing_25d.
  2. Next, you rotate your meshes appropriately. For the gif above, I only needed to rotate in the X-axis, but you might need to do rotations in sequence or use quaternions to do things right for additional perspectives.
  3. Finally, you generate an orthophoto. We can see this being called from within OpenDroneMap in our logs, e.g. (I’m unclear whether you would need to do a transformation of the corner coordinates before gdal_translate: probably…):
[INFO]    running "/code/SuperBuild/install/bin/odm_orthophoto" -inputFiles /var/www/data/526f1a12-91b7-43b8-af96-0f0231360dde/odm_texturing/odm_textured_model_geo.obj -logFile "/var/www/data/526f1a12-91b7-43b8-af96-0f0231360dde/odm_orthophoto/odm_orthophoto_log.txt" -outputFile "/var/www/data/526f1a12-91b7-43b8-af96-0f0231360dde/odm_orthophoto/odm_orthophoto_render.tif" -resolution 20.0  -outputCornerFile "/var/www/data/526f1a12-91b7-43b8-af96-0f0231360dde/odm_orthophoto/odm_orthophoto_corners.txt"
[INFO]    Creating GeoTIFF
[INFO]    running gdal_translate -a_ullr 427920.073538 4579970.179102 427951.115709 4579948.016147 -co TILED=YES -co COMPRESS=DEFLATE -co PREDICTOR=2 -co BIGTIFF=IF_SAFER -co BLOCKXSIZE=512 -co BLOCKYSIZE=512 -co NUM_THREADS=64 -a_srs "+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs +type=crs" --config GDAL_CACHEMAX 46.8% --config GDAL_TIFF_INTERNAL_MASK YES "/var/www/data/526f1a12-91b7-43b8-af96-0f0231360dde/odm_orthophoto/odm_orthophoto_render.tif" "/var/www/data/526f1a12-91b7-43b8-af96-0f0231360dde/odm_orthophoto/odm_orthophoto.tif" > "/var/www/data/526f1a12-91b7-43b8-af96-0f0231360dde/odm_orthophoto/gdal_translate_log.txt"

WebODM Bits:

Now that ODM has generated some new assets, you’ll need to put those into WebODM.

  1. Cross compare the addition of orthophotos, DTMs, DSMs, etc. in the 2D/Map view to understand this portion in WebODM. You’ll likely be adding another tab in that view.
  2. If you end up generating more than a single oblique orthometric view, you may need to pull in a modified version of LeafletJS, or LeafletJS extension that supports rotation, and preferably a little bit of animation to allow for an animation between views to afford the viewer some orientation if they’re switching between orthometric views.

This seems simpler than it should be, so hopefully I’m right on the simplicity of the above… . Piero or Luca can tell me otherwise… .

Oh, and you can totally open an issue at to start the process, link to this, talk through your though process, and Piero, Luca, and others may be able to give you better breadcrumbs on the WebODM side.


Thanks for the ideas! GitHub issue here Generate oblique orthophotos · Issue #1549 · OpenDroneMap/ODM · GitHub.


This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.