2013-07-23 251 views
0

我在更新我的圖時遇到問題。基本上,我有一個函數可以創建一個包含3個子圖的圖。然後我有另一個運行創建圖形函數的函數,然後更新圖形。更新很重要,所以我不會在每個循環創建一個新圖形,因爲它是3d數據,需要一段時間才能加載。MATLAB set('XData'....)

問題在於我的第二個副劇。我使用slice()加載3個圖像(3個切片),然後還想繪製一個位置矢量。我首先將位置向量設置爲(0,0,0),然後我想我可以通過將'XData','YData'...設置爲它們各自的值來更新我的循環。由於某種原因,它不能正常工作,並正在爲'double'類型的輸入參數 吐出錯誤「Undefined function'XData'」。請幫忙,下面是代碼,謝謝!

注意 - 誤差後「刷新%暗算」

初始劇情

function [Fig] = EndoSliceViewer_createFigure(Figindex,DICOMparam) 
%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.sub2im=plot3(0,0,0); 
h=slice(DICOMparam.Vd,DICOMparam.Cx,DICOMparam.Cy,DICOMparam.Cz); 
colormap bone; 
set(h,'FaceColor','interp',... 
    'EdgeColor','none',... 
    'DiffuseStrength',.8) 
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 

更新劇情

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,DICOMparam); 
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]; 
     disp(Naviparam.data.Endo_RefHomMat(1:3,1:3)); 
     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); 
    axes(Fig.sub2); 
    set(lineseries, 'XData', DICOMPos(1), 'YData', DICOMPos(2), 'ZData', DICOMPos(3)); 
    set(lineseries, 'Marker', '*', 'Color', 'b'); 
    disp(DICOMPos); 
    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 

回答

2

函數set被稱爲以下面的方式

set(ObjectHandle, 'PropertyName_1', PropertyValue_1, 'PropertyName_2', PropertyValue_2); 

增加更多的名稱 - 值對作爲配合。你的情況,這將是

set(LineHandle, 'XData', DICOMPos(1), 'YData', DICOMPos(2), 'ZData', DICOMPos(3)); 

改變位置數據。請注意,所有這些屬性都屬於該行,而不屬於座標軸,因此您需要爲正在更新的行獲取句柄。假設軸只包含一條線,這可以通過在循環之前添加該代碼來完成的ad-hoc:

LineHandle = findobj(Fig.sub2, 'type', 'line'); 

而且,你不能改變線型這樣:set(LineHandle, 'b*')。這是錯誤「無效的參數/值對參數」的原因。

首先,您需要每個屬性值之前的屬性名稱,其次,實際上沒有線型的屬性名稱。你必須單獨改變顏色和標記,例如這樣的:

set(LineHandle, 'Marker', '*', 'Color', 'b'); 
+0

更改顏色和標記類型沒有工作...它現在給我一個錯誤錯誤使用集 找到無效的屬性。 對象名稱:軸 屬性名稱:'標記'。 EndoSliceViewerJP(line 89) set(Fig.sub2,'Marker','*','Color', 'b'); – spaderdabomb

+0

我編輯我的代碼,以顯示我目前有什麼....但如果我正確理解你......它仍然給我這個錯誤錯誤使用hg.axes /設置 名稱'XData'不是一個可訪問的屬性 爲類'軸'的一個實例。 – spaderdabomb

+0

好的,謝謝你我現在已經接近完成了。我再次更新了自己的代碼....很抱歉打擾你太多了,我感覺我正在按分鐘= p變得麻木,但現在它無法更新我的情節。它只是在初始圖中指定的(0,0,0)處粘貼一顆藍星,並且不會將xdata等設置到正確的位置。我顯示了我的數據以確保它正在改變,而且是。絕對不是(0,0,0) – spaderdabomb

0
在於更新繪圖功能

錯誤是告訴你,你在某處使用XData就像一個函數,你沒有這個功能。當您致電

XData(DICOMPos(1)) 

您正在爲Y和Z數據做同樣的事情。這不是你如何使用該功能。我猜你正在編輯別人的代碼?您想要將哪些數據替換爲軸? DICOMPos(1)?

+0

是和是的,同樣,如果我拿出XDATA()並且只有DICOMPos(1)....那麼我得到錯誤「Invalid parameter/value pair arguments。」。 – spaderdabomb

-1

的原因,這個代碼是錯得有點棘手......或者我預想的方式至少不會。我試圖訪問Fig.sub2來定義Fig.sub2im的軸,而不是直接訪問Fig.sub2im。我試圖爲Fig.sub2定義新的'XData'的原因是因爲Fig.sub2im MATLAB不斷告訴我句柄已被刪除或無效。這是因爲我的slice()在我的初始繪圖設置中覆蓋了我的plot3(),因此Fig.sub2im不再是我想要的。

要解決這個問題,我所要做的就是將Fig.sub2編輯到Fig.sub2im然後放置;在我的plot3之後。