2

我真的希望这不是我错过的一些愚蠢的小东西,但我已经尝试了几个小时来解决这个问题,但没有取得任何进展。基本上,我创建了一个带有 3 个子图的图形。为了简洁起见,我制作了一个设置绘图的函数,然后我创建了另一个函数,它使用实时数据不断更新绘图。

问题是,在实时更新功能中,第三个子图工作得很好,但现在我希望我的第二个子图也能实时更新,我还没有完成。出于某种原因,每当我输入代码以访问第二个情节时,它都会不断更新第三个情节并直接覆盖它!与此同时,第二个情节保持在它的初始状态......

这是代码......我已经查看了十亿次,所以我现在不知所措,我不知道还能做什么......就像我说的那样真的希望它不是什么愚蠢的大声笑......谢谢一堆=)。

编辑:出错的部分从它说“%refresh plot

实时绘图功能

function [  ] = EndoSliceViewerJP( Naviparam,  DICOMparam)
%RGBparam should be included later - add +1 to nargin values 

%visualizes: 
%1st: RGB camera Live view 
%2nd: Orientation and Position of Navigation System
%3rd: DICOM Slice relative to navigated Endoscope in a and its orientation
%in a Slice perpendicular to the endoscope
%assumes Navigation system running with referenced tool (Naviparam.tool=4 or Naviparam.tool=5)

%currently this plots slices according to Endoscope position, could add
%vector in plot that shows orientation of the scope...
disp('Endo Slice Viewer');
disp('" ": exit on space key');
global kpressed;
kpressed = 0;

global Fig
Fig=EndoSliceViewer_createFigure(1);
set(Fig.fig,'KeyPressFcn','global kpressed; global Fig; kpressed = get(Fig.fig,''CurrentChar'');');

%create matrices and filter for smoothing of Endo Slice Data
xrel=-(ones(Fig.resolEndoSlice,1)*(1:Fig.resolEndoSlice)-Fig.resolEndoSlice/2);
yrel=-(ones(Fig.resolEndoSlice,1)*(1:Fig.resolEndoSlice)-Fig.resolEndoSlice/2);
SLimage=zeros(Fig.resolEndoSlice,Fig.resolEndoSlice);
PosVec=zeros(Fig.resolEndoSlice,Fig.resolEndoSlice,3);
gfilt = fspecial('gaussian',5,1.5);
depth = 50;


exitflag = 0;
while (exitflag == 0)
     %check on keyboard input
     if kpressed ~= 0
        switch kpressed
            case 'r'
                depth=depth+2
            case 'f'
                depth=depth-2
            case ' '
                exitflag = 1;
                disp('**** Exit Endo Slice Viewer ****')

        end
        kpressed = 0;
     end

if (nargin>=1) %Naviparam is passed - update Navigation View
     %capture new navigation data
     Naviparam=Navi_acquire(Naviparam);
     Naviparam=Navi_calc_data(Naviparam);

     %refreshN avigation View
     %NOT YET IMPLEMENTED: UPDATE NAVIGATION PLOT 

     if (nargin==2) %DICOMparam is also passed - update EndoSlice View
         EndoVecX=inv(DICOMparam.calib.navi2dicom(1:3,1:3))*inv(Naviparam.data.Endo_RefHomMat(1:3,1:3))*[1;0;0];
         EndoVecY=inv(DICOMparam.calib.navi2dicom(1:3,1:3))*inv(Naviparam.data.Endo_RefHomMat(1:3,1:3))*[0;1;0];
         EndoVecZ=inv(DICOMparam.calib.navi2dicom(1:3,1:3))*inv(Naviparam.data.Endo_RefHomMat(1:3,1:3))*[0;0;-1];
         EndoVecX=EndoVecX/norm(EndoVecX);
         EndoVecY=EndoVecY/norm(EndoVecY);
         EndoVecZ=EndoVecZ/norm(EndoVecZ);
         mask=ones(Fig.resolEndoSlice,Fig.resolEndoSlice);
         S=[DICOMparam.Sx; DICOMparam.Sy; DICOMparam.Sz];

         DICOMPos = DICOMparam.calib.navi2dicom*[Naviparam.data.Endo_RefOffsetPosVec;1];

         for i=1:3
             %Point on Plane defined by Endo Position plus distance*Viewing direction vector
             PosVec(:,:,i)=(DICOMPos(i)+depth*EndoVecZ(i))+xrel*EndoVecX(i)+yrel*EndoVecY(i);
             %limit positions to integer values inside DICOM data cube
             PosVec(:,:,i)=round(PosVec(:,:,i));
             PosVec(:,:,i)=min(max(PosVec(:,:,i),1),S(i));
             %create mask to set Points outside the data cube to 0
             mask=double(PosVec(:,:,i)>1).*double(PosVec(:,:,i)<S(i).*mask(:,:));
         end
         %access data cube via indexed labelling
         XposTemp=PosVec(:,:,1); YposTemp=PosVec(:,:,2); ZposTemp=PosVec(:,:,3);
         indexTemp=sub2ind(size(DICOMparam.Vd), XposTemp(:), YposTemp(:),ZposTemp(:));
         SLimage(:)=DICOMparam.Vd(indexTemp(:));

         SLimage=SLimage.*mask;
         SLimage=imfilter(SLimage,gfilt);

         %refresh plot
         set(Fig.sub3im, 'cdata', SLimage);
         hold on;
         Fig.sub2im=plot3(PosVec(1),PosVec(2),PosVec(3),'b*',PosVec(1)+depth*EndoVecZ(1),PosVec(2)-depth*EndoVecZ(2),PosVec(3)+depth*EndoVecZ(3),'r*');
         hold off;
     end
