VisualSFM : A Visual Structure from Motion System

Changchang Wu  


Change List
Function  A simple model merging function (which were previously dropped since V0.5.12)
      Use "SfM->More Functions->Merge Sparse Models"
      Add "+merge" to run this in the command line mode.
      *This only works if two models have a significant overlap.
      *Make sure you backup the model before running the merge. 
A simple interface to run external tools
      You may specify 3 external tool commands using param_external_tool[1|2|3],
        where %s.nvm and %s.ply can be used to refer to the NVM and PLY file.
      For example,
        param_external_tool1 upload_ply_to_some_server %s.ply --token=mytoken
        param_external_tool2 PoissonRecon --in %s.ply --out %s.poisson.ply --depth 10
      Use "SfM->Extra Functions->Run External Tool" and select the tool to run.
Save Compact Model -> Save Current Cameras
      This saves an NVM file of the current model with just the camera part.
Bugfix    Fixed a gtk-related bug that affects Linux & OSX
      Symptom: crash with warning "losing the last reference to undestroyed window"
UI Changes Improved multi-camera selection in sparse point mode
      F1 : select cameras inside a rectangle
      F2 : select cameras that sees 3D points inside a rectangle
      The multiple selected cameras are hilighted.
      For photo deletion, you may hold CTRL to delete them one by one.
Minor logging and parameter tweaks.
      You may see the link to FAQ when there is an error.
Function  Added socket command interface for programmable interaction
      Run "VisualSFM help" from commandline to see details.
      The command list can be found as menu ids in ui.ini
Added parameter to let reconstruction run deterministically.
      Set param_deterministic_behavior to 1
Automatic saving of NVM for GUI mode
      Set param_model_auto_saving to 1
      auto_saved.nvm in the binary directory after sparse reconstruction.
You can now set low priority for the process in all OS
      Tools -> Use Lower Priority
      Turn this on if VisualSFM makes your computer too slow.
UI Changes "Task Viewer" renamed to "Log Window"
Disable Ubuntu global menu for VisualSFM.
Function  Removed other research projects from the release.
      Send me emails for versions that include my research projects.
Exposed preemptive feature matching parameters
      h and t_h in the 3DV paper are available as preemptive_min and preemptive_size.
Exposed parameter for limiting cpu usage in various stages.
      Set param_maximum_cpu_usage to limit the number of threads.
Save Meshlab align file (.aln) for geo-referencing
      Set param_write_transformation_to_aln to 1,
      NVM and PLY will not be transformed, and the transform is saved as ALN instead.
UI Changes Mouse wheel zooming now centers at the cursor location.
Function  Added support for VLFeat SIFT binary (Thanks to Ellis)
      Obtain VLFeat SIFT binary and place it where VisualSFM is.
      Set param_use_siftgpu to 0, and param_use_vlfeat_or_lowe to 1.
      Use param_vlfeat_options to change the detector setting.
Added hybrid sequence match (Thanks to Ellis)
      The GUI mode now accepts two numbers "RANGE STEP"
      The commandline mode accepts "@RANGE,STEP" for +pairs.     
      In addition to the range to match, this mode also does full pairwise
      matching to a sub-sampled image set (every STEP-th image). 
Added camera coordinates based GCP transform
      Make a .gcp file such that each line gives: filename X Y Z
      Note the previous accepted format is: filename image_x image_y X Y Z
Added GCP-based transform to commandline
      Use VisualSFM sfm[..]+pmvs+gcp [input] output.nvm
      GCPs will be loaded from [input].gcp
Added pure triangulation to commandline
      Use VisualSFM sfm+add input.nvm output.nvm
Added constrained bundle adjustment
      Use "SfM->More Functions->Run Constrained BA"
      Default: variable-motion constant-structure BA
      +SHIFT : variable-structure constant-motion BA
      +CTRL  : constant-intrinsic BA
Added parameter to override EXIF focal length
      Set param_use_exif_focal_length  to 0
UI Changes

Added perspective rendering to 3D viewing
      Toggle by "View -> Perspective View"
      Set ui_perspective_view to 1 in ui.ini for permanent choice.
Added alternative menu names for UI customization
      Modify the template ui.ini and place it where the binary is.
      Allows for translation to other languages
Added option to hide the research menus
      Change ui_show_research to 0 in ui.ini
Bugfix      Fixed a bug in handling large focal lengths
Fixed a bug in handling sift binary path that has spaces
Fixed a bug in detecting remote desktop environment
UI Changes Toolbar button for reloading and opening nv.ini
      Hold CTRL to open the file in editor
