2013-07-22 54 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