1 function filldemo(action,varargin);
\r
2 % OpenCV cvFloodFill function demo
\r
5 demoName = 'OpenCV FloodFill demo';
\r
7 action='InitializeDEMO';
\r
10 feval(action,varargin{:});
\r
15 %%% Sub-function - InitializeDEMO
\r
18 function InitializeDEMO()
\r
22 % If demo is already running, bring it to the foreground.
\r
23 h = findobj(allchild(0), 'tag', demoName);
\r
29 screenD = get(0, 'ScreenDepth');
\r
37 'Name',demoName, ...
\r
38 'NumberTitle','off', 'HandleVisibility', 'on', ...
\r
39 'tag', demoName, ...
\r
40 'Visible','off', 'Resize', 'off',...
\r
41 'BusyAction','Queue','Interruptible','off',...
\r
42 'IntegerHandle', 'off', ...
\r
43 'Doublebuffer', 'on', ...
\r
44 'Colormap', gray(grayres));
\r
46 %====================================
\r
47 % Information for all buttons (and menus)
\r
51 %====================================
\r
56 %frmLeft = 0.5-btnWid-1.5*frmBorder;
\r
57 frmLeft = 0.52 + frmBorder;
\r
58 frmWidth = 2*btnWid+3*frmBorder;
\r
59 frmHeight = btnHt+2*frmBorder;
\r
60 frmPos=[frmLeft frmBottom frmWidth frmHeight];
\r
62 'Parent', DemoFig, ...
\r
63 'BusyAction','Queue','Interruptible','off',...
\r
64 'Style','frame', ...
\r
65 'Units','normalized', ...
\r
66 'Position',frmPos, ...
\r
67 'BackgroundColor',[0.45 0.45 0.45]);
\r
69 %====================================
\r
72 callbackStr='filldemo(''Apply'')';
\r
73 yPos=frmBottom+frmBorder;
\r
74 applyHndl=uicontrol( ...
\r
75 'Parent', DemoFig, ...
\r
76 'BusyAction','Queue','Interruptible','off',...
\r
77 'Style','pushbutton', ...
\r
78 'Units','normalized', ...
\r
79 'Position',[frmLeft+frmBorder yPos btnWid btnHt], ...
\r
80 'String',labelStr, ...
\r
81 'Enable', 'off', ...
\r
82 'Callback',callbackStr);
\r
85 %====================================
\r
88 callbackStr='close(gcf)';
\r
90 closeHndl=uicontrol( ...
\r
91 'Parent', DemoFig, ...
\r
92 'BusyAction','Queue','Interruptible','off',...
\r
93 'Style','pushbutton', ...
\r
94 'Units','normalized', ...
\r
95 'Position',[frmLeft+btnWid+2*frmBorder yPos btnWid btnHt], ...
\r
96 'Enable', 'off', ...
\r
97 'String',labelStr, ...
\r
98 'Callback',callbackStr);
\r
100 c = get(DemoFig,'Color');
\r
101 if [.298936021 .58704307445 .114020904255]*c'<.5,
\r
107 %==================================
\r
108 % Set up the image axes
\r
109 figpos = get(DemoFig, 'position');
\r
110 row = figpos(4); col = figpos(3); % dimensions of figure window
\r
112 vertSpac = (row-330)/3;
\r
113 horSpac = (col-2*256)/3;
\r
114 hSrcAx = axes('Parent', DemoFig, ...
\r
115 'units', 'pixels', ...
\r
116 'BusyAction','Queue','Interruptible','off',...
\r
117 'ydir', 'reverse', ...
\r
118 'XLim', [.5 255.5], ...
\r
119 'YLim', [.5 255.5],...
\r
120 'CLim', [0 255], ...
\r
121 'XTick',[],'YTick',[], ...
\r
122 'Position', [horSpac row-vertSpac-256 256 256]);
\r
123 title('Source Image');
\r
125 hDstAx = axes('Parent', DemoFig, ...
\r
126 'units', 'pixels', ...
\r
127 'BusyAction','Queue','Interruptible','off',...
\r
128 'ydir', 'reverse', ...
\r
129 'XLim', [.5 255.5], ...
\r
130 'YLim', [.5 255.5],...
\r
131 'CLim', [0 255], ...
\r
132 'XTick',[],'YTick',[], ...
\r
133 'Position', [2 * horSpac + 256 row-vertSpac-256 256 256]);
\r
134 title('Destination Image');
\r
136 %==================================
\r
137 % Set up the images
\r
138 blank = repmat(uint8(0),256,256);
\r
139 hSrcImage = image('Parent', hSrcAx,...
\r
140 'CData', blank, ...
\r
141 'BusyAction','Queue','Interruptible','off',...
\r
142 'CDataMapping', 'scaled', ...
\r
143 'Xdata', [1 256],...
\r
144 'Ydata', [1 256],...
\r
145 'ButtonDownFcn', 'filldemo(''SeedPointUpdate'')', ...
\r
146 'EraseMode', 'none');
\r
148 hDstImage = image('Parent', hDstAx,...
\r
149 'CData', blank, ...
\r
150 'BusyAction','Queue','Interruptible','off',...
\r
151 'CDataMapping', 'scaled', ...
\r
152 'Xdata', [1 256],...
\r
153 'Ydata', [1 256],...
\r
154 'EraseMode', 'none');
\r
156 %==================================
\r
158 seedPoint = [128, 100];
\r
159 hSeedPoint = [line('Parent', hSrcAx, ...
\r
162 'UserData', seedPoint), ...
\r
163 line('Parent', hSrcAx, ...
\r
166 % 'EraseMode', 'xor', ...
\r
169 % rangePos = [64 3 280 15];
\r
170 rangePos = [0 .01 1 .05];
\r
171 hStatus = uicontrol( ...
\r
172 'Parent', DemoFig, ...
\r
173 'BusyAction','Queue','Interruptible','off',...
\r
174 'Style','text', ...
\r
175 'Units','normalized', ...
\r
176 'Position',rangePos, ...
\r
177 'Horiz','center', ...
\r
178 'Background',c, ...
\r
179 'Foreground',[.8 0 0], ...
\r
180 'Tag', 'Status', ...
\r
181 'String','Status bar');
\r
184 ctrHt = 19; % controls' height
\r
185 srcImgPos = get(hSrcAx, 'Position');
\r
186 %====================================
\r
187 % The New Value Edit
\r
188 pos = [srcImgPos(1) + srcImgPos(3) / 2 ...
\r
189 srcImgPos(2) - 2 * ctrHt srcImgPos(3) / 2 ctrHt];
\r
190 hNewValEdit=uicontrol( ...
\r
191 'Parent', DemoFig, ...
\r
192 'BusyAction','Queue','Interruptible','off',...
\r
193 'Style','edit', ...
\r
194 'Background','white', ...
\r
195 'Foreground','black', ...
\r
196 'Units','pixels', ...
\r
197 'Position',pos, ...
\r
198 'String','255', ...
\r
199 'Horiz', 'right',...
\r
200 'Tag','AppEdit', ...
\r
201 'UserData', [255], ...
\r
202 'Callback','filldemo(''ControlsUpdate'')');
\r
203 %====================================
\r
204 % The New Value Edit Label
\r
205 pos = [srcImgPos(1) ...
\r
206 srcImgPos(2) - 2 * ctrHt srcImgPos(3) / 2 ctrHt];
\r
208 'Parent', DemoFig, ...
\r
209 'BusyAction','Queue','Interruptible','off',...
\r
210 'Style','text', ...
\r
211 'Units','pixels', ...
\r
212 'Position',pos, ...
\r
213 'Horiz','left', ...
\r
214 'Background',c, ...
\r
215 'Foreground','black', ...
\r
216 'String','New Value:');
\r
218 %====================================
\r
220 pos = [srcImgPos(1) + srcImgPos(3) / 2 ...
\r
221 srcImgPos(2) - 3 * ctrHt srcImgPos(3) / 2 ctrHt];
\r
222 hLoDiffEdit=uicontrol( ...
\r
223 'Parent', DemoFig, ...
\r
224 'BusyAction','Queue','Interruptible','off',...
\r
225 'Style','edit', ...
\r
226 'Background','white', ...
\r
227 'Foreground','black', ...
\r
228 'Units','pixels', ...
\r
229 'Position',pos, ...
\r
231 'Horiz', 'right',...
\r
232 'Tag','AppEdit', ...
\r
233 'UserData', [1], ...
\r
234 'Callback','filldemo(''ControlsUpdate'')');
\r
235 %====================================
\r
236 % The loDiff Edit Label
\r
237 pos = [srcImgPos(1) ...
\r
238 srcImgPos(2) - 3 * ctrHt srcImgPos(3) / 2 ctrHt];
\r
240 'Parent', DemoFig, ...
\r
241 'BusyAction','Queue','Interruptible','off',...
\r
242 'Style','text', ...
\r
243 'Units','pixels', ...
\r
244 'Position',pos, ...
\r
245 'Horiz','left', ...
\r
246 'Background',c, ...
\r
247 'Foreground','black', ...
\r
248 'String','Lower Diff:');
\r
250 %====================================
\r
252 pos = [srcImgPos(1) + srcImgPos(3) / 2 ...
\r
253 srcImgPos(2) - 4 * ctrHt srcImgPos(3) / 2 ctrHt];
\r
254 hUpDiffEdit=uicontrol( ...
\r
255 'Parent', DemoFig, ...
\r
256 'BusyAction','Queue','Interruptible','off',...
\r
257 'Style','edit', ...
\r
258 'Background','white', ...
\r
259 'Foreground','black', ...
\r
260 'Units','pixels', ...
\r
261 'Position',pos, ...
\r
263 'Horiz', 'right',...
\r
264 'Tag','AppEdit', ...
\r
265 'UserData', [1], ...
\r
266 'Callback','filldemo(''ControlsUpdate'')');
\r
267 %====================================
\r
268 % The upDiff Edit Label
\r
269 pos = [srcImgPos(1) ...
\r
270 srcImgPos(2) - 4 * ctrHt srcImgPos(3) / 2 ctrHt];
\r
272 'Parent', DemoFig, ...
\r
273 'BusyAction','Queue','Interruptible','off',...
\r
274 'Style','text', ...
\r
275 'Units','pixels', ...
\r
276 'Position',pos, ...
\r
277 'Horiz','left', ...
\r
278 'Background',c, ...
\r
279 'Foreground','black', ...
\r
280 'String','Upper Diff:');
\r
282 %====================================
\r
283 % The Connectivity Popup
\r
284 pos = [srcImgPos(1) + srcImgPos(3) / 2 ...
\r
285 srcImgPos(2) - 5 * ctrHt srcImgPos(3) / 2 ctrHt];
\r
286 hConPop=uicontrol( ...
\r
287 'Parent', DemoFig, ...
\r
288 'BusyAction','Queue','Interruptible','off',...
\r
289 'Style','popupmenu', ...
\r
290 'BackgroundColor',[.8 .8 .8], ...
\r
291 'Units','pixels', ...
\r
292 'Position',pos, ...
\r
293 'String','4|8', ...
\r
294 'Tag','ThreshPop', ...
\r
295 'Callback','filldemo(''ControlsUpdate'')');
\r
296 %====================================
\r
297 % The Connectivity Label
\r
298 pos = [srcImgPos(1) ...
\r
299 srcImgPos(2) - 5 * ctrHt srcImgPos(3) / 2 ctrHt];
\r
301 'Parent', DemoFig, ...
\r
302 'BusyAction','Queue','Interruptible','off',...
\r
303 'Style','text', ...
\r
304 'Units','pixels', ...
\r
305 'Position',pos, ...
\r
306 'Horiz','left', ...
\r
307 'Background',c, ...
\r
308 'Foreground','black', ...
\r
309 'String','Connectivity:');
\r
311 setstatus(DemoFig, 'Initializing Demo...');
\r
312 set(DemoFig, 'Pointer', 'watch');
\r
314 set(DemoFig, 'Visible','on');
\r
316 % Put handles to graphics objects and controls in the figure's userdata
\r
317 handles.SrcImage = hSrcImage;
\r
318 handles.DstImage = hDstImage;
\r
320 handles.SrcAx = hSrcAx;
\r
322 handles.SeedPoint = hSeedPoint;
\r
323 handles.NewValEdit = hNewValEdit;
\r
324 handles.LoDiffEdit = hLoDiffEdit;
\r
325 handles.UpDiffEdit = hUpDiffEdit;
\r
326 handles.ConPop = hConPop;
\r
328 set(DemoFig, 'UserData', handles);
\r
330 LoadNewImage(DemoFig);
\r
332 set(DemoFig, 'HandleVisibility','Callback')
\r
333 set([closeHndl applyHndl], 'Enable', 'on');
\r
338 %%% Sub-Function - LoadNewImage
\r
341 function LoadNewImage(DemoFig)
\r
347 set(DemoFig,'Pointer','watch');
\r
349 handles = get(DemoFig,'UserData');
\r
351 hSrcImage = handles.SrcImage;
\r
352 hSrcAx = handles.SrcAx;
\r
355 load cvdemos alumgrns2;
\r
359 set(hSrcImage, 'Cdata', img);
\r
361 blank = repmat(uint8(0),256,256);
\r
362 set(handles.DstImage, 'Cdata', blank);
\r
366 ControlsUpdate(DemoFig);
\r
372 %%% Sub-Function - Apply
\r
375 function Apply(DemoFig)
\r
381 handles = get(DemoFig,'UserData');
\r
383 hSrcImage=handles.SrcImage;
\r
384 hDstImage=handles.DstImage;
\r
386 hSeedPoint = handles.SeedPoint;
\r
387 hNewValEdit = handles.NewValEdit;
\r
388 hLoDiffEdit = handles.LoDiffEdit;
\r
389 hUpDiffEdit = handles.UpDiffEdit;
\r
390 hConPop = handles.ConPop;
\r
392 set(DemoFig,'Pointer','watch');
\r
393 setstatus(DemoFig, 'FloodFilling image...'); drawnow;
\r
395 img = get(hSrcImage, 'CData');
\r
397 seedPoint = get(hSeedPoint(1), 'UserData');
\r
398 newVal = get(hNewValEdit, 'UserData');
\r
399 loDiff = get(hLoDiffEdit, 'UserData');
\r
400 upDiff = get(hUpDiffEdit, 'UserData');
\r
402 % connectivity value
\r
403 v = get(hConPop,{'Value','String'});
\r
404 connectivity = str2num(deblank(v{2}(v{1},:)));
\r
406 % Flood Fill the image
\r
407 % [dst area value rect] = cvFloodFill(img, ...
\r
408 % [seedPoint(2)-1 seedPoint(1)-1], newVal, ...
\r
409 % loDiff, upDiff, connectivity);
\r
410 [dst area value rect] = cvFloodFill(img, ...
\r
411 seedPoint, newVal, ...
\r
412 loDiff, upDiff, connectivity);
\r
414 set(hDstImage, 'CData', dst);
\r
416 setstatus(DemoFig, 'Done');
\r
417 set(DemoFig,'Pointer','arrow'); drawnow
\r
422 %%% Sub-function - ControlsUpdate
\r
425 function ControlsUpdate(DemoFig)
\r
431 handles = get(DemoFig,'UserData');
\r
433 hSrcImage = handles.SrcImage;
\r
435 hSeedPoint = handles.SeedPoint;
\r
436 hNewValEdit = handles.NewValEdit;
\r
437 hLoDiffEdit = handles.LoDiffEdit;
\r
438 hUpDiffEdit = handles.UpDiffEdit;
\r
443 seedPoint = get(hSeedPoint(1), 'UserData');
\r
444 srcImage = get(hSrcImage, 'CData');
\r
445 if(srcImage(seedPoint(1),seedPoint(2)) > 128)
\r
451 set(hSeedPoint(1), ...
\r
452 'XData', [seedPoint(1)-pointSize, seedPoint(1)+pointSize], ...
\r
453 'YData', [seedPoint(2), seedPoint(2)], ...
\r
455 set(hSeedPoint(2), ...
\r
456 'XData', [seedPoint(1), seedPoint(1)], ...
\r
457 'YData', [seedPoint(2)-pointSize, seedPoint(2)+pointSize], ...
\r
461 oldv = get(hNewValEdit, 'UserData');
\r
462 newv = str2num(get(hNewValEdit, 'String'));
\r
463 if isempty(newv) | newv(1) < 0 | newv(1) > 255
\r
466 set(hNewValEdit, 'String', num2str(newv(1)));
\r
467 set(hNewValEdit, 'UserData', newv(1));
\r
470 oldv = get(hLoDiffEdit, 'UserData');
\r
471 newv = str2num(get(hLoDiffEdit, 'String'));
\r
472 if isempty(newv) | newv(1) < 0 | newv(1) > 255
\r
475 set(hLoDiffEdit, 'String', num2str(newv(1)));
\r
476 set(hLoDiffEdit, 'UserData', newv(1));
\r
479 oldv = get(hUpDiffEdit, 'UserData');
\r
480 newv = str2num(get(hUpDiffEdit, 'String'));
\r
481 if isempty(newv) | newv(1) < 0 | newv(1) > 255
\r
484 set(hUpDiffEdit, 'String', num2str(newv(1)));
\r
485 set(hUpDiffEdit, 'UserData', newv(1));
\r
487 setstatus(DemoFig, 'Press ''Apply'' button');
\r
491 %%% Sub-function - SeedPointUpdate
\r
494 function SeedPointUpdate(DemoFig)
\r
499 handles = get(DemoFig,'UserData');
\r
501 hSeedPoint = handles.SeedPoint;
\r
502 hSrcAx = handles.SrcAx;
\r
503 hSrcImage = handles.SrcImage;
\r
505 srcImage = get(hSrcImage, 'CData');
\r
506 imgSize = size(srcImage);
\r
507 imgSize = [imgSize(2) imgSize(1)];
\r
508 seedPoint = get(hSrcAx, 'CurrentPoint');
\r
509 seedPoint = max([seedPoint(1, 1) seedPoint(1, 2);1 1]);
\r
510 seedPoint = floor(min([seedPoint;imgSize]));
\r
512 set(hSeedPoint(1), 'UserData', seedPoint);
\r
514 ControlsUpdate(DemoFig);
\r