'OpenCV image stitching with few features

For a project I am working on I need to stitch a series of portrait photos into a 360 degree panorama. I have managed to stitch small segments of these series together (roughly 60 degrees), but have failed to stitch the whole series together. Upon inspection, I have noticed that opencv has been returning ERR_NEED_MORE_IMGS when trying to stitch between two consecutive segments. After some googling, I have found that it is likely because some of the photos in the series are very featureless, and therefore don't stitch very well.

I have searched the internet for a way to stitch these low feature images, but all I have found is OpenCV: Stitch images with few features.

I have also tried stitching frames from a video together to create the target 360 panorama, but that has also failed.

Here is my code so far:

import cv2
import argparse
import imutils
import numpy as np

ap = argparse.ArgumentParser()
ap.add_argument("-i", "--input", type=str, required=True)
ap.add_argument("-o", "--output", type=str, required=True)
args = vars(ap.parse_args())

files = args['input'].split(",");
images = []

for f in files:
    images.append(cv2.imread(f))

stitcher = cv2.Stitcher_create()
(status, stitched) = stitcher.stitch(images)

if (status == 0):
    # Crop panorama to content
    stitched = cv2.copyMakeBorder(stitched, 10, 10, 10, 10, cv2.BORDER_CONSTANT, (0, 0, 0))
    gray = cv2.cvtColor(stitched, cv2.COLOR_BGR2GRAY)
    thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY)[1]
    cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    cnts = imutils.grab_contours(cnts)
    c = max(cnts, key=cv2.contourArea)

    mask = np.zeros(thresh.shape, dtype="uint8")
    (x, y, w, h) = cv2.boundingRect(c)
    cv2.rectangle(mask, (x, y), (x + w, y + h), 255, -1)
    minRect = mask.copy()
    sub = mask.copy()

    while cv2.countNonZero(sub) > 0:
        minRect = cv2.erode(minRect, None)
        sub = cv2.subtract(minRect, thresh)

    cnts = cv2.findContours(minRect.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    cnts = imutils.grab_contours(cnts)
    c = max(cnts, key=cv2.contourArea)
    (x, y, w, h) = cv2.boundingRect(c)

    stitched = stitched[y:y + h, x:x + w]
    cv2.imwrite(args["output"], stitched)
else:
    raise Exception('Error stitching images', status)

Any help would be much appreciated

Sample picture 1: https://drive.google.com/file/d/1z7HHwLP6y-pcgcDzeJTutuYiv74U3foj/view?usp=sharing Sample picture 2: https://drive.google.com/file/d/1oCkQYgXUOjpe1kqxa0dQLgqAwoJazePf/view?usp=sharing



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source