Этот пример показывает, что шаги должны создать инструмент измерения с тремя точками с помощью ROI Ломаной линии
Отобразите изображение и ломаную линию под прямым углом. Мы хотим предложить пользователю управлять ломаной линией, чтобы измерить углы интереса.
im = imread('gantrycrane.png'); % Display image in the axes imshow(im) % Get size of image m = size(im,1); n = size(im,2); % Get center point of image for initial positioning midy = ceil(m/2); midx = ceil(n/2); % Position first point vertically above the middle firstx = midx; firsty = midy - ceil(m/4); lastx = midx + ceil(n/4); lasty = midy; % Add empty context menu to replace default menu c = uicontextmenu; % Create a two-segment right-angle polyline centered in the image h = drawpolyline('Parent',gca,... 'Position',[firstx,firsty;midx,midy;lastx,lasty],... 'Label','Modify angle to begin...',... 'Color',[0.8,0.2,0.2],... 'UIContextMenu',c); % Listen to event that fires as the ROI is being moved addlistener(h,'MovingROI',@(src,evt) updateAngle(src,evt)); % Intercept attempts to add or remove vertices addlistener(h,'AddingVertex',@(src,evt) storePositionInUserData(src,evt)); addlistener(h,'VertexAdded',@(src,evt) recallPositionInUserData(src,evt)); addlistener(h,'DeletingVertex',@(src,evt) storePositionInUserData(src,evt)); addlistener(h,'VertexDeleted',@(src,evt) recallPositionInUserData(src,evt));
Когда пользователь изменяет ломаную линию, мы хотим повторно вычислить угол и обновить отображенную метку.
function updateAngle(src,evt) % Get the current position p = evt.CurrentPosition; % Find the angle v1 = [p(1,1)-p(2,1), p(1,2)-p(2,2)]; v2 = [p(3,1)-p(2,1), p(3,2)-p(2,2)]; theta = acos(dot(v1,v2)/(norm(v1)*norm(v2))); % Convert it to degrees angleDegrees = (theta * (180/pi)); % Update the Label to display the angle src.Label = sprintf('(%1.0f) degrees',angleDegrees); end
Ломаная линия позволяет пользователям добавлять и удалять вершины; однако, угловой инструмент измерения принимает, что существует только три вершины в любое время. Мы хотим добавить прослушиватели, чтобы прервать, когда пользователь пытается добавить или удалить вершину. В коллбэке для событий 'AddingVertex ' and DeletingVertex' вершина интереса еще не была добавлена или удалена. Мы будем, кэшировал текущее положение ломаной линии в свойстве UserData, и восстановите его в коллбэке для событий 'VertexAdded' и 'VertexDeleted'. Это предотвратит пользователя от интерактивного добавления или удаления вершин для ломаной линии.
function storePositionInUserData(src,~) % Before a vertex is added/removed, store the Position in the UserData % property src.UserData = src.Position; end function recallPositionInUserData(src,~) % Restore the previous Position to prevent users from adding/removing % vertices src.Position = src.UserData; end
addlistener
| drawpolyline
| images.roi.Polyline