Menu item for enabling/disabling memory cap for SiftGPU
      Toggle "Tools->Enable GPU->Cap Memory Usage"
Reuse the thumbnail button for spanning trees/match matrix
      Hold CTRL to show spanning trees
      Hold SHIFT to show matching matrix
Menu item for changing param_pmvs_level between 0 and 1
      Use "SfM->More Functions->Use Level 0 for PMVS"
Many changes to the menu names and toolbar icons.
      Reconstruct 3D   -> Reconstruct Sparse
      Resume SFM       -> Reconstruct Resume
      Run CMVS/PMVS    -> Reconstruct Dense
Updated tooltips for the toolbar
Function  Pure triangulation from known cameras
      Create an NVM file that contains valid cameras and 0 points
      Load the NVM file, and run feature matching as usual
      Use "SfM->More Functions->Find More Points" to generate the points
Keep input frame order
      In the GUI mode, type command "sort" in the statusbar
      In the commandline mode, add +sort to the sfm_option
Re-optimize 3D reconstruction for shared calibration
      In the GUI mode, use "SHIFT + Bundle Adjustment"
      In the commandline mode, add +shared to the sfm_option
Support for using two GPUs for feature matching
      You have to use CUDA-enabled SiftGPU for this!
      Specify two devices for param_use_siftgpu, for example 1 2
      The first one must be 1 or 2, and the second one can be 2 or 3.
      Here 1 is for GLSL, 2,3 are for the first/second CUDA device
Support for bundler format (.out)
      Export to bundler file through "Save NView Match"
      Load bundler file through "Load NView Match" for viewing
      Note that radial distortion will be ignored!
Drop-list for entering options and GCP coordinates.
      History coordinates are saved in the droplist.
      Load a 3D coordinate list to the drop-list (use .gcpx extension)
Option for saving PLY in ASCII format
      Change param_write_ascii_ply to 1
Commandline option for exporting feature matches
      Use VisualSFM sfm[+exportp/exportf] input output.txt
Export a list file for the images in visualize folder for Meshlab
      A list.txt file is generated for each PMVS folder
Locate the current image in file browser using command "locate"
Native resolution visualization for large images
Minor bugfix for incorrect point count in bundle.rd.out and sparse PLY
Minor bugfix for reconstruction of GPS-tagged photos within a small range
Minor bugfix spanning tree visualization

Fixed a nasty bug that drags down the undistortion speed!
        The undistortion stage is now probably more than 10x faster on large datasets.
        The log Viewer also reports more timing on the undisortion now.
Support for a soft shared calibration constraint among all images.
        Enable by "SfM -> More Functions -> Use Shared Calibration"
        Try this if all the images should have the same focal length
        PBA in this mode is slower, and you can enable it only in a final bundle adjustment
Support for a UI setting file (ui.ini), you may add the following example lines in the file
        # Set the following to 1 to make the viewer using dark background
        ui_dark_background 1
        # Set the following to 1 to make the log viewer detached in the beginning.
        ui_logviewer_detached 1
        # Set the expected size of the drawing area.
        ui_view_dimension 800 600
Fixed a bug of failing to generate mvs.ini for CMP-MVS in Linux/OSX
Fixed an issue that loading multiple images is very slow in Linux
        The internal GTK recent manager is now disabled when choosing multiple files.
Fixed an issue that the GTK Log Viewer cannot be moved in Linux
Fixed a bug of using poor floating point precision when writing PLY.
Fixed a bug that the spanning tree function crashes in Linux


Included the Schematic Surface Reconstruction project(CVPR12)
Remove the Viewpoint Invariant patch Project
Improved the CPU feature matching speed
More optimized binaries for Linux/OSX (may have significant speedup)
Allows to show points seen by n+ cameras in N-View Point mode
       use "vmin n" command in statusbar
Allows to quit the feature matching loop
Allows to bypass the remote desktop check
       Change param_check_remote_desktop to 0
Select a prioritized subset of image pairs for matching instead of all
       Enable by SfM->Pairwise Matching->Use Prioritized Subset
       Use +subset under commandline
       This is only used when the # of images are larger than param_prioritized_subset_switch
Fixed broken pointer to the Google group under Help

Point removal/cleanup in dense point mode
       Press F1, drag a rectangle to select points, Press DEL to remove points
