-
Notifications
You must be signed in to change notification settings - Fork 0
/
bubbleTrackerAuto.m
158 lines (119 loc) · 4.33 KB
/
bubbleTrackerAuto.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
function bubbleTrackerAuto(hObject, eventdata, handles)
currentIndex = getappdata(handles.figure1,'currentIndex');
noFrames = getappdata(handles.figure1,'finIndex');
centers = getappdata(handles.figure1,'centers');
radii = getappdata(handles.figure1,'radii');
%%
% Set up wait bar
h = waitbar(0,'Processing');
% This matrix holds all the links information
Links = [];
% Set up UnlinkedPool, LinkedPool, GivenUpPool logicals
% These are keeping track of whether it is linked to a bubble in the next
% frame
for i = 1:noFrames-1
UnlinkedPool{i} = ones(1,length(centers{i}));
AllUnlinked{i} = centers{i}(find(UnlinkedPool{i}),:);
LinkedPool{i} = zeros(1,length(centers{i}));
GivenUpPool{i} = zeros(1,length(centers{i}));
end
% Search parameters
R1 = str2num(get(handles.edit11,'String')); % search radius
R2 = str2num(get(handles.edit12,'String'));
D = str2num(get(handles.edit14,'String')); % distance travel in a frame
theta = str2num(get(handles.edit13,'String'))*(2*pi/360); % Angle at which bubble travels
plotOn = get(handles.checkbox4,'Value');
for frame = 1:noFrames-1
unlinkedBubbles = 1;
if plotOn
figure(2); cla;
end
while unlinkedBubbles
% Choose first unlinked bubble
beforeIndex = find(UnlinkedPool{frame},1); % index of bubble that will be searched for in next frame
bubble = AllUnlinked{frame}(1,:);
L = linspace(0,2.*pi,20);
xv = bubble(1) - D*cos(theta) + R1*cos(L).*cos(theta) - R2*sin(L).*sin(theta);
yv = bubble(2) - D*sin(theta) + R1*cos(L).*sin(theta) + R2*sin(L).*cos(theta);
if plotOn
figure(2);
viscircles(centers{frame+1}, radii{frame+1},'color','b');
hold on
plot(xv,yv)
plot([bubble(1),bubble(1)-D*cos(theta)],[bubble(2),bubble(2)-D*sin(theta)],'-x')
drawnow
end
xq = centers{frame+1}(:,1);
yq = centers{frame+1}(:,2);
[in,on] = inpolygon(xq,yq,xv,yv);
if numel(xq(in)) == 1 % Only one bubble in search radius
inIndex = find(in);
Links(end+1,:) = [frame, frame+1, beforeIndex,inIndex];
% Move bubble from unlinked pool to linked
UnlinkedPool{frame}(beforeIndex) = 0;
LinkedPool{frame}(beforeIndex) = 1;
else
% Move bubble from unlinked pool to given up
UnlinkedPool{frame}(beforeIndex) = 0;
GivenUpPool{frame}(beforeIndex) = 1;
end
% update unlinked bubble
AllUnlinked{frame} = centers{frame}(find(UnlinkedPool{frame}),:);
% Calc number of bubbles left for frame
numberLeft = length(AllUnlinked{frame});
fprintf('Bubble left %i for frame %i\n',numberLeft,frame)
if numberLeft == 0
unlinkedBubbles = 0;
end
end
waitbar(frame/(noFrames-1),h)
end
%% Make tracks from links
Tracks = zeros(1,noFrames);
for i = 1:size(Links,1)
beforeFrame = Links(i,1);
afterFrame = Links(i,2);
beforeIndex = Links(i,3);
afterIndex = Links(i,4);
% search Tracks for tracks that contain bubble 1
TracksFrame = Tracks(:,beforeFrame);
TrackIndex = find(TracksFrame==beforeIndex);
if isempty(TrackIndex)
% make new track
Tracks(end+1,:) = zeros(1,noFrames);
Tracks(end,beforeFrame) = beforeIndex;
Tracks(end,afterFrame) = afterIndex;
else
% Add to existing track
Tracks(TrackIndex,beforeFrame) = beforeIndex;
Tracks(TrackIndex,afterFrame) = afterIndex;
end
end
TrackX =[];TrackY=[];
for TrackNum = 1:size(Tracks,1)
for i = 1:noFrames
if Tracks(TrackNum, i) ~= 0
TrackX(i,TrackNum) = centers{i}(Tracks(TrackNum ,i),1);
TrackY(i,TrackNum) = centers{i}(Tracks(TrackNum ,i),2);
end
end
end
% Save data to app data
setappdata(handles.figure1,'Tracks',Tracks)
setappdata(handles.figure1,'Links',Links)
setappdata(handles.figure1,'TrackX',TrackX)
setappdata(handles.figure1,'TrackY',TrackY)
% Set plot tracks checkbox on
set(handles.checkbox5,'Value',1)
% Update image
updateImage(hObject, eventdata, handles)
close(h)
%% Display
disp('Success!')
% for i = 1:noFrames-1
% disp(length(find(GivenUpPool{i})))
% end
% for i = 1:noFrames-1
% disp(length(find(LinkedPool{i})))
% end
end