From Wiki
Jump to: navigation, search

Hi, this is my page. I have a /Sandbox.

2011 GSoC Proposal

Short Description Currently, control points between pairs of photographs must be added by users manually or "guessed" using a sifting algorithm. This project aims at a sort of hybrid for straight lines. The user draws straight lines on a pair of images, and the computer then automatically adds and refines control points along the given path. Such a method will allow quick and simple alignment of photographs with straight lines in them.

About Me

My name is Steven Williams and I am in my fourth year studying undergraduate mathematics at Walla Walla University. I have taken classes in data structures using C++. I have been an amateur photographer for about six years and own a Canon Powershot A620 and Canon Digital Rebel XTi. The only special equipment I have is a Manfrotto ball head tripod, but I shoot mostly handheld. Some of my photographs, including panoramas I have made using Hugin, can be found on Flickr[1] and Panoramio[2]. I also use Hugin to align images for exposure blending using qtpfsgui or enblend/enfuse.

Coding Skills

I have been writing in C++ for three years. I became interested in programming in high school, and wrote a Mastermind clone in TI-Basic on my TI-89. I have a little experience with C# and recently Processing. My current primary computer is a homebuilt quad-core desktop running Windows 7 with Ubuntu in a virtual machine.

Recently I wrote a program to visualise and interact with 2D IFS fractals as part of a senior seminar project. It is on Git here [3].

I have patched Bug #749669, which addresses crashing when trying to load an image as a .pto project.


My only previous interaction with the Hugin project is as a user. I have been using Hugin for several years to stitch panoramas. (UPDATE: see [4] for a patch I did for the program)

For this project I would like to take up the Straight Line UI proposal from here [5]. This is also a blueprint [6] on Launchpad. I have had some experience from my IFS program working with user input and object manipulation and am excited to develop a new tool for Hugin that will enable users to match their photographs quickly and easily.

I propose a system that will take a line drawn by the user in the quick preview window, and using a corner detection algorithm "snap" it to the nearest edge detected for more precise straight line input. Once this is done for the same line in matching images, the program will scan points along this line and automatically match control points in each image.

I plan on spending at least 40 hours per week on this project. University graduation happens around June 10, so I may not be able to spend as much time during the two or three days around that weekend. Here is a (very) tentative schedule:

May 24-June 3 Finalize inputs/outputs for new straight line tool, get

June 6-17 Write line input methods for user interaction and rough algorithm for guessing/sifting control points on the given lines.

June 20-July 1 Implement edge detection for given lines, test on lots of images

July 4-8 Clean up and test for mid-term evaluation

July 18-29 Refine control point guessing procedure

August 1-12 Extra week for bugs/slow progress/etc.

August 15-19 Finalize/improve documentation

2011 GSoC Project Documentation

The bulk of this project is wrapped up in a new class, the Control Line, that one can use in a manner similar to the Control Point class. It is a cascade of containers with associated functions for each level. The containers are as follows, from smallest to largest, with a short description and reference to where one would use it.


Description: Contains attributes of a straight line, modeled as a circle (straight lines distort approximately circular with a non-perfect lens).

Where to use it: Within an individual image. Call addPoint() to place three points along the straight line path. Attributes are accessed as center, radius, thetaStart, thetaEnd for a curved line and straightStart, straightEnd for a straight line.


Description: Holds all straight lines in an image.

Where to use it: Within an individual image. Use for selecting a line (or point on a line) from all lines in the image.


Description: Holds the set of all lines corresponding to an image pair. This manages adding and deleting a line so it ends up in both images. Where to use it: This class should be accessed by code handling the current image pair. For example, line list selection, deletion, and extracting points along the line would use this class.


Description: This holds everything related to straight lines for a panorama. It contains a vector of 'ImageLinesPair', with very few associated functions.

Where to use it: Use OnImagePairChange(leftImageNr,rightImageNr) to get a new ImageLinesPair whenever the image pair changes in the Control Points tab.