Search code examples
opencvcomputer-visionimage-stitching

Stitch multiple images using OpenCV (Python)


Hi have seen a lot of tutorials how to do simple image stitching using two photos and that is no problem.
But what to do when I want to make a panorama from 4-6 images or more?

I have code that takes in list of image files(the images are in order from the first image in the sequence to the last). Then for each image I compute the SIFT feature descriptors . But then I am stuck, for two images I would set up a matcher using FLANN kd-tree and find matches between the images and calculate the Homography. Similar to this tutorial http://docs.opencv.org/trunk/doc/py_tutorials/py_feature2d/py_feature_homography/py_feature_homography.html#py-feature-homography

But in stead of showing the lines between feature points at the end I have used this https://stackoverflow.com/a/20355545/622194 function to make a panorama from 2 images. But I am not sure what to do when I want to add the third and the fourth image to the panorama.

EDIT:

From the answers I have tried to implement my image stitching script to calculate a homography matrix between images that are next to each other in the image sequence. So if I have I1 I2 I3 and I4 I now have H_12, H_23 and H_34. Then I start by stitching I1 and I2 using H_12. Then I want to find cumulative homography to stitch I3 to the current panorama. I fing H_13 = H_12*H_23 and stitch the image 3 to the current panorama but here I get very apparent gap in my panorama image and when next image is stitched it is even bigger gap and the images is very stretched.

Can anyone tell me if I am using right approach for this or can someone spot the error or see what I am doing wrong.


Solution

  • Step by step, assuming you want to stitch four images I0, I1, I2, I3, your goal is to compute homographies H_0, H_1, H_2, H_3;

    1. Compute all pairwise homographies H_01, H_02, H_03, H_12, H_13, H_23 where homography H_01 warps image I0 into I1, etc...
    2. Select one anchor image e.g. I1 which position will remain fixed i.e H_1 = Identity
    3. Find image that better align with I1 based on maximum number of consistent matches e.g. I3
    4. Update H_3 = H_1 * inv(H_13) = inv(H_13) = H_31
    5. Find image that better matches I1 or I3 e.g I2 matching I3
    6. Update H_2 = H_3 * H_23
    7. Same as above for image I0
    8. Do bundle adjustment to globally optimize alignment

    See section 4 of this seminal paper Automatic Panoramic Image Stitching using Invariant Features for an in depth explanation.