Simple tutorial for setting up GCPs using Google Earth Pro?

I watched a Youtube video where the person was using GCPs that they created in Google Earth Pro to correct the placement of a map. The results seemed impressive - obviously not cm accuracy but far better than without GCPs.
Unfortunately, the video didn’t have a tutorial on how it was done - just the results.

Does anyone have a simple tutorial on how to do that? Or…if not…would someone be interested in walking me through it and I will create a video to share for others?

1 Like

Do you have a link to the YouTube video you are referring to?

1 Like

This is the video I was watching: Orthophotos Improved Using Fake Ground Control Points - YouTube

1 Like

Hmm, we don’t have anything yet, but this would be a good subject for another tutorial for me to write up in our docs. Added to the list!

Could you give me a brief run-through of what you understand and what you think the flow is so I know what I need to fill in with you more?

Thanks Saijin

I love to give back too and do similar things with video editing groups I am in.

What I know how to do is:

  • Take photos using a drone
  • Upload those photos into WebODM and process them to produce a map
  • View the map in the WebODM client

What I need to know is how to:

  • Create GCPs using Google Earth (based on points that are on Google Earth and my photos)
  • Load those GCPs into WebODM and connect them to the processed map to provide the necessary corrections

I’m not sure if this is important but I am running WebODM in Docker on my PC.

Is that enough?


1 Like

Hey…I thought I had figured it out.

I used the GCP interface to create a small GCP file which looks like this:

+proj=utm +zone=18 +ellps=WGS84 +datum=WGS84 +units=m +no_defs
569285.36 4540311.48 0 2675.42 1089.08 DJI_0014corrected.jpg
569303.51 4540347.78 0 2199.47 2142.32 DJI_0033corrected.jpg
569444.37 4540286.89 0 1512.02 2038.29 DJI_0103corrected.jpg
569444.37 4540286.89 0 746.08 2444.96 DJI_0070corrected.jpg

I run a small test of 117 photos and it processes normally. I run another test with the same photos and the above file and it crashes with this error

“ERROR] Uh oh! Processing stopped because of strange values in the reconstruction. This is often a sign that the input data has some issues or the software cannot deal with it. Have you followed best practices for data acquisition? See Flying Tips — OpenDroneMap 2.7.1 documentation

So…either I was wrong to load the gcp text file with the photos (which I thought is what it was asking for) or there is something wrong with the file…or…adding that just pushes it out of what my machine can run.

Any insights?


1 Like

Actually… never mind. I see that the last two lines on the gcp file are the same but for different photos, so I must have messed something up there. I’ll try again when I have time.

1 Like

The GCP file is taken as 100% truth, so any mistakes with it can be disatrous to the processing of the data, as you found out.


  1. Google Earth imagery is typically somewhere in the neighborhood of 3-10m off from reality in x/y. It will be similar or more in Z/height. If possible, it is best to collect a-priori in-situ GCPs. This means GCP markers you will see in your collected imagery with associated GPS survey data for each marker. If you can’t do this, getting imagery from your local municipality/County/State should be far better in terms of accuracy than Google Earth, and would be a better way to collect your synthetic GCPs.
  2. You would use the POSM GCPi or GCP Editor Pro to ingest the points once they’re in the proper format. Please see here for some general information on this part:
    Ground Control Points — OpenDroneMap 2.7.1 documentation

Yes, I totally understand that in-situ GCPs would be best. But that is not always going to be feasible. I saw the results from the Youtube link (provided earlier) and that seemed to indicate a big improvement over no GCPs at all.
It might not be totally accurate in terms of position, but it might just be an improvement over how things overlay only Google Earth, and that might be worthwhile in itself.

If I have time later today I’ll try to recreate the GCPs using the POSM GCPi editor. I had a few problems with it (user error I’m sure) so I need to figure out the right order to click things.

Thanks for the info.

1 Like

OK - I’m obviously doing something wrong.
I created a bunch of “fake GCPs” using the GCP interface tool. I did that by adding photos, then clicking on the photos to create a point, clicking on the same location in the map, making sure the dots turned green.
I added 2 locations in most of the pictures.
I then generated the GCP file which had the following:

+proj=utm +zone=18 +ellps=WGS84 +datum=WGS84 +units=m +no_defs
569285.36 4540311.54 0 336.63 1022.51 DJI_0011corrected.jpg
569305.40 4540299.92 0 1485.67 1361.37 DJI_0011corrected.jpg
569268.28 4540314.06 0 2755.49 1048.36 DJI_0015corrected.jpg
569302.39 4540344.38 0 903.69 1508.78 DJI_0025corrected.jpg
569303.24 4540347.82 0 724.69 1470.00 DJI_0025corrected.jpg
569444.32 4540286.88 0 2304.11 980.20 DJI_0051corrected.jpg
569453.30 4540423.68 0 2255.96 1517.04 DJI_0051corrected.jpg
569453.30 4540423.68 0 1744.82 1324.89 DJI_0057corrected.jpg
569504.89 4540395.13 0 3516.54 1830.82 DJI_0057corrected.jpg

Then I loaded that file, along with 117 photos (including the ones mentioned in the file), and hit process.

It processed for a bit and then crashed again

Below is the last part of the log but…if anyone can see what I’m doing wrong, it would be much appreciated. Thanks!

