MATLAB Image Stitching ошибки - PullRequest
0 голосов
/ 15 мая 2019

Поэтому я использую код, предоставленный на веб-сайте Mathsworks, чтобы попытаться сшить набор из 20 изображений. Пример на Mathsworks с приведенными 5 изображениями работает нормально и надежно сшивает. Однако, когда я изменяю исходный каталог для моих изображений, программа выдает множество ошибок. Основная ошибка заключается в том, что недостаточно областей сопоставляются. Мои изображения читаются хорошо, так как я их вижу, когда их монтирую.

Я прошел и проблема здесь:

tforms(n) = estimateGeometricTransform(matchedPoints, matchedPointsPrev,...
    'projective', 'Confidence', 99.9, 'MaxNumTrials', 4000);

Я предполагаю, что когда я закомментирую это, код запускается без ошибок. Я возился с входными аргументами, но ничего не изменилось.

clear all;

%buildingDir = fullfile('C:\ changed to my directory');
buildingDir = fullfile(toolboxdir('vision'), 'visiondata', 'building');
buildingScene = imageDatastore(buildingDir);

montage(buildingScene.Files)

I = readimage(buildingScene, 1);

grayImage = rgb2gray(I);
points = detectSURFFeatures(grayImage);
[features, points] = extractFeatures(grayImage, points);

numImages = numel(buildingScene.Files);
tforms(numImages) = projective2d(eye(3));
%tforms(numImages) = affine2d(eye(3));

imageSize = zeros(numImages,2);

for n = 2:numImages

    pointsPrevious = points;
    featuresPrevious = features;

    I = readimage(buildingScene, n);

    grayImage = rgb2gray(I);

    imageSize(n,:) = size(grayImage);

    points = detectSURFFeatures(grayImage);
    [features, points] = extractFeatures(grayImage, points);

    indexPairs = matchFeatures(features, featuresPrevious, 'Unique', true);

    matchedPoints = points(indexPairs(:,1), :);
    matchedPointsPrev = pointsPrevious(indexPairs(:,2), :);

    % Estimate the transformation between I(n) and I(n-1).
   tforms(n) = estimateGeometricTransform(matchedPoints, matchedPointsPrev,...
    'projective', 'Confidence', 99.9, 'MaxNumTrials', 4000);

    tforms(n).T = tforms(n).T * tforms(n-1).T;
end

for i = 1:numel(tforms)
    [xlim(i,:), ylim(i,:)] = outputLimits(tforms(i), [1 imageSize(i,2)], [1 imageSize(i,1)]);
end

avgXLim = mean(xlim, 2);

[~, idx] = sort(avgXLim);

centerIdx = floor((numel(tforms)+1)/2);

centerImageIdx = idx(centerIdx);

Tinv = invert(tforms(centerImageIdx));

for i = 1:numel(tforms)
    tforms(i).T = tforms(i).T * Tinv.T;
end

for i = 1:numel(tforms)
    [xlim(i,:), ylim(i,:)] = outputLimits(tforms(i), [1 imageSize(i,2)], [1 imageSize(i,1)]);
end

maxImageSize = max(imageSize);

xMin = min([1; xlim(:)]);
xMax = max([maxImageSize(2); xlim(:)]);

yMin = min([1; ylim(:)]);
yMax = max([maxImageSize(1); ylim(:)]);

width  = round(xMax - xMin);
height = round(yMax - yMin);

panorama = zeros([height width 3], 'like', I);

blender = vision.AlphaBlender('Operation', 'Binary mask', 'MaskSource', 'Input port');

xLimits = [xMin xMax];
yLimits = [yMin yMax];
panoramaView = imref2d([height width], xLimits, yLimits);

for i = 1:numImages

    I = readimage(buildingScene, i);

    warpedImage = imwarp(I, tforms(i), 'OutputView', panoramaView);

    mask = imwarp(true(size(I,1),size(I,2)), tforms(i), 'OutputView', panoramaView);

    panorama = step(blender, panorama, warpedImage, mask);
end

figure, imshow(panorama)


I was wondering if the highlighted code I put was the problem or whether something else was causing it. From the error messages I get theres not enough matched points - but I dont know why.
...