2013-07-22 51 views
2

我真的很希望这不是一个愚蠢的小东西,我失踪了,但我一直试图找出这个东西了几个小时了,并没有取得任何进展。基本上,我创建了一个有3个子图的图。为了整洁,我设定了一个功能,然后我制作了另一个不断更新实时数据的功能。MATLAB不断更新错误的图形

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

这是代码...我已经看了十亿次,所以我现在处于亏损状态,我不知道是什么别人要做....就像我说的真的希望它不是愚蠢的大声笑...谢谢一堆=)。

编辑:这是怎么回事错误开始的部分地方说:“%刷新情节

实时绘图功能

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 

回答

2

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

+0

HMMMM有趣... freakin MATLAB。哈哈jk我应该责怪自己,谢谢它的作品=) – spaderdabomb