End of log:
[INFO] running “/code/SuperBuild/install/bin/opensfm/bin/opensfm” export_visualsfm --points “/var/www/data/73371509-6f88-4389-b2a3-c60bf2a2a68b/opensfm”
[INFO] Finished opensfm stage
[INFO] Running openmvs stage
[INFO] running “/code/SuperBuild/install/bin/opensfm/bin/opensfm” export_openmvs “/var/www/data/73371509-6f88-4389-b2a3-c60bf2a2a68b/opensfm”
[INFO] Running dense reconstruction. This might take a while.
[INFO] Estimating depthmaps
[INFO] running “/code/SuperBuild/install/bin/OpenMVS/DensifyPointCloud” “/var/www/data/73371509-6f88-4389-b2a3-c60bf2a2a68b/opensfm/undistorted/openmvs/scene.mvs” --resolution-level 3 --min-resolution 320 --max-resolution 2048 --max-threads 8 --number-views-fuse 2 -w “/var/www/data/73371509-6f88-4389-b2a3-c60bf2a2a68b/opensfm/undistorted/openmvs/depthmaps” -v 0 --geometric-iters 0 --cuda-device -1
14:23:34 [App ] Build date: Jan 9 2022, 00:27:19
14:23:34 [App ] CPU: Intel(R) Core™ i7-4770 CPU @ 3.40GHz (8 cores)
14:23:34 [App ] RAM: 12.44GB Physical Memory 4.00GB Virtual Memory
14:23:34 [App ] OS: Linux (x86_64)
14:23:34 [App ] SSE & AVX compatible CPU & OS detected
14:23:34 [App ] Command line: /var/www/data/73371509-6f88-4389-b2a3-c60bf2a2a68b/opensfm/undistorted/openmvs/scene.mvs --resolution-level 3 --min-resolution 320 --max-resolution 2048 --max-threads 8 --number-views-fuse 2 -w /var/www/data/73371509-6f88-4389-b2a3-c60bf2a2a68b/opensfm/undistorted/openmvs/depthmaps -v 0 --geometric-iters 0 --cuda-device -1
14:23:35 [App ] Preparing images for dense reconstruction completed: 117 images (1s33ms)
14:23:35 [App ] Selecting images for dense reconstruction completed: 0 images (141ms)

Fused depth-maps 0 (100%, 0ms)
14:23:35 [App ] Densifying point-cloud completed: 0 points (1s185ms)
14:23:35 [App ] MEMORYINFO: {
14:23:35 [App ] VmPeak: 1285992 kB
14:23:35 [App ] VmSize: 1217576 kB
14:23:35 [App ] } ENDINFO
[INFO] running “/code/SuperBuild/install/bin/OpenMVS/DensifyPointCloud” --filter-point-cloud -1 -i “/var/www/data/73371509-6f88-4389-b2a3-c60bf2a2a68b/opensfm/undistorted/openmvs/scene_dense.mvs” -v 0 --cuda-device -1
14:23:35 [App ] Build date: Jan 9 2022, 00:27:19
14:23:35 [App ] CPU: Intel(R) Core™ i7-4770 CPU @ 3.40GHz (8 cores)
14:23:35 [App ] RAM: 12.44GB Physical Memory 4.00GB Virtual Memory
14:23:35 [App ] OS: Linux (x86_64)
14:23:35 [App ] SSE & AVX compatible CPU & OS detected
14:23:35 [App ] Command line: --filter-point-cloud -1 -i /var/www/data/73371509-6f88-4389-b2a3-c60bf2a2a68b/opensfm/undistorted/openmvs/scene_dense.mvs -v 0 --cuda-device -1
14:23:35 [App ] error: empty initial point-cloud

===== Dumping Info for Geeks (developers need this to fix bugs) =====
Child returned 1
Traceback (most recent call last):
File “/code/stages/”, line 94, in execute
File “/code/opendm/”, line 346, in run
File “/code/opendm/”, line 346, in run
File “/code/opendm/”, line 346, in run
[Previous line repeated 1 more time]
File “/code/opendm/”, line 327, in run
self.process(self.args, outputs)
File “/code/stages/”, line 180, in process’"%s" %s’ % (context.omvs_densify_path, ’ '.join(config + gpu_config)))
File “/code/opendm/”, line 106, in run
raise SubprocessException(“Child returned {}”.format(retcode), retcode)
opendm.system.SubprocessException: Child returned 1

===== Done, human-readable information to follow… =====

[ERROR] Uh oh! Processing stopped because of strange values in the reconstruction. This is often a sign that the input data has some issues or the software cannot deal with it. Have you followed best practices for data acquisition? See Flying Tips — OpenDroneMap 2.8.0 documentation

So this part is showing you that the entire dataset is being thrown out before the point cloud is being created.

This leads to this:

Something must be amiss with the GCPs you created relative to the images you have.

1 Like

Thank you. I’m not sure what that would be but if I posted a quick video showing how I created them, maybe you would be able to tell me what I am doing wrong? What do you think?

Thanks for all your help with this.

1 Like

I can’t promise it’ll be enough, but we can try :slight_smile:
Post away!

Thanks. If I have things totally wrong, I won’t be offended if you let me know. I’m here to learn and still very new with this software - but loving what I am seeing so far.

Here’s the video Fake GCP creation

1 Like

barry, your process is correct.

Would you feel comfortable sharing the dataset privately, or letting me remote in to work with you on it for a bit?

Absolutely. This one is nothing sensitive - it’s a test run at my home to learn the process. I’ll put everything in a dropbox and send it in a private message.


1 Like

Did you get it?

1 Like

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