This is an panorama stitching program written in C++ from scratch. It mainly follows the routine described in the paper Automatic Panoramic Image Stitching using Invariant Features, which is also the one used by AutoStitch.
- gcc >= 4.7
- Eigen
- FLANN (already included in the repository, slightly modified)
- CImg (optional. already included in the repository)
- libjpeg (optional. If you only need png, you can comment the jpeg macro in lib/imgio.cc)
Eigen, CImg and FLANN are header-only, to simplify the compilation on different platforms. CImg and libjpeg are only used to read and write images, so you can easily get rid of them.
Linux / OSX:
$ cd src; make
Windows users can try cmake with the given CMakeLists.txt
.
Three modes are available (set/unset the options in config.cfg
):
-
cylinder mode. When the following conditions satisfied, this mode usually yields better results:
- Images are taken with almost-pure single-direction rotation. (as common panoramas)
- Images are given in the left-to-right order. (I might fix this in the future)
- Images are taken with the same camera, and a good
FOCAL_LENGTH
is set.
-
camera estimation mode. No translation is the only requirement on cameras. It can usually work well as long as you don't have too few images. But it's slower because it needs to perform pairwise matches.
-
translation mode. Simply stitch images together by affine transformation. It works when camera performs pure translation. It also requires ordered input.
Some options you may care:
- FOCAL_LENGTH: focal length of your camera in 35mm equivalent. Only useful in cylinder mode.
- ORDERED_INPUT: whether input images are ordered. has to be
1
in CYLINDER and TRANS mode. - CROP: whether to crop the final image to avoid irregular white border.
Other parameters are quality-related. The default values are generally good for images with more than 0.7 megapixels. If your images are too small and cannot produce satisfactory results, it might be better to resize your images rather than tune the parameters.
$ ./image-stitching <file1> <file2> ...
The default output file is out.jpg
. You can play with the example data to start with.
Before dealing with very large images (4 megapixels or more), it's better to resize them. (I might add this feature in the future)
In cylinder/translation mode, the input file names need to have the correct order.
Examples (All original data available for download):
Zijing Apartment in Tsinghua University:
Zijing Playground in Tsinghua University:
Carnegie Mellon University from 38 images
Newell-Simon Hall in CMU (this one is hard because objects are closer):
For more examples, see results.
Tested on Intel Core i7-6700HQ, with ESTIMATE_CAMERA
mode:
- 11 ordered images of size 600x400: 3.2s.
- 13 ordered images of size 1500x1112: 6s.
- 38 unordered images of size 1300x867 (high vertical FOV): 51s.
Memory consumption is known to be huge with default libc allocator. Simply use a modern allocator (e.g. tcmalloc, hoard) can help a lot.
- Features: SIFT
- Transformation: use RANSAC to estimate a homography or affine transformation.
- Optimization: focal estimation, bundle adjustment, and some straightening tricks.
For details, see my blog post.