проблема с ползунком и ButtonDownFcn в Matlab - PullRequest
0 голосов
/ 06 июля 2011

У меня проблема со Slider и ButtonDownFcn.

В настоящее время я показываю пользователю изображение в графическом интерфейсе (используя GUIDE), затем я позволяю им выбрать номерной знак, рисуя вокруг него прямоугольник.

Я добавил ползунок для поворота изображения в градусах.

Когда я поворачиваю изображение и затем нажимаю на него, изображение возвращается в исходное состояние (угол).

Что можно сделать, чтобы убедиться, что изображение остается на своем месте, а затем нарисовать на нем прямоугольник?

Это моя функция ButtonDownFcn:

function axes1_ButtonDownFcn(hObject, eventdata, handles)
global image  h 
imshow(image, []);
h = imrect;
setColor(h, 'black');

Это моя функция слайдера:

function slider2_Callback(hObject, eventdata, handles)
global image hImage
slider_value = get(handles.slider2,'Value');
axes(handles.axes1);
hImage = imshow(imrotate(image,slider_value,'bilinear'), 'Parent', handles.axes1);
set(hImage, 'ButtonDownFcn', @(s,e) axes1_ButtonDownFcn());

РЕДАКТИРОВАТЬ: теперь все работает нормальнои что более важно это понятно.последнее, что вы знаете, как я могу удалить числа из осей X и Y.Я попробовал с axes off, но это не помогло.

enter image description here

большое спасибо.

Ответы [ 2 ]

1 голос
/ 07 июля 2011

Я считаю, что легче учиться на примере.Итак, я продолжу пример, который я начал в вашем предыдущем вопросе .

Когда GUI запущен, отображается изображение, которое вы можете вращать с помощью ползунка.При нажатии на изображение выберите прямоугольную область интереса (вы можете продолжать вращать изображение внизу).После того, как все выполнено, дважды щелкните прямоугольник, и обрезанное изображение отобразится на других осях (одна обрезана от повернутого изображения, а другая от исходного изображения), а затем прямоугольник будет удален.

function rotationGUI2()
    %# setup GUI
    hFig = figure('menu','none', 'Position',[100 100 750 420]);
    hAx = axes('Parent',hFig, 'Units','pixels', 'Position',[50 70 350 300]);
    hAx1 = axes('Parent',hFig, 'Units','pixels', 'Position',[450 230 250 140]);
    hAx2 = axes('Parent',hFig, 'Units','pixels', 'Position',[450 70 250 140]);
    uicontrol('Parent',hFig, 'Style','slider', 'Value',0, 'Min',0,...
        'Max',360, 'SliderStep',[1 10]./360, ...
        'Position',[100 20 300 30], 'Callback',@slider_callback) 
    hTxt = uicontrol('Style','text', 'String','0', ...
        'Units','pixels', 'Position',[240 25 20 15]);

    %# read and show image
    I = imread('cameraman.tif');
    hImg = imshow(I, 'Parent',hAx);
    set(hImg, 'ButtonDownFcn',@image_ButtonDownFcn);  %# attach event listener

    %# Callback functions
    function slider_callback(hObj, eventdata)
        angle = round( get(hObj,'Value') );             %# rotation angle
        I_rot = imrotate(I, angle, 'bilinear', 'crop'); %# rotate image
        set(hImg, 'CData',I_rot)                        %# update image
        set(hTxt, 'String',num2str(angle))              %# update text
    end
    function image_ButtonDownFcn(hObj,eventdata)
        hRect = imrect(hAx);
        setColor(hRect, 'black');
        rectPos = wait(hRect);
        delete(hRect)

        I1 = imcrop(I, rectPos);                  %# crop from original image
        I2 = imcrop(get(hImg,'CData'), rectPos);  %# crop from rotated image
        imshow(I1, 'Parent',hAx1)
        imshow(I2, 'Parent',hAx2)
    end
end

enter image description here

Опять же, воссоздание примера с использованием рисунка, созданного GUIDE, должно быть аналогичным.HTH


EDIT

Ниже вы найдете похожий пример, созданный GUIDE.Как и прежде, вам нужно будет создать графический интерфейс и добавить компоненты путем перетаскивания.Используйте «Инспектор свойств», чтобы настроить их свойства по мере необходимости.Что еще более важно, дайте каждому уникальный Tag.Я использую:

  • imgAxis, cropAxis, processAxis
  • loadButton, processButton
  • angleSlider, angleText

GUIDE

