Ginput not recognising the enter key

I'm using ginput to plot coordinates on an image, and saving these coordinates in a variable to use elswhere. I've tried to make it so if I make a mistake when clicking points on the image, I can press the backspace key to delete the last point that was clicked.
Pressing any key other than a left click or the backspace key should lead to the image closing and the while loop ending, but if I press the Enter key, ginput doesn't recognise it as a key, so it leads to an error where "button" can't be indexed. Other keys seem to be recognised and work properly.
Not sure why it's happening, hoping it might be something obvious, any help would be much appreciated. Any other critisisms of the code are also welcome, I'm still learning!
ant = imread("ant.jpg");
imshow(ant) % display image
hold on % hold axes for plotting
% enable ONLY zooming and panning, avoid data tips
ax = gca;
ax.Interactions = [panInteraction zoomInteraction];
enableDefaultInteractivity(ax) % enable interactions
% plot coordinates on image and save in variable
n = 0;
while true
[x, y, button] = ginput(1);
% if button isn't left click or a backspace key, close image and end
if button(1) ~= 1 && button(1) ~= 8;
disp(button(1))
disp("No left mouse click or backspace, closing figure")
close all, break, end;
if ~isempty(x) && button == 1 % if left mouse click, save coordinate + plot on image
n = n+1;
x_coord(n,:) = x(1); % save x coordinate
y_coord(n,:) = y(1); % save y coordinate
p(n) = plot(x, y, "yo","markersize",10); % plot coordinates as you draw
% else if backspace key pressed, delete the last coordinate
elseif ~isempty(x) && button == 8;
if n>1
delete(p(n)); % Remove last plotted point
p(n) = [];
x_coord(end) = ["Deleted"]; % appears as NaN, text irrelevant
y_coord(end) = ["Deleted"];
end
else
end
end
end

 Respuesta aceptada

Adam Danz
Adam Danz el 5 de Mayo de 2021
> if I press the Enter key, ginput doesn't recognise it as a key
From the documentation, "Press the Return key to stop before all n points are selected."
"Enter" is the same as "Return". When Enter/Return is pressed, 'button' will be empty ([]).
This is where your 'else' comes in...
if ~isempty(x) && button == 1 % if left mouse click, save coordinate + plot on image
.
.
.
% else if backspace key pressed, delete the last coordinate
elseif ~isempty(x) && button == 8;
.
.
.
else % <------ EMPTY
end

4 comentarios

BC
BC el 5 de Mayo de 2021
Editada: BC el 5 de Mayo de 2021
Thank you! That makes sense now. I've removed the empty "else", and added this line as the first "if" statement. Seems to be working ok now, closes properly with no error given.
if isempty(button) == 1, close all; break; end % added in this line
Adam Danz
Adam Danz el 5 de Mayo de 2021
Editada: Adam Danz el 5 de Mayo de 2021
You could have added the close and break commands in the -else- section but your condition works, too.
I would organize the conditions like this
if isempty(button)
close all; break
elseif button == 1
elseif button == 8
else % button(1) ~= 1 && button(1) ~= 8;
end
Also, do you really want to use close all? What if a user has other figures open? Instead, use figure handles to delete specific figures.
BC
BC el 5 de Mayo de 2021
Thanks for the advice; I'm going to restructure it tomorrow with your example.
In this case I check the same image twice, and I'm often testing things out in other scripts, so I thought using close all would declutter my workspace a bit in case I've left something up by accident! But if I were to close specific ones, would I need to name the figure first? E.g.:
ant_figure = figure;
imshow(ant)
close ant_figure;
Yes, you would need the figure handle as you have demonstrated. You can also close a vector of handles if you have multiple figures.
f1 = figure();
f2 = figure();
f3 = figure();
close([f1,f2,f3])

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Display Image en Centro de ayuda y File Exchange.

Productos

Versión

R2020b

Preguntada:

BC
el 5 de Mayo de 2021

Comentada:

el 5 de Mayo de 2021

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by