Supporting 2D ground control points (GCP) in GCP-based transform
       Enter the GCP selection mode by clicking "SfM->More Function->GCP-based Transform",
       You will see the associated controls in the task viewer.
       Save the GCPs to a text file by using "Save NV-Match" and specifying .gcp as extension.
       Load the GCPs by "Load/Add NV-Match", and select "Ground Control Point" from the drop list.
       The 3D "Manual Transform" function in old versions is merged to "GCP-based Transform"
Export to the format used by CMP-MVS in addition to Furukawa's CMVS/PMVS
       Click "SfM->Run CMVS/PMVS", and select the second format option
       Data will be saved in output.nvm.cmp folder
       The corresponding command option is +cmp (e.g. VisualSFM sfm+cmp input output.nvm)
Export to new cameras_v2.txt instead of cameras.txt
       Includes the original file names, and GPS in original EXIF
Single reconstruction step
       Use Ctrl + "Resume 3D" to add a single image
Command line resume change [VisuaSFM sfm+resume <input>.nvm output.nvm]
       Now searches for additional images in <input>.nvm.txt
Undisortion thread parameter
       New parameter to control the number of threads: param_undistortion_thread_num
Pointer to Google Group
       Click "Help->Online Discussions" to go to the Google Group
Switch between Vision/OpenGL 3D coordinate
       Vision (Y downward, Z forward), OpenGL (Y upward, Z backward).
       Vision coordinate is the default. Switch by "View->Vision/OpenGL 3D"
Rotate 3D scene around x axis by a specified angle through the statusbar command rotatex<n>
       For example, rotatex180, rotatex90, rotatex45, ...
Some fix for the animation function
       Fixed a bug in command "am load"
       Quit animation on ESCAPE press
Fixed a bug in estimating 3D Transformation with perfect planar points

Exposed a parameter for controlling the number of CPU threads for feature matching,
        param_cpu_siftmatch_num_thread: the number of CPU threads in addition to GPU matching
Exposed two parameters for feature detection
        param_use_siftgpu:  0 for CPU, 1 for GLSL, 2 for CUDA, 3 for customized parameter
        param_use_siftgpu_customize: the customized parameter when param_use_siftgpu==3
Fixed a bug of not respecting device selection for feature matching
        param_use_siftmatchgpu: 0 for CPU, 1 for GLSL, 2+ for CUDA
Fixed a bug of not selecting images with upper case .JPG file extensions in Linux,
Fixed a bug of not reading EXIF GPS coordinates when there are multiple EXIF sections,
Fixed a bug of not converting ASCII SIFT to binary format,
Fixed a bug of not quitting loop when reconstructing multiple 3D models and searching for more,
Updated the copyright dialog and copyright statement.

Added sequence mode for pair-wise image matching
       Instead of all the pairs, this mode matches only two frames within a specified range.
       Menu: "sfm->Pairwise matching->Compute Sequence Match"
       For command line: use "VisualSFM sfm+pairs input ouput @range", where range is a number
Added GPS-based Geo-reference by using RANSAC,
       Menu: "sfm->More Functions->GPS-based Transform".
       Click the Menu item to see more instructions.
       Supports GPS in JPEG EXIF or a specified GPS file
       Use Ctrl + "GPS-based Transform" to select a GPS file input
                filename lat lng <optional alt>
       Parameter param_gps_variance & param_gps_ignore_exif_altitude
Updated Manual Transformation interface
       It now picks one point at a time instead of two.
       With in this mode, the 3D point coordinates are shown in status bar
Shows 3D point coordinate in statusbar when CTRL (changed to C in V0.5.17) is pressed
Moved "Watch current Path" function to status bar commandline "watch"

Fixed a memory leak introduced in V0.5.13;

Added light-weight mutex for visualization stability;
Added support of fixed calibration for command line mode;
   add [+k=fx,cx,fy,cy] to sfm_option
Added point selection in dense point cloud mode;
   allows finer localization for 3D model transformation
Fixed a bug on fixed calibration (introduced in V0.5.13);
Fixed a bug in track generation;
Improved algorithmic efficiency.

SiftGPU update:
issued a bugfix on CUDA-based matching;
But no need to update if using GLSL-based SiftGPU.


Memory optimization for large datasets (e.g. 500 images or more)
Bug fix in relative path handling when running PMVS from command line
Bug fix for calling XInitThreads too late on Mac OSX
Bug fix for incorrectly detecting VNC without connecting a physical monitor as remote desktop
Now respecting the device selection parameter in nv.ini
    Modify param_use_siftmatchgpu and param_use_siftgpu
    This allows to select CPU when running from console.
