MATLAB: эпиполярные линии не пересекаются с точками (фундаментальная матрица)

У меня серьезная проблема с моим фундаментальным матричным вычислением и эпиполярными линиями в Matlab. Изображение результата можно увидеть здесь: выпуск Matlab

Как видите, есть некий сдвиг между точками и линиями. Я должен уточнить, что я пробовал разные методы, кроме следующего кода: с функцией Matlab (эпиполярная линия), а также с вручную выбранными точками между двумя изображениями, а не с обнаружением. Я также вычислил фундаментальную матрицу вручную (F_8 = transpose(inv(M_B))*St*inv(M_A);), но это ничего не изменило.

В любом случае это не должно быть связано с эпиполярными линиями, не включая их соответствующую точку изображения, верно? Я был бы признателен, если бы вы могли быстро взглянуть и помочь мне! Вот мой код:

    % 8 point algorithm %
    points_A = detectHarrisFeatures(rgb2gray(imgA));
    points_B = detectHarrisFeatures(rgb2gray(imgB));
    [featuresA, valid_pointsA] = extractFeatures(rgb2gray(imgA), points_A);
    [featuresB, valid_pointsB] = extractFeatures(rgb2gray(imgB), points_B);
    indexes = matchFeatures(featuresA,featuresB, 'MaxRatio', 0.65);
    matchedPointsA = valid_pointsA(indexes(:, 1), :);
    matchedPointsB = valid_pointsB(indexes(:, 2), :);

    F_8 = estimateFundamentalMatrix(matchedPointsA, matchedPointsB,'Method','Norm8Point');

    % Epipolar lines %
    figure()
    imgB = imread('asanB.jpg');
    imshow(imgB);
    hold on;

    for i = 1:size(image_points_B,1)
        line = F_8'*[matchedPointsB.Location(i,:),1]';

        points_x = [0,size(imgB,2)];
        points_y = [(-points_x(1)*line(1)-line(3))/line(2)...
            (-points_x(2)*line(1)-line(3))/line(2)];

        plot(matchedPointsB.Location(i,1),matchedPointsB.Location(i,2),'r.','MarkerSize',20)                         
        plot(points_x,points_y);
    end;

    hold off

person Thibaut Dumont    schedule 25.05.2014    source источник


Ответы (1)


Это совершенно нормально. Оценка фундаментальной матрицы чувствительна к шуму, поэтому соответствующие точки редко оказываются точно на эпиполярной линии. Как правило, вы вводите некоторый порог допуска, чтобы исключить плохие совпадения, которые находятся слишком далеко от соответствующих эпиполярных линий.

Вы можете получить лучший результат, начав с большего количества хороших совпадений. Возможно, вы захотите попробовать другой детектор точек интереса и/или другой дескриптор. extractFeatures по умолчанию использует дескриптор FREAK с углами Харриса. Вы можете заставить его использовать другой дескриптор, установив параметр «Метод».

person Dima    schedule 29.05.2014