end

%RGBparam is always passed - update RGB camera View
%capture new RGB data
%handles.RGBparam=RGB_acquire(handles.RGBparam);
%refresh RGB camera View
%set(Fig.sub1im, 'CData', imresize(handles.RGBparam.image,[Fig.resolEndoRGB(1) Fig.resolEndoRGB(2)]));  


drawnow;
end

close(Fig.fig);
clear global;


end

这是我设置情节的功能

function [Fig] = EndoSliceViewer_createFigure(Figindex)
%This function creates and returns a Figure object to visualizes DICOM data
%in the plane orthogonal to the endoscopic view, the RGB view of the camera
%and the orientation of the navigation

%set resolution for Endo Slice Plot
Fig.resolEndoSlice=300; 
Fig.resolEndoRGB=[720 1280]; 
Fig.resolEndoNavi=[500 500 500]; 

%init figure on screen
Fig.fig=figure(Figindex); gcf;
set(Fig.fig,'Position',[50 500 1500 500],'Name','Endo Slice Viewer');
%set(Fig.fig,'KeyPressFcn','global kpressed; global Fig; kpressed = get(Fig.fig,''CurrentChar'');');

Fig.sub1=subplot(1,3,1);
Fig.sub1im=image(uint8(zeros(Fig.resolEndoRGB(1), Fig.resolEndoRGB(2),3)));
title('Endo Camera View');
daspect([1 1 1]);

Fig.sub2=subplot(1,3,2);
Fig.BoxX=[0;1;1;0;0;0;1;1;0;0;1;1;1;1;1;0;0]*Fig.resolEndoNavi(1);
Fig.BoxY=[0;0;1;1;0;0;0;1;1;1;1;1;0;0;0;0;1]*Fig.resolEndoNavi(2);
Fig.BoxZ=[0;0;0;0;0;1;1;1;1;0;0;1;1;0;1;1;1]*Fig.resolEndoNavi(3);
Fig.sub2im=plot3(Fig.BoxX,Fig.BoxY,Fig.BoxZ);
title('Navigation View');
xlim([-0.2*Fig.resolEndoNavi(1),  1.2*Fig.resolEndoNavi(1)]);
ylim([-0.2*Fig.resolEndoNavi(2),  1.2*Fig.resolEndoNavi(2)]);
zlim([-0.2*Fig.resolEndoNavi(3),  1.2*Fig.resolEndoNavi(3)]);
xlabel('X [vox]');
ylabel('Y [vox]');
zlabel('Z [vox]');
daspect([1 1 1]);

Fig.sub3=subplot(1,3,3);
Fig.sub3im=imagesc(zeros(Fig.resolEndoSlice, Fig.resolEndoSlice));
title('Endo Slice View');
xlim([0 Fig.resolEndoSlice]);
ylim([0 Fig.resolEndoSlice]);
xlabel('Xendo [vox]');
ylabel('Yendo [vox]');
daspect([1 1 1]);
colormap bone
drawnow;

%potentially: add subplot for navigation position display later
end
4

1 回答 1

2

在绘制任何内容之前,您需要将第二个子图设置为当前轴。您可以axes(Fig.sub2)在绘图命令之前使用。

于 2013-07-22T15:18:45.513 回答