Minor window alignment change for running through Xming.

Partial calibration support,
               "SfM->More functions->Set Fixed Calibration"
               For now, a single calibration[fx, cx, fy, cy] is supported
               No radial distortion support, so you have to undistort the images
Manual transformation of 3D Models,
               "Sfm->More Functions->GCP-based Transform"
               Allows you to manually transform the coordinate system
Fixed a GTK-related dead-lock bug for Linux
Removed the 3D model merging functions
More code cleanup and function removal/replacement (P3P, 5point, ...)
Small Linux UI improvements


Custom pair-list matching
               "SfM -> Pairwise Matching -> Compute Specified Match",
               allows you to specify a pair-list to compute matches
               In comparison, "Compute Missing Match" computes all image pairs
               This is useful for matching video sequences
Custom features matches
               "SfM -> Pairwise Matching -> Import Feature Matches",   
               you may compute the feature matches by using your own methods,
               and VisualSFM will finish the geometric verification for those pairs
Exposed the customized matching to the command line interface(+pairs/+import)
Fixed a Linux deadlock bug that happens when job size is too small

Fixed an initialization bug when all matches are too good.
Change point display size by using "Alt + Mouse wheel"
Show/hide cameras in Dense point cloud mode by pressing "F"
Show/hide axis plane in Dense/Sparse point cloud mode by pressing "A"
Automatic orientation adjustment after reconstruction. (use command "ao" to correct old results)
Some other visualization improvements.

Exposes most of the CMVS/genOption/PMVS parameters (Modify param_pmvs_* nv.ini)
Re-implemented the owner-draw win32 menu to remove some external code.
More cleanup to remove code from some previous projects

Implemented high-resolution screen capture (Click SHIFT when using "Save Current View")
        * Imagine zooming current view, but still get all the details!
        * The zoom factor is 4x by default; Change through quick command "czoom factor"
        * The image dimension can be zoomed up to 25k
        * You may need to manually change point size with "psz size" when rendering sparse points
Command line improvements. (use VisualSFM help to check more details)
3-mode visualization of sparse reconstruction: cameras+points/points/cameras. use 'T' to switch
Modified the "export for PMVS/CMVS" function to still run CMVS/genOption but skip PMVS
Added export of "cameras.txt" to contain all camera information when export data for PMVS/CMVS

Improved NFS writing by using reordered asynchronous writes. (set param_asynchrous_write = 1)
Improved the 3D Model merging function (SfM->More Functions-> Interactive/Automatic Merge).
Added option to choose between GLSL and CUDA for SIFT Matching. (Requires CUDA-enabled SiftGPU)
Fixed a bug of not releasing pixel data after undisortion for PMVS (Thanks to Ferreira).
Fixed a bug of segmentation fault when running under non-X Linux terminal.
Fixed a bug of segmentation fault when restarting unfinished matching.
Fixed a bug of "Run CMVS/PMVS" not working, which is probably just introduced.

Fixed a bug in GPU memory pre-allocation that may halt SiftGPU. (happens if GPU memory < 1GB)
Added interface for CMVS export without running CMVS/PMVS. (Use by Ctrl + "Run CMVS/PMVS")
Changed command line interface. ("sfm" does sparse reconstruction only, "sfm+pmvs" does both)
Fixed a bug in relative path handling in command line interface.
Added  segmentation fault handler to flush the log file before exit
Minor UI changes.

Modified NVM saving to keep all image file extensions (lower case ".jpg" was omitted previously).
Added Toolbar tooltips for Linux UI
Added Menu Item pointing to online documentation
Fixed a rare Windows UI bug that may crash the program when clicking on Menubar
Fixed a minor bug on not releasing pixel data after generating thumbnails.

Limit the number of thumbnail textures to save graphic memory for SiftGPU & PBA
Fixed minor bug on limiting the reused images between multiple models.
Added Menuitem for exporting pairwise image matches to a TXT file

Update from SiftGPU, 9/03/11,
Fixed a SiftGPU bug on dealing with Memory Cap(happens on High-res image, small GPU Memory)

Improved command line interface, and added Ctrl+C Handler.
Removed unnecessary point filtering (slow down when a model gets too large).

Fixed Windows XP File Dialog issue.
Added GPS handling. Run feature matching according to GPS in EXIF.(parameter in nv.ini)

Added interface for running CMVS/PMVS. Do it with a button click! (parameter in nv.ini)

Fixed Linux Multi-thread deadlock bug