Plot sequence of images on top of a trajectory

조회 수: 4 (최근 30일)
L
L 2024년 4월 3일
편집: DGM 2024년 4월 4일
I have a a 3D array G that has frames of a ball moving. I also have a variable named traj, that gives me the coordinates of the trajectory of the ball (traj.x and traj.y ). The arrays are attached.
I need to plot the frames on top of the trajectory. As if the trajectory is the background of the frames.
If you use sliceViewer(G) you will see the movement. I just want the trajectory to be the background of this movement.
I don't know even how to start.
Any ideas?

채택된 답변

DGM
DGM 2024년 4월 3일
편집: DGM 2024년 4월 3일
Here's a start. Note that the alignment is just guesswork on my part. Also, I don't know why there's a frame offset between the image and the xy data.
load G.mat
load traj.mat
alph = 0.5; % scalar FG opacity
nframes = 100;
frameoffset = 2; % the image appears to be 2 frames ahead of the plot data?
% set up the figure
hp = plot(traj.x,traj.y,'-o'); hold on
hi = image(uint8(G(:,:,1))); hold on % need to reassert hold
hi.XData = [-92 85.6]; % these are estimates
hi.YData = [81.1 -87];
xlim([-50 50])
ylim([-50 50])
set(gca,'ydir','normal','dataaspectratio',[1 1 1])
colormap(gray(256))
grid on
% run the loop
for f = 1+frameoffset:nframes
% update the plot data
hp.XData = traj.x(1:f);
hp.YData = traj.y(1:f);
% update the image data and reassert
hi.CData = uint8(G(:,:,f-frameoffset));
hi.AlphaData = (G(:,:,f-frameoffset)<128)*alph;
drawnow();
pause(0.1) % wait
end
If you don't have some sort of spatial calibration data, I can show you how I got the estimates that I used. It'd probably be best if you didn't have to resort to doing what I did.
  댓글 수: 2
L
L 2024년 4월 4일
Hi @DGM, thanks so much.
I don't have any clibration data. Can you walk me through the estimates?
DGM
DGM 2024년 4월 4일
편집: DGM 2024년 4월 4일
This is how I did it:
load G.mat
load traj.mat
nframes = 100;
% get centroid positions for all frames
xy = zeros(nframes,2);
for f = 1:nframes
S = regionprops(G(:,:,f)<128,'centroid');
xy(f,:) = S.Centroid;
end
% select only the segments where the two sequences correspond
xy0 = [traj.x; traj.y].';
xy0t = xy0(3:end,:); % trimmed traj data
xyt = xy(1:end-2,:); % trimmed centroid data
% get the fit parameters
f1 = fit(xyt(:,1),xy0t(:,1),'poly1')
f1 =
Linear model Poly1: f1(x) = p1*x + p2 Coefficients (with 95% confidence bounds): p1 = 3.626 (3.612, 3.641) p2 = -95.73 (-96.13, -95.32)
f2 = fit(xyt(:,2),xy0t(:,2),'poly1')
f2 =
Linear model Poly1: f2(x) = p1*x + p2 Coefficients (with 95% confidence bounds): p1 = -3.431 (-3.444, -3.418) p2 = 84.54 (84.19, 84.88)
% these are the ranges used for hi.XData and hi.YData
xdrange = [1 size(G,2)]*f1.p1 + f1.p2
xdrange = 1x2
-92.0992 85.5811
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
ydrange = [1 size(G,1)]*f2.p1 + f2.p2
ydrange = 1x2
81.1059 -87.0186
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
If you don't have CFT, you can just use polyfit() instead of fit():
f1 = polyfit(xyt(:,1),xy0t(:,1),1);
f2 = polyfit(xyt(:,2),xy0t(:,2),1);
xdrange = [1 size(G,2)]*f1(1) + f1(2)
xdrange = 1x2
-92.0992 85.5811
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
ydrange = [1 size(G,1)]*f2(1) + f2(2)
ydrange = 1x2
81.1059 -87.0186
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Computer Vision with Simulink에 대해 자세히 알아보기

제품

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by