Update the changelog
[opencv] / interfaces / matlab / toolbox / opencv / cvdemos / filldemo.m
1 function filldemo(action,varargin);\r
2 %   OpenCV cvFloodFill function demo\r
3 \r
4 global demoName;\r
5 demoName = 'OpenCV FloodFill demo';\r
6 if nargin<1,\r
7    action='InitializeDEMO';\r
8 end;\r
9 \r
10 feval(action,varargin{:});\r
11 return;\r
12 \r
13 \r
14 %%%\r
15 %%%  Sub-function - InitializeDEMO\r
16 %%%\r
17 \r
18 function InitializeDEMO()\r
19 \r
20 global demoName;\r
21 \r
22 % If demo is already running, bring it to the foreground.\r
23 h = findobj(allchild(0), 'tag', demoName);\r
24 if ~isempty(h)\r
25    figure(h(1))\r
26    return\r
27 end\r
28 \r
29 screenD = get(0, 'ScreenDepth');\r
30 if screenD>8\r
31    grayres=256;\r
32 else\r
33    grayres=128;\r
34 end\r
35  \r
36 DemoFig=figure( ...\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
45 \r
46 %====================================\r
47 % Information for all buttons (and menus)\r
48 btnWid=0.175;\r
49 btnHt=0.06;\r
50 \r
51 %====================================\r
52 % The CONSOLE frame\r
53 frmBorder=0.02;\r
54 frmBottom = 0.13;\r
55 \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
61 h=uicontrol( ...\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
68 \r
69 %====================================\r
70 % The Apply button\r
71 labelStr='Apply';\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
83 \r
84 \r
85 %====================================\r
86 % The CLOSE button\r
87 labelStr='Close';\r
88 callbackStr='close(gcf)';\r
89 \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
99 \r
100 c = get(DemoFig,'Color');\r
101 if [.298936021 .58704307445 .114020904255]*c'<.5,\r
102    fgColor = [1 1 1];\r
103 else\r
104    fgColor = [0 0 0];\r
105 end\r
106 \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
111 \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
124 \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
135 \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
147 \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
155 \r
156 %==================================\r
157 % SeedPoint\r
158 seedPoint = [128, 100];\r
159 hSeedPoint = [line('Parent', hSrcAx, ...\r
160    'XData', [], ...\r
161    'YData', [], ...\r
162    'UserData', seedPoint), ...\r
163 line('Parent', hSrcAx, ...\r
164    'XData', [], ...\r
165    'YData', [])];\r
166 %   'EraseMode', 'xor', ...\r
167 \r
168 % Status bar\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
182 \r
183 \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
207 h = uicontrol( ...\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
217 \r
218 %====================================\r
219 % The loDiff Edit\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
230    'String','1', ...\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
239 h = uicontrol( ...\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
249 \r
250 %====================================\r
251 % The upDiff Edit\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
262    'String','1', ...\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
271 h = uicontrol( ...\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
281 \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
300 h = uicontrol( ...\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
310 \r
311 setstatus(DemoFig, 'Initializing Demo...');\r
312 set(DemoFig, 'Pointer', 'watch');\r
313 drawnow;\r
314 set(DemoFig, 'Visible','on');\r
315 \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
319 \r
320 handles.SrcAx = hSrcAx;\r
321 \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
327 \r
328 set(DemoFig, 'UserData', handles);\r
329 \r
330 LoadNewImage(DemoFig);\r
331 \r
332 set(DemoFig, 'HandleVisibility','Callback')\r
333 set([closeHndl applyHndl], 'Enable', 'on');\r
334 return\r
335 \r
336 \r
337 %%%\r
338 %%%  Sub-Function - LoadNewImage\r
339 %%%\r
340 \r
341 function LoadNewImage(DemoFig)\r
342 \r
343 if nargin<1\r
344    DemoFig = gcbf;\r
345 end\r
346 \r
347 set(DemoFig,'Pointer','watch');\r
348 \r
349 handles = get(DemoFig,'UserData');\r
350 \r
351 hSrcImage = handles.SrcImage;\r
352 hSrcAx    = handles.SrcAx;\r
353 \r
354 alumgrns2 = [];\r
355 load cvdemos alumgrns2;\r
356 \r
357 img = alumgrns2;\r
358 \r
359 set(hSrcImage, 'Cdata', img);\r
360 \r
361 blank = repmat(uint8(0),256,256);\r
362 set(handles.DstImage, 'Cdata', blank);\r
363 \r
364 drawnow;\r
365 \r
366 ControlsUpdate(DemoFig);\r
367 Apply(DemoFig);\r
368 return;\r
369 \r
370 \r
371 %%%\r
372 %%%  Sub-Function - Apply\r
373 %%%\r
374 \r
375 function Apply(DemoFig)\r
376 \r
377 if nargin<1\r
378    DemoFig = gcbf;\r
379 end\r
380 \r
381 handles = get(DemoFig,'UserData');\r
382 \r
383 hSrcImage=handles.SrcImage;\r
384 hDstImage=handles.DstImage;\r
385 \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
391 \r
392 set(DemoFig,'Pointer','watch');\r
393 setstatus(DemoFig, 'FloodFilling image...'); drawnow;\r
394 \r
395 img = get(hSrcImage, 'CData');\r
396 \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
401 \r
402 % connectivity value\r
403 v = get(hConPop,{'Value','String'});\r
404 connectivity = str2num(deblank(v{2}(v{1},:)));\r
405 \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
413 \r
414 set(hDstImage, 'CData', dst);\r
415 \r
416 setstatus(DemoFig, 'Done');\r
417 set(DemoFig,'Pointer','arrow'); drawnow\r
418 return\r
419 \r
420 \r
421 %%%\r
422 %%%  Sub-function - ControlsUpdate\r
423 %%%\r
424 \r
425 function ControlsUpdate(DemoFig)\r
426 \r
427 if nargin<1\r
428    DemoFig = gcbf;\r
429 end;\r
430 \r
431 handles = get(DemoFig,'UserData');\r
432 \r
433 hSrcImage   = handles.SrcImage;\r
434 \r
435 hSeedPoint  = handles.SeedPoint;\r
436 hNewValEdit = handles.NewValEdit;\r
437 hLoDiffEdit = handles.LoDiffEdit;\r
438 hUpDiffEdit = handles.UpDiffEdit;\r
439 \r
440 % draw seed point\r
441 pointSize = 10;\r
442 \r
443 seedPoint = get(hSeedPoint(1), 'UserData');\r
444 srcImage = get(hSrcImage, 'CData');\r
445 if(srcImage(seedPoint(1),seedPoint(2)) > 128)\r
446     color = 'black';\r
447 else\r
448     color = 'white';\r
449 end\r
450 \r
451 set(hSeedPoint(1), ...\r
452    'XData', [seedPoint(1)-pointSize, seedPoint(1)+pointSize], ...\r
453    'YData', [seedPoint(2), seedPoint(2)], ...\r
454    'Color', color);\r
455 set(hSeedPoint(2), ...\r
456    'XData', [seedPoint(1), seedPoint(1)], ...\r
457    'YData', [seedPoint(2)-pointSize, seedPoint(2)+pointSize], ...\r
458    'Color', color);\r
459 \r
460 % newVal value\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
464     newv = oldv;\r
465 end\r
466 set(hNewValEdit, 'String', num2str(newv(1)));\r
467 set(hNewValEdit, 'UserData', newv(1));\r
468 \r
469 % loDiff value\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
473     newv = oldv;\r
474 end\r
475 set(hLoDiffEdit, 'String', num2str(newv(1)));\r
476 set(hLoDiffEdit, 'UserData', newv(1));\r
477 \r
478 % upDiff value\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
482     newv = oldv;\r
483 end\r
484 set(hUpDiffEdit, 'String', num2str(newv(1)));\r
485 set(hUpDiffEdit, 'UserData', newv(1));\r
486 \r
487 setstatus(DemoFig, 'Press ''Apply'' button');\r
488 return;\r
489 \r
490 %%%\r
491 %%%  Sub-function - SeedPointUpdate\r
492 %%%\r
493 \r
494 function SeedPointUpdate(DemoFig)\r
495 if nargin<1\r
496    DemoFig = gcbf;\r
497 end;\r
498 \r
499 handles = get(DemoFig,'UserData');\r
500 \r
501 hSeedPoint = handles.SeedPoint;\r
502 hSrcAx     = handles.SrcAx;\r
503 hSrcImage  = handles.SrcImage;\r
504 \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
511 \r
512 set(hSeedPoint(1), 'UserData', seedPoint);\r
513 \r
514 ControlsUpdate(DemoFig);\r
515 \r
516 return;\r