Отслеживание фигуры, содержащей фоновое изображение в Matlab

Я пытаюсь создать функции, позволяющие пользователю отслеживать изображение в Matlab и записывать / наносить на график в реальном времени координаты того места, которое они отслеживают поверх этого изображения.

Следуя этому руководству: https://www.mathworks.com/videos/capture-mouse-movement-97322.html Мне удалось создать следующий функционал, подтверждающий концептуальный код, который записывает и строит графики в реальном времени, где пользователь отслеживает внутри фигура без изображения, присутствующего на заднем плане:

function traceVelocityCurve()

    fig = figure;

    plotAxes = axes('Xlim', [0, 1], 'Ylim', [0 1], 'ButtonDownFcn', @startDragFcn);
    hold all

    xValues = [];
    yValues = [];

    tracing = scatter(xValues, yValues);
    tracing.Marker = '.';
    tracing.MarkerFaceColor = 'red';
    tracing.MarkerEdgeColor = 'red';


    set(fig, 'WindowButtonUpFcn', @stopDragFcn);

        function startDragFcn(varargin)

            set(fig, 'WindowButtonMotionFcn', @draggingFcn);

        end

        function draggingFcn(varargin)

            point = get(plotAxes, 'CurrentPoint');

            xValues = [xValues; point(1, 1)];
            yValues = [yValues; point(1, 2)];

            set(tracing, 'XData', xValues);
            set(tracing, 'YData', yValues);


        end


        function stopDragFcn(varargin)

            set(fig, 'WindowButtonMotionFcn', '');

        end

end

Также возможно убрать вызов scatter() и подставить в вызов plot(). Я считаю, что это будет в большей степени соответствовать тому, что требуется для нанесения поверх изображения:

function traceVelocityCurve()

    fig = figure;

    plotAxes = axes('Xlim', [0, 1], 'Ylim', [0 1], 'ButtonDownFcn', @startDragFcn);
    hold all

    xValues = [];
    yValues = [];


    set(fig, 'WindowButtonUpFcn', @stopDragFcn);

        function startDragFcn(varargin)

            set(fig, 'WindowButtonMotionFcn', @draggingFcn);

        end

        function draggingFcn(varargin)

            point = get(plotAxes, 'CurrentPoint');

            xValues = [xValues; point(1, 1)];
            yValues = [yValues; point(1, 2)];

            plot(xValues, yValues, 'Color', 'red');


        end


        function stopDragFcn(varargin)

            set(fig, 'WindowButtonMotionFcn', '');

        end

end

Однако, если я попытаюсь сначала импортировать изображение и установить его в качестве фона рисунка, а затем попытаться отследить / построить поверх этого изображения на том же рисунке, я не смогу это сделать. Например, следующий код правильно отображает изображение на заднем плане моей фигуры, но я теряю свою функцию трассировки (когда я щелкаю и перетаскиваю фигуру, ничего не отображается):

function traceVelocityCurve()

    fig = figure;

    plotAxes = axes('Xlim', [0, 1], 'Ylim', [0 1], 'ButtonDownFcn', @startDragFcn);
    loadedImage = imread('index.jpg');
    image(loadedImage, 'Parent', plotAxes);

    hold all

    xValues = [];
    yValues = [];


    set(fig, 'WindowButtonUpFcn', @stopDragFcn);

        function startDragFcn(varargin)

            set(fig, 'WindowButtonMotionFcn', @draggingFcn);

        end

        function draggingFcn(varargin)

            point = get(plotAxes, 'CurrentPoint');

            xValues = [xValues; point(1, 1)];
            yValues = [yValues; point(1, 2)];

            plot(xValues, yValues, 'Color', 'red');


        end


        function stopDragFcn(varargin)

            set(fig, 'WindowButtonMotionFcn', '');

        end

end

Заранее спасибо за вашу помощь!

1 ответ

Решение

Добавив изображение в ваши оси, вы сделали так, чтобы вы больше не могли нажимать на оси. Когда вы нажимаете, изображение получает событие, но оси больше не делают.

Тем не менее, фигура всегда получает событие также. Установить фигуру 'WindowButtonDownFcn' на ваш startDragFcnи это будет работать:

function traceVelocityCurve()
    fig = figure;
    plotAxes = axes('Xlim', [0, 1], 'Ylim', [0 1]);
    % ...
    set(fig, 'WindowButtonDownFcn', @startDragFcn);
    set(fig, 'WindowButtonUpFcn', @stopDragFcn);
    % ...
Другие вопросы по тегам