0

imshow()GUIDE で生成された GUI には、GUI の初期化時にビットマップを挿入する Axes オブジェクトがあります。次のように定義された WindowButtonMotion コールバックがあります。

function theGui_WindowButtonMotionFcn(hObject, eventdata, handles)
  % handles.mode_manager is initialized in the gui startup code
  if (isempty(handles.mode_manager.CurrentMode))
    obj_han=overobj('axes');
    if ~isempty(obj_han)
      set(handles.theGui, 'Pointer','cross');
    else
      set(handles.theGui, 'Pointer','arrow');
    end
  end
end

これを行うツールバーのファイルを開くボタンにコールバックがあります。

function openFile_ClickedCallback(hObject, eventdata, handles)
  % handles.image_handle received the handle from the imshow that 
  % opened the initial image
  tmp_handle = handles.image_handle;
  [name, path] = uigetfile({'*.bmp'; '*.jpg'});
  if (path == 0)
    return
  else
    filename = strcat(path, name);
  end

  % read the image into the axes panel
  hold on
  handles.image_handle = imshow(filename);
  set(handles.image_handle, 'ButtonDownFcn', @imageMouseDown);
  handles.mode_manager = uigetmodemanager();
  delete(tmp_handle);
  guidata(hObject, handles);
end

新しいイメージが GUI の Axes オブジェクトに表示された後、ポインターは Axes オブジェクト上のクロスに変わりません。この問題は、新しく表示された画像に関係しています。実際に新しい画像を表示するコードの部分をコメント アウトすると、openFile コールバックを呼び出した後にポインターが十字として表示されるためです。

4

1 に答える 1

1

imshow使用すると軸オブジェクトが置き換えられる ため、コールバックは機能しなくなります。

次のコードは、問題を示しています。

imshow(zeros(100));
h = gca;
h.UserData = 123;  %Set UserData property value to 123
imshow(ones(100)); %Use imshow again.
h2 = gca;

今:

h2.UserData

ans =

     []

h.UserData
Invalid or deleted object.

ご覧のとおり、imshow再度使用すると、axes オブジェクトが新しい axes オブジェクトに置き換えられました。


次の例では、軸を変更せずにイメージ データのみを変更します。

image_handle = imshow(zeros(100));
h = gca;
h.UserData = 123;  %Set UserData property value to 123
%imshow(ones(100), 'Parent', h); %Use imshow again.
image_handle.CData = ones(100); %Modify only image data, without modifying the axes. 
h2 = gca;

今:

h2.UserData

ans =

   123

handles.image_handle = imshow(filename);コードを次のように変更します。

I = imread(filename);
handles.image_handle.CData = I;
于 2016-09-10T08:39:20.830 に答える