Рекомендуется не использовать глобальные переменные, а хранить данные в структуре handles, которая передается функциям обратного вызова.Просто не забудьте вызвать функцию guidata в конце любого метода, который изменяет свои данные, чтобы зафиксировать изменения.

Для части, где вы вручную присоединяете обработчик к событию image ButtonDownFcn, вам следуеттакже передайте структуру handles в список аргументов.

Тем не менее, здесь код GUI (соответствующие части):

%# --- Executes just before untitled is made visible.
function untitled_OpeningFcn(hObject, eventdata, handles, varargin)
    %# store handles to figure, axes, and others
    handles.fig = hObject;
    handles.hAx = findobj(hObject, 'Tag','imgAxis');
    handles.hAxCrop = findobj(hObject, 'Tag','cropAxis');
    handles.hAxProcess = findobj(hObject, 'Tag','processAxis');
    handles.img = [];
    handles.hImg = [];
    handles.hImgCrop = [];

    %# disable interaction of some components until image is loaded
    set(findobj(hObject, 'Tag','angleSlider'), 'Enable','off')
    set(findobj(hObject, 'Tag','processButton'), 'Enable','off')

    %# Update handles structure
    guidata(hObject, handles);
end

%# --- Outputs from this function are returned to the command line.
function varargout = untitled_OutputFcn(hObject, eventdata, handles)
    varargout{1} = handles.fig;
end

%# --- Executes on slider movement.
function angleSlider_Callback(hObject, eventdata, handles)
    angle = round( get(hObject,'Value') );                    %# rotation angle
    I_rot = imrotate(handles.img, angle, 'bilinear', 'crop'); %# rotate image
    set(handles.hImg, 'CData',I_rot)                          %# update image
    set(findobj(handles.fig,'Tag','angleText'), 'String',num2str(angle))
end

%# --- Executes on button press in processButton.
function processButton_Callback(hObject, eventdata, handles)
    %# get cropped image
    I = get(handles.hImgCrop, 'CData');

    %# do some processing: here i'm simply detecting the edges
    if isrgb(I), I = rgb2gray(I); end
    %#BW = im2bw(I, graythresh(I));
    BW = edge(I, 'canny');

    %# show processed image
    imshow(BW, 'Parent',handles.hAxProcess)

    %# Update handles structure
    guidata(hObject, handles);
end

%# --- Executes on button press in loadButton.
function loadButton_Callback(hObject, eventdata, handles)
    %# get image file location
    [fName, fPath] = uigetfile(...
        {'*.psd;*.bmp;*.jpg;*.tif;*.png;*.gif','All Image Files'; ...
        '*.*','All Files' }, 'File Selector', ...
        fullfile(matlabroot,'toolbox','images','imdemos'));
    if fPath==0
        msgbox('No file selected', 'File Selector', 'error');
        return
    end

    %# read and show image
    handles.img = imread( fullfile(fPath,fName) );
    handles.hImg = imshow(handles.img, 'Parent',handles.hAx);

    %# attach handler
    set(handles.hImg, 'ButtonDownFcn',{@imgAxis_ButtonDownFcn,handles});

    %# reenable disabled components
    set(findobj(handles.fig, 'Tag','angleSlider'), 'Enable','on')

    %# Update handles structure
    guidata(hObject, handles);
end

%# --- Executes on mouse press over axes background.
function imgAxis_ButtonDownFcn(hObject, eventdata, handles)
    %# check if some image is shown
    if isempty(handles.hImg) || ~ishandle(handles.hImg)
        return
    end

    %# select ROI using a rectangle
    hRect = imrect(handles.hAx);
    setColor(hRect, 'black');
    rectPos = wait(hRect);
    delete(hRect)

    %# crop image from rotated image, and show it
    I = imcrop(get(handles.hImg,'CData'), rectPos);
    handles.hImgCrop = imshow(I, 'Parent',handles.hAxCrop);

    %# reenable disabled components
    set(findobj(handles.fig, 'Tag','processButton'), 'Enable','on')

    %# Update handles structure
    guidata(hObject, handles);
end

screenshot

Надеюсь, с этим все ясно

0 голосов
/ 06 июля 2011

В вашем axes1_ButtonDownFcn линия imshow(image, []); - это то, что показывает вам неповоротное изображение, когда вы нажимаете на него.Я думаю, удаление этой строки должно избавить вас от проблемы.Затем вы можете использовать gca, чтобы вместо этого получить управление вашими осями.Короче попробуйте это

function axes1_ButtonDownFcn(hObject, eventdata, handles)
global image  h 
h = imrect(gca);
setColor(h, 'black');
...