Рисование кругов / квадратов на изображении, где пользователь указывает - PullRequest
0 голосов
/ 03 февраля 2011

У меня есть графический интерфейс в MATLAB, созданный с использованием guide.Пока пользователь может импортировать изображение и сохранить изображение.Мой следующий шаг - позволить пользователю щелкнуть по изображению, чтобы поместить круг / квадрат, неважно, какой из них легче реализовать.В идеале я хотел бы сделать так, чтобы последний созданный объект был отменен, но базовая реализация имеет первостепенное значение.

Я предполагаю, что для реального рисования круга, который будет хорошо использовать PLOT, как упоминалось в нескольких других вопросах,То, в чем я не уверен, так это то, как я могу получить местоположение на изображении щелчка мышью, чтобы затем разместить УЧАСТОК в этом месте.


РЕДАКТИРОВАТЬ: Вот основной фрагмент кода, который у меня есть для рабочих частей на данный момент.

function V1Open_Callback(hObject, eventdata, handles)
% hObject    handle to V1Open (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
hMainGui = getappdata(0, 'hMainGui');
fileName = uigetfile('*.jpg');
setappdata(hMainGui, 'fileName', fileName);
updateAxes1

function updateAxes1
hMainGui = getappdata(0, 'hMainGui');
fileName = getappdata(hMainGui, 'fileName');
imshow(imread(fileName))

% --- Executes on button press in V1Save.
function V1Save_Callback(hObject, eventdata, handles)
% hObject    handle to V1Save (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
imsave;

Ответы [ 3 ]

3 голосов
/ 07 ноября 2012

Этот вопрос немного устарел, но вы можете просто сделать это, предполагая, что hAxes - это ручка осей вашего изображения:

Radius=0.5;
xy1 = get(hAxes,'Currentpoint');
x1 = xy1(1,1);
y1 = xy1(1,2);
Rec=rectangle('Position',[x1-Radius,y1-Radius,2*Radius,2*Radius],'Curvature',[1,1],'HitTest','off');

Вы можете изменить радиус на любое значение. Функция get (hAxes, 'Currentpoint') возвращает последнее место, где вы щелкнули относительно ваших осей. 'кривизна', установленная в 1,1, делает прямоугольник кругом ... 0,0, конечно, будет прямоугольником.

редактировать: опечатка

2 голосов
/ 04 февраля 2011

Вы знакомы с [x, y] = ginput?Это основная функция, позволяющая получить положение, в котором пользователь щелкнул мышью.Более подробную информацию можно найти, например, здесь .

Вы также можете показать нам свой текущий код, чтобы мы могли более конкретно ответить на ваш вопрос!

0 голосов
/ 04 февраля 2011

Я использую функции набора инструментов обработки изображений, такие как imellipse и imrect, чтобы сделать это:

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

% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
axes(handles.axes1);
if (isfield(handles, 'ellipse'))
    delete(handles.ellipse);
end
handles.ellipse = imellipse();
handles.eps = getPosition(handles.ellipse);
guidata(hObject, handles);
...