gipfel ====== [homepage](http://www.ecademix.com/JohannesHofmann) Description ----------- __gipfel__ helps to find the names of mountains or points of interest on a picture. It uses a database containing names and GPS data. With the given viewpoint (the point from which the picture was taken) and two known mountains on the picture, gipfel can compute all parameters needed to compute the positions of other mountains on the picture. gipfel can also be used to play around with the parameters manually. But be warned: It is pretty difficult to find the right parameters for a given picture manually. You can think of gipfel as a georeferencing software for arbitrary images (not only satelite images or maps). gipfel also has an image stitching mode, which allows to generate panorama images from multiple images that have been referenced with gipfel. The nice thing about image stitching is that it reuses the code that already exists for referencing images. gipfel uses the non-linear [least squares method](http://en.wikipedia.org/wiki/Least_squares) to compute the viewing paramteres from the given data points. Requirements ------------ * [fltk-1.1.x](http://www.fltk.org) * [libtiff](http://www.remotesensing.org/libtiff/) * [libjpeg](http://www.ijg.org/) * [exiv2](http://www.exiv2.org/) * [GSL - GNU Scientific Library](http://www.gnu.org/software/gsl/) * gipfel works on UNIX-like systems (e.g. Linux, *BSD and probably others) Installation ------------ Unpack the tar file and run `./configure; make; make install` Donations --------- If you like gipfel you can make a donation at my [homepage](http://www.ecademix.com/JohannesHofmann). Running ------- To start gipfel, enter gipfel where is the actual picture in JPEG format. You should now see a control window and the actual picture. Additionally a "Choose Viewpoint" window should pop up, where you can search for the viewpoint from which the picture was taken. Select a viewpoint and click "Ok". Alternatively, you can enter the GPS coordinate of the viewpoint directly in the control window (hit for every data field). You can now use the controls in the control window to modify the view parameters. These are: * View direction * Nick angle * Tilt angle * Focal Length * Visibility Play around with these parameters, until you see the names of mountains, which you already recognize on the picture. Now middle-click on the small cross at the left of the name to mark it. It should turn red. Now you can drag it with the left mouse button pressed to the position of the mountain on the picture. If you have positioned at least two mountains, you can click on the "comp" button in the control window to compute the parameters of the picture. You may also want to have a look at the (screen video)[http://www.ecademix.com/JohannesHofmann/gipfel.avi] for an example session. Data File --------- As stated before, gipfel needs GPS input data. The input data must be an ASCII file with one line per mountain / point of interest. Each line must contain the following values separated by a comma: ,,,,, and may be left empty. The following line is a valid example: SMTSBG,Simetsberg,,47.56617,11.25358,1836 Fortunately, there is a [great website](http://www.alpin-koordinaten.de), where you can download a suitable file containg quite a lot of data mostly concerning the alps: Click on the "Suchen" button and the click on the diskette symbol below the first table then select "Fugawi 3 TXT" format and click on "Download". Obviously you can easily add your own entries to the data file or add them to the database at http://www.alpin-koordinaten.de. Thanks to the kind permission of [Jonathan de Ferranti](http://www.viewfinderpanoramas.org/) and the creators of http://www.alpin-koordinaten.de, the standard gipfel tarball includes a default datafile generated from these two sources. For the USA, you can download a data file from [USGS](http://geonames.usgs.gov/domestic/download_data.htm) The file can be transformed for gipfel with awk 'BEGIN {FS="|"; OFS=","}; $3 == "Summit" {print "usgs_" $1, $2,"" , $10, $11, $16};' GPS Tracks ---------- Once you have determined the right parameters using the procedure described above, you can load GPS tracks and display them on the picture. Use the File->Load Track menu item. GPS tracks should be text files containing one line per waypoint. Each line should be of the form: ,, GPS tracks are displayed with variable width depending on the distance of the way points from the current view point and the scale value. You can also modify the width using the "Track Width" slider. Loading and Saving Images ------------------------- gipfel allows to save the image paramters in the comment section of the JPEG image. Use the File->Save Image menu item. Note, that in the saved image all previous JPEG comments are removed. If you open an image containing gipfel image parameters, they are automatcally set. Hidden Object Detection ----------------------- gipfel tries to identify objects in its database, that are hidden by others. This is done by assuming that every object/peak has the form of a cone with a fixed steepness. If such imaginary cone would hide the view to a point in the database, gipfel marks it as hidden. Hidden objects are not shown by default, but you can enable the display of hidden objects using the Option->Show Hidden menu entry. Hidden objects and hidden GPS way points are displayed in blue. Refraction ---------- Refraction caused by temperature and density gardients in the atmosphere is taken into account according to the approximation described by [Tom Chester](http://tchester.org/sgm/analysis/peaks/refraction_calculation.html). under the assumption of a temperature change of 6.5C per 1000m and a temperature T0 at view point level of 10C. Exif Data --------- gipfel tries to get useful information from the exif data of the input image. It uses the "Focal Length in 35mm Film" and the "GPS Longitude", "GPS Latitude", and "GPS Height" parameters, if they exist. Lens Distortion --------------- Typical lenses especially wide-angle lenses diverge from the optimal rectilinear projection. gipfel can now partly correct the resulting errors. To this end gipfel uses a standard distortion model with three parameters (k0, k1, and x0). Depending on these values, the distance d of an image point from the center is modified by (k0 * d + k1 * d ^ 2). x0 is the main point offset in X direction. If you mark and position more than 3 mountains on an image, gipfel tries to correct lens distortion. You can see that the flags turn green in this case. Once you have reasonable values for k0 and k1 for a special camera and focal length you can save the distortion profile (Distortion/Save Profile). Whenever you now open an image taken with this camera model and focal length, gipfel will use this distortion profile. The distortion profiles are stored in the $HOME/.fltk/Johannes.HofmannATgmx.de/gipfel directory and can also be edited manually. Independent of the distortion profiles one can also modify the distortion parameters per image. Distortion correction is also used when stitching panorama images. Stitching Panorama Images ------------------------- If you have multiple images from the same viewpoint referenced with gipfel you can stitch them together to form a panorama image. For stitching the input images must all have been correctly referenced with gipfel and saved (see "Loading and Saving Images"). You can then call gipfel -s ... to see the result in a window. Alternatively you can call gipfel -s -j ... to save the result as a JPEG image to or gipfel -s -t ... to save the result as TIFF image. To get multiple TIFF images as input for , call gipfel like this: for i in *.jpg; do gipfel -s -b -t tiff/$i $i; done The width and height of the result images can be adjusted with additional -w and -h options. You can use the -b switch to enable bicubic interpolation, which gives smoother results but is a bit slower. gipfel simply scans all directions needed for the panorama and determines where these directions would end up on the various pictures. It can then record the corresponding color values from the input images. In contrast to other stitching programs, the input images don't need to overlap. If you want to open a stitched image in gipfel to locate the mountains on it, don't forget to choose Panoramic Projection! Troubleshooting --------------- * Obviously gipfel can only be as good as its input data. If there is no data about the mountains on your picture, you are out of luck... But as the data file format is pretty simple and GPS receivers are common, you can build up your own datafile. * gipfel only works with full normal unmodified pictures taken with a non-distorting standard objektive. If you have a panorama picture, you might want to try the "Panoramic Projection" support which imlements a cylindrical projection (see "Projection" menu). * I don't know, whether gipfel currently works correctly on pictures taken on the southern hemisphere, but I would appreciate any feedback about it. Acknowledgements ---------------- Thanks to the guys from http://www.alpin-koordinaten.de for their public GPS database. Also have look at their other [site](http://www.alpen-panoramen.de). In newer versions I use [maxima](http://maxima.sourceforge.net/) for symbolic computation and code generation. I also want to thank my brother Martin for his suggestions and the discussions. DISCLAIMER ---------- gipfel must __not__ be used for real navigation. You should not rely on the results of gipfel. Johannes Hofmann,