tag:blogger.com,1999:blog-13203778613756421392024-03-13T19:26:16.155-07:00Computational PhotographyTonyhttp://www.blogger.com/profile/04642084340311831801noreply@blogger.comBlogger15125tag:blogger.com,1999:blog-1320377861375642139.post-29474287154719348512012-03-24T17:03:00.000-07:002012-03-24T17:03:15.876-07:00Wrapping up<a href="http://www.stanford.edu/~kimth/cs478/proj/kimth_irvingl_nprViewfinder.pdf">Paper</a> and <a href="http://www.stanford.edu/~kimth/cs478/proj/thk_il_nprviewfinder.pdf">presentation</a>Tonyhttp://www.blogger.com/profile/04642084340311831801noreply@blogger.com0tag:blogger.com,1999:blog-1320377861375642139.post-36885385163171532542012-03-11T22:09:00.002-07:002012-03-12T08:26:15.388-07:00Figures and FG/BG-selective filtering<div class="separator" style="clear: both; text-align: left;">
Some figures for the write-up:</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcMukm-2uoXs9FtojM-3k97LdabCJJ3sQimzI3MvNitPNUej2JNzNoFSaLFDu6DTc-AzCS7JkcC4Ma1QHGBLeP9ym3EgRcA_OHWMEIoRNrmQjSyrHAuMChI1fU5qlc_5BLB04e_4JEOFaB/s1600/npr.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="484" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcMukm-2uoXs9FtojM-3k97LdabCJJ3sQimzI3MvNitPNUej2JNzNoFSaLFDu6DTc-AzCS7JkcC4Ma1QHGBLeP9ym3EgRcA_OHWMEIoRNrmQjSyrHAuMChI1fU5qlc_5BLB04e_4JEOFaB/s640/npr.png" width="640" /></a></div>
<br />
The next two figures show the results of flash/no-flash integration (still very hacked, since hardware support for timing flash isn't available in the current FCam release). The alternating flash/no-flash shots are used to determine foreground (FG) from background (BG); filter is then applied only on FG or BG.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsVpiNo7VX1K_uksQ90d4vS3fkQpYpKvQoGJMlseRY2JKGQ9u0XhYPgcq0sMxh194gNswVPjdyn15mkcNVkrxvySc1XYt5s2CF0MdqJ_JM_qgtrBWqqaeSEEaZuNaVwGsStQCHMasHcAij/s1600/background_npr.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="243" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsVpiNo7VX1K_uksQ90d4vS3fkQpYpKvQoGJMlseRY2JKGQ9u0XhYPgcq0sMxh194gNswVPjdyn15mkcNVkrxvySc1XYt5s2CF0MdqJ_JM_qgtrBWqqaeSEEaZuNaVwGsStQCHMasHcAij/s640/background_npr.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7WF6jHZvhUTSQ_mX5p2cQ7AFS_ONzSYVhM-cZ6WpgwfVAZyo0nc0BW6UFqv1RZQhUZUZ4QdG14sOQDexXPPT_w98u3uNOsrN8PoysArXId2lNxCK4lKQr89yf7BMYxfQ1nideVpQ7xYsZ/s1600/bilateral.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="244" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7WF6jHZvhUTSQ_mX5p2cQ7AFS_ONzSYVhM-cZ6WpgwfVAZyo0nc0BW6UFqv1RZQhUZUZ4QdG14sOQDexXPPT_w98u3uNOsrN8PoysArXId2lNxCK4lKQr89yf7BMYxfQ1nideVpQ7xYsZ/s640/bilateral.png" width="640" /></a></div>
<br />
Some more figures:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwGns3DRsp9aLf5Vr42g-AQA025J1qtGFPQROOXqaurXA21frn8Zc3OuFP154N5raSxjUSfx9D9KTXta94Lo6iNTj2OgkBnLlKNjl1NOATufUtH5WmwKspp-2ROlUF167wOYXo8gE7M9no/s1600/gpuprocessing.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="174" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwGns3DRsp9aLf5Vr42g-AQA025J1qtGFPQROOXqaurXA21frn8Zc3OuFP154N5raSxjUSfx9D9KTXta94Lo6iNTj2OgkBnLlKNjl1NOATufUtH5WmwKspp-2ROlUF167wOYXo8gE7M9no/s640/gpuprocessing.png" width="640" /></a></div>
<br />
The remaining figure will be the perf measurements.Tonyhttp://www.blogger.com/profile/04642084340311831801noreply@blogger.com1tag:blogger.com,1999:blog-1320377861375642139.post-794609131047537942012-03-05T07:56:00.001-08:002012-03-06T15:11:13.126-08:00Live flash/no-flash integrationWe implemented a very hacked version of flash/no-flash integration. The difficulty is in maintaining proper synchronization between successive flash and no-flash shots.<br />
<br />
Nevertheless, with the hacked flash toggle implementation, a joint bilateral filter was set up. It would also be interesting to do foreground-background detection by flash/no-flash difference images. There can be a lot of neat effects enabled by this technique, e.g. cartoonization applied only to foreground (or background), or synthetic blurring of background, etc.<br />
<br />
[March 6th]: Alas, Nvidia just confirmed that the two methods for Flash control are lacking: (1) FireAction does not support timing in the current FCam implementation; (2) TorchAction is completely asynchronous and hence this is not really the means to get an alternating stream of flash/no-flash.<br />
<br />
If/when Nvidia releases stereo camera, we might try shuffling the two stereo cams to the two SharedBuffers.Tonyhttp://www.blogger.com/profile/04642084340311831801noreply@blogger.com0tag:blogger.com,1999:blog-1320377861375642139.post-10701057719208444102012-03-02T10:25:00.002-08:002012-03-02T13:20:31.769-08:00More pictures (3)My walk to Stanford campus this morning. Will take more shots later when the sun is in a more favorable spot relative to the Memorial Church:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0pkJkuU57fRz06tAn3DJgBKT9KbRmWB6UPH_cxDr2bLxgqZqdlK9OwqFIux_6_2C_BFh1PWbg31B6EuGheChN3U07R6UduI3oKexsQAP-iooJQmnOw_IUJRJqdg71xApVlYWSsblFH7Br/s1600/device-2012-03-02-090333.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0pkJkuU57fRz06tAn3DJgBKT9KbRmWB6UPH_cxDr2bLxgqZqdlK9OwqFIux_6_2C_BFh1PWbg31B6EuGheChN3U07R6UduI3oKexsQAP-iooJQmnOw_IUJRJqdg71xApVlYWSsblFH7Br/s640/device-2012-03-02-090333.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjELbnMH7B_Cft1pdVBE3Ng1vq3yJdPWneXZ0AuNpoNBNYlbbo5ZUiPTHfbxhRVydeGpkrHBThbNYs3O4LaOmW0livI-LGAYbUlNGwv4QgBMj7Z6zgGgx9WyDyyevBjmno79ZZWGg0wGcPG/s1600/device-2012-03-02-090154.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjELbnMH7B_Cft1pdVBE3Ng1vq3yJdPWneXZ0AuNpoNBNYlbbo5ZUiPTHfbxhRVydeGpkrHBThbNYs3O4LaOmW0livI-LGAYbUlNGwv4QgBMj7Z6zgGgx9WyDyyevBjmno79ZZWGg0wGcPG/s640/device-2012-03-02-090154.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg07XeYJ-NfA7KWLzwd0l_M9LDVMtwUzLbRpkLlxYhyphenhyphenF-sZHISIFLhjIkQeMbWQRDi05alMmvHVlhYAl5LH2F6c8sBeDF-9DTuYTzs9Dpf2dK0rV4Gt3isAz-pf2cnqMEC3LiUP8TpxxXtG/s1600/device-2012-03-02-091148.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg07XeYJ-NfA7KWLzwd0l_M9LDVMtwUzLbRpkLlxYhyphenhyphenF-sZHISIFLhjIkQeMbWQRDi05alMmvHVlhYAl5LH2F6c8sBeDF-9DTuYTzs9Dpf2dK0rV4Gt3isAz-pf2cnqMEC3LiUP8TpxxXtG/s640/device-2012-03-02-091148.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgU7iym3nuJqp4z9IlXL2ZHYWaUUhqjYojXmpdiHpQMOg2kSAuAnpLc31DPseUfpwa4nnaD8pawIZs2UUeqoDJ6aIq4iOPtdpqp3yA-JARQb4JUknnOBtS5XCHX6IQuNZVm6w0j56rsJwrC/s1600/device-2012-03-02-091222.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgU7iym3nuJqp4z9IlXL2ZHYWaUUhqjYojXmpdiHpQMOg2kSAuAnpLc31DPseUfpwa4nnaD8pawIZs2UUeqoDJ6aIq4iOPtdpqp3yA-JARQb4JUknnOBtS5XCHX6IQuNZVm6w0j56rsJwrC/s640/device-2012-03-02-091222.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgM6E90BNqqwCoc4iDFXBu8kChfd0EslCu3YyDH1i88xB3kLUfdSJ1nqfxU6Re6HsvUcINFLDpkJP3K-tdboF1JM5ehEjOzEOXsnDo9T0zMQ0RgoeGehWohgR6AA9b9n_ZUk-ChEBOSpnGc/s1600/device-2012-03-02-091833.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgM6E90BNqqwCoc4iDFXBu8kChfd0EslCu3YyDH1i88xB3kLUfdSJ1nqfxU6Re6HsvUcINFLDpkJP3K-tdboF1JM5ehEjOzEOXsnDo9T0zMQ0RgoeGehWohgR6AA9b9n_ZUk-ChEBOSpnGc/s640/device-2012-03-02-091833.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgfZqipyXvOfp3mf4-R-Uc7meMEJ4bSdYmAXBjSMp0CUW5uRYQojtfeWcC4fQQ_von2L1dxTRfzt6uKE0WIDDrikgnvqvv50AXUcgxT0qqmBbkb4tzhDjUyjMp4IHQKgJUPC9kdBImmQLt/s1600/device-2012-03-02-092008.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgfZqipyXvOfp3mf4-R-Uc7meMEJ4bSdYmAXBjSMp0CUW5uRYQojtfeWcC4fQQ_von2L1dxTRfzt6uKE0WIDDrikgnvqvv50AXUcgxT0qqmBbkb4tzhDjUyjMp4IHQKgJUPC9kdBImmQLt/s640/device-2012-03-02-092008.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg76o07EL8ANMBWS7N-vbvdvEx5M9bGfkV0Gt4kXPUwolfcWURC1gkxLUHnQ_6XR6DamOqL8KMNjwD_blBexW_zKe6D9CCl2RBD47PPqg517jYU2oQF8Rql4eRM5PPlPDlrNzbe9yb1MM-D/s1600/device-2012-03-02-092223.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg76o07EL8ANMBWS7N-vbvdvEx5M9bGfkV0Gt4kXPUwolfcWURC1gkxLUHnQ_6XR6DamOqL8KMNjwD_blBexW_zKe6D9CCl2RBD47PPqg517jYU2oQF8Rql4eRM5PPlPDlrNzbe9yb1MM-D/s640/device-2012-03-02-092223.png" width="640" /></a></div>
<br />
From the Hoover tower:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUQ6lnEV1Z_a08zAwoNlv8k4X1X-iXj5cPn0mD842sRN9XJLWKcY_1r8VqUlqfbO1iVW01PlNqKC8SksIKtMawiB6bjAhZncsMTLeooqMrUOXwbvH-2e2QgkkXeL3G4LEREe59mrPZLVuv/s1600/device-2012-03-02-130534.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUQ6lnEV1Z_a08zAwoNlv8k4X1X-iXj5cPn0mD842sRN9XJLWKcY_1r8VqUlqfbO1iVW01PlNqKC8SksIKtMawiB6bjAhZncsMTLeooqMrUOXwbvH-2e2QgkkXeL3G4LEREe59mrPZLVuv/s640/device-2012-03-02-130534.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBjPyOW8qecVqLmRbQ8TraIIvg34VkH-W_ifKb-13RQQmE_pC3eSqvFuskcQzwehNHY_e2FEhhJCdgBUPbEZxTjcu-wQ8aPs6xU2ZF_S-RM08JadzdyOe7iDni6AvVIZ62-4ByeeEJHvt7/s1600/device-2012-03-02-130738.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBjPyOW8qecVqLmRbQ8TraIIvg34VkH-W_ifKb-13RQQmE_pC3eSqvFuskcQzwehNHY_e2FEhhJCdgBUPbEZxTjcu-wQ8aPs6xU2ZF_S-RM08JadzdyOe7iDni6AvVIZ62-4ByeeEJHvt7/s640/device-2012-03-02-130738.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhU-zVuXldOUFOlfEsxs7p8TLWzKVOKQKFBaUUlBUFQhE0XY1-rIJ4i6k-a-1KiBxLtF2y-pncZczA-yrffHT0QL_Ev5qTF_kI_0CN1lflk0An2FwQHtB9UEff7KgyeVC-5-esfk8qPHn4C/s1600/device-2012-03-02-130931.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhU-zVuXldOUFOlfEsxs7p8TLWzKVOKQKFBaUUlBUFQhE0XY1-rIJ4i6k-a-1KiBxLtF2y-pncZczA-yrffHT0QL_Ev5qTF_kI_0CN1lflk0An2FwQHtB9UEff7KgyeVC-5-esfk8qPHn4C/s640/device-2012-03-02-130931.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8Yes_hiAWJMe5rI6CGJUkXnr3hGIyWjf802xAzxdNJukKveb412h3JOMwF4DldJP4GdSvAIaRI3MQ0Hs9IVAQ5QcIWEuS3fJCFNSMPlRdBcOAOaB0jOh4BM3J7jfNRAxjmwQnOGXUib8c/s1600/device-2012-03-02-130951.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8Yes_hiAWJMe5rI6CGJUkXnr3hGIyWjf802xAzxdNJukKveb412h3JOMwF4DldJP4GdSvAIaRI3MQ0Hs9IVAQ5QcIWEuS3fJCFNSMPlRdBcOAOaB0jOh4BM3J7jfNRAxjmwQnOGXUib8c/s640/device-2012-03-02-130951.png" width="640" /></a></div>
<br />Tonyhttp://www.blogger.com/profile/04642084340311831801noreply@blogger.com0tag:blogger.com,1999:blog-1320377861375642139.post-20375269286240136422012-03-01T16:46:00.003-08:002012-03-01T20:52:00.596-08:00More pictures (2)Was inspired to take a short walk outside today:<br />
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwjInlKfLpmfWJPjG8_lY80NhwsKuIU7JvdA8njh4sUPkf0bdYdiCuB7kSw-C_tfhq2Nf02EAz6VUmOFKDYm6YRhabNDB5nWHmVatLGUZui8W2imB9AfoanxZ_lZMDrhh6yP90YV7gKSVA/s1600/device-2012-03-01-164532.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwjInlKfLpmfWJPjG8_lY80NhwsKuIU7JvdA8njh4sUPkf0bdYdiCuB7kSw-C_tfhq2Nf02EAz6VUmOFKDYm6YRhabNDB5nWHmVatLGUZui8W2imB9AfoanxZ_lZMDrhh6yP90YV7gKSVA/s640/device-2012-03-01-164532.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqOEakT3jl9B56z4PcVy69vokV_Ib68QkoeABCr7q2YMmrpkRPU7905QGWg_jm_Hf6erFO8vp12AidGyda0KDCJjElmXl2E9FUepRP66EZzZnd0c_hjrzCO-j6tPFo1JdAeZxFTsv2s2z_/s1600/device-2012-03-01-165702.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqOEakT3jl9B56z4PcVy69vokV_Ib68QkoeABCr7q2YMmrpkRPU7905QGWg_jm_Hf6erFO8vp12AidGyda0KDCJjElmXl2E9FUepRP66EZzZnd0c_hjrzCO-j6tPFo1JdAeZxFTsv2s2z_/s640/device-2012-03-01-165702.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBrLaTgxTMc9NH98df66ZaAS2Xd6kBt67RDXk6XixOQwm3Ny7ZRVr0OnbgCDb6HlGtb683jXtaARsRAwZoex23F7XN-mFb4kDxb5_d2yKH6GzBtdFJ32hdVuAC0bElmOIyB1fkAGeAO8gN/s1600/device-2012-03-01-165815.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBrLaTgxTMc9NH98df66ZaAS2Xd6kBt67RDXk6XixOQwm3Ny7ZRVr0OnbgCDb6HlGtb683jXtaARsRAwZoex23F7XN-mFb4kDxb5_d2yKH6GzBtdFJ32hdVuAC0bElmOIyB1fkAGeAO8gN/s640/device-2012-03-01-165815.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEif6mQSVMgY_Bo8NpcBN0WSneK4pa8MmGxv_7ZoCnDtub55x_pnfdQfCxhoCjNsgnY9pl6YAOyts74PXth0WblpnbvAAoVnp35hli8r9PH72Sp2Fdsvj3oSXmF_Z62pl2ai9W-IjLM1OkOz/s1600/device-2012-03-01-165850.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEif6mQSVMgY_Bo8NpcBN0WSneK4pa8MmGxv_7ZoCnDtub55x_pnfdQfCxhoCjNsgnY9pl6YAOyts74PXth0WblpnbvAAoVnp35hli8r9PH72Sp2Fdsvj3oSXmF_Z62pl2ai9W-IjLM1OkOz/s640/device-2012-03-01-165850.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQ8LqUCG9e20eOnrudlURFLF1JkE-WtDGJwA7n5ogX0b0Rw1UAYMD4LLrYvuKfeHtXyvDZd3OYErELEzHzgfdqtnC691DxcDihSlaqKiWC2IN2XtAk1gLNIixzhCLoSFNuSljcrDbITzTw/s1600/device-2012-03-01-170000.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQ8LqUCG9e20eOnrudlURFLF1JkE-WtDGJwA7n5ogX0b0Rw1UAYMD4LLrYvuKfeHtXyvDZd3OYErELEzHzgfdqtnC691DxcDihSlaqKiWC2IN2XtAk1gLNIixzhCLoSFNuSljcrDbITzTw/s640/device-2012-03-01-170000.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhk5GkDL32JWYAAUHrTCf0WWfKmg-cOjOh_3IRiv5S7ve7lZsAmNkbkcn35kfUe24E-G7qEi9F3B-138Wo3F_mxmO5FkS_Qko_7b_bOPaqb6zO5bJlnfPcHskziQH-a78Ygowi2mSlRlTie/s1600/device-2012-03-01-170035.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhk5GkDL32JWYAAUHrTCf0WWfKmg-cOjOh_3IRiv5S7ve7lZsAmNkbkcn35kfUe24E-G7qEi9F3B-138Wo3F_mxmO5FkS_Qko_7b_bOPaqb6zO5bJlnfPcHskziQH-a78Ygowi2mSlRlTie/s640/device-2012-03-01-170035.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTu0eM4u6KNyhcTytNhCHRcpwK-McY6ruxgobRocCnb0eA4l2bNJF2t7ITACdx543O3vmn7uBceeu9xpwc6xxkKn31MVgfKGIu_ZIOYSBSO2Q2GB3ZLXt2PTGu_KStUWTV4vpEq6kySjbE/s1600/device-2012-03-01-170156.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTu0eM4u6KNyhcTytNhCHRcpwK-McY6ruxgobRocCnb0eA4l2bNJF2t7ITACdx543O3vmn7uBceeu9xpwc6xxkKn31MVgfKGIu_ZIOYSBSO2Q2GB3ZLXt2PTGu_KStUWTV4vpEq6kySjbE/s640/device-2012-03-01-170156.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgD2IoeN4iIkUtZq5IX4DP5wAwEsSpkZ9jpAzWtDtbFe1ivnks7Q37D_c-alUuRq6RRDdrFZBHXkm0qgk8iHTjvszixeTcy_-8FahevT1_EHnLkoNeJ2NoBkDqVOfF4waXXEkRj_lsGTy2o/s1600/device-2012-03-01-170345.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgD2IoeN4iIkUtZq5IX4DP5wAwEsSpkZ9jpAzWtDtbFe1ivnks7Q37D_c-alUuRq6RRDdrFZBHXkm0qgk8iHTjvszixeTcy_-8FahevT1_EHnLkoNeJ2NoBkDqVOfF4waXXEkRj_lsGTy2o/s640/device-2012-03-01-170345.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnJE5tRlzTdF3_l9zupQ4KLMwrxEXWgvd5RFDUTezFS9ISVMAtR5fQ57uUXqfi-OhdpjnFrf0sorDqxT4GTYLqCPY8mohES3xe1Cv_Kho-Wm_pzQboZLUn3LRv1hK8nhSuwX4BZLJwoJX5/s1600/device-2012-03-01-170539.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnJE5tRlzTdF3_l9zupQ4KLMwrxEXWgvd5RFDUTezFS9ISVMAtR5fQ57uUXqfi-OhdpjnFrf0sorDqxT4GTYLqCPY8mohES3xe1Cv_Kho-Wm_pzQboZLUn3LRv1hK8nhSuwX4BZLJwoJX5/s640/device-2012-03-01-170539.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikLtNcVR2Dz5-JUICPabECUzDq_ZCkGGU6Nz_ZaP9utV92VhGUkXtVd_-TlEgJWTdJsoDvyp5YjVO29LAKaxIGgiPM4JgGBYfsZDa2wLpiWMq_1VQ-Yl4T-4yaPUzwNcTi_ntH26M05EmE/s1600/device-2012-03-01-170647.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikLtNcVR2Dz5-JUICPabECUzDq_ZCkGGU6Nz_ZaP9utV92VhGUkXtVd_-TlEgJWTdJsoDvyp5YjVO29LAKaxIGgiPM4JgGBYfsZDa2wLpiWMq_1VQ-Yl4T-4yaPUzwNcTi_ntH26M05EmE/s640/device-2012-03-01-170647.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIPq5fEmOvXboj2gYOqaJEhEkBQeNoL_mwWQ66FayLO01WYN03pkIqR3NGZxom5UgVju7b5s_NUsYKMsKIJSX4zcq4C6kHPW493b5l785jhjeHckXGdpF6ApuDJ8kJwyiG2JeyGxpdjJje/s1600/device-2012-03-01-170759.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIPq5fEmOvXboj2gYOqaJEhEkBQeNoL_mwWQ66FayLO01WYN03pkIqR3NGZxom5UgVju7b5s_NUsYKMsKIJSX4zcq4C6kHPW493b5l785jhjeHckXGdpF6ApuDJ8kJwyiG2JeyGxpdjJje/s640/device-2012-03-01-170759.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVf_r5A0I9Myr6J3LG8l95A3yM-PBoXTR-fEyi0shShCkagotFqLl-_C9KDI827E8jhaNafT7PoxXdA1Gso82nEOOJfctSa6RnyGJrPXdGfVffB0Lb6aiwGoGWpjKmpCmzGb9cBURRUM7q/s1600/device-2012-03-01-171019.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVf_r5A0I9Myr6J3LG8l95A3yM-PBoXTR-fEyi0shShCkagotFqLl-_C9KDI827E8jhaNafT7PoxXdA1Gso82nEOOJfctSa6RnyGJrPXdGfVffB0Lb6aiwGoGWpjKmpCmzGb9cBURRUM7q/s640/device-2012-03-01-171019.png" width="640" /></a></div>
<br />
Random stuff inside:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhId3SL2N5veqhwI85x3w7YDwunbet8BOCej8L_n8IKjVKjebxTP8RunPXZHIaCg0gPY2jvrSFYJEFq2vsMia0g4keqxg4aW6rWPoRkLFhyv0D8A6lO-8pzqvo2L6CN1kaUq24gBNt6MnLi/s1600/device-2012-03-01-202055.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhId3SL2N5veqhwI85x3w7YDwunbet8BOCej8L_n8IKjVKjebxTP8RunPXZHIaCg0gPY2jvrSFYJEFq2vsMia0g4keqxg4aW6rWPoRkLFhyv0D8A6lO-8pzqvo2L6CN1kaUq24gBNt6MnLi/s640/device-2012-03-01-202055.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpTRCsJSvYbSU0l40ZUltIxMtBV-eo1stKRYGEWJIFrKyj-WywK0GrgA4ydWRjnBFnD7x_n-xVorBua08XFf5b9VKADQTPGQfEePR1gBKIrwVkg-Un6xkqHdY-rTZfYjj-fnkcpxVYGbE9/s1600/device-2012-03-01-202326.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpTRCsJSvYbSU0l40ZUltIxMtBV-eo1stKRYGEWJIFrKyj-WywK0GrgA4ydWRjnBFnD7x_n-xVorBua08XFf5b9VKADQTPGQfEePR1gBKIrwVkg-Un6xkqHdY-rTZfYjj-fnkcpxVYGbE9/s640/device-2012-03-01-202326.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJPGIJuXDkHMf_qXbvTXfJVfZtqXQIf3jPEzblXlsYlHhqsCMh-DtiqGhlIQLr6qGeTTaHzsaUZS8wryrHBTC3KGFTsAd9YEzBRPj78oOnC76b7HKTABcFJW-tsdzoyLU69cqB0v2fkqeZ/s1600/device-2012-03-01-202920.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJPGIJuXDkHMf_qXbvTXfJVfZtqXQIf3jPEzblXlsYlHhqsCMh-DtiqGhlIQLr6qGeTTaHzsaUZS8wryrHBTC3KGFTsAd9YEzBRPj78oOnC76b7HKTABcFJW-tsdzoyLU69cqB0v2fkqeZ/s640/device-2012-03-01-202920.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxP_fdAEOKCPtCJslfl18JtvPLn6Cpw4iDcPdG4tWYR7QxDCILqoLAAYcWetKcB7Bs7FMYsiS6uAxgAhPbr5P5cPG7ZfZdWGhjtaPH-CXVLaksh8CLOYJSSTgvUiHz27nkxwW0fGDE2OqK/s1600/device-2012-03-01-202930.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxP_fdAEOKCPtCJslfl18JtvPLn6Cpw4iDcPdG4tWYR7QxDCILqoLAAYcWetKcB7Bs7FMYsiS6uAxgAhPbr5P5cPG7ZfZdWGhjtaPH-CXVLaksh8CLOYJSSTgvUiHz27nkxwW0fGDE2OqK/s640/device-2012-03-01-202930.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijZhutu745dombH4ajafN-HAN3dbo3aYsXnK12zYR6ZFxLXUr5yjEUOk7d0OGN3933bY6RAtAZm1rzqD9rC3wRP29o5oxfB7b2YHwTXctDhPZIjlv345f3-3VT0cMYzQbaFneLw9Lv-uP0/s1600/device-2012-03-01-203346.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijZhutu745dombH4ajafN-HAN3dbo3aYsXnK12zYR6ZFxLXUr5yjEUOk7d0OGN3933bY6RAtAZm1rzqD9rC3wRP29o5oxfB7b2YHwTXctDhPZIjlv345f3-3VT0cMYzQbaFneLw9Lv-uP0/s640/device-2012-03-01-203346.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8e1Q55V37Bl2ueFYVyVSPYims02St0z2-cYKoobqa0VqY-A5zC67tTeKkhBhojRmXCmO3fKaihx2nBlCgZhtPNNhPxFPGBlLDq0XbHcofTIVity84rJ4jMr1CIef1pFeJonQzCqKZJl2O/s1600/device-2012-03-01-204404.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8e1Q55V37Bl2ueFYVyVSPYims02St0z2-cYKoobqa0VqY-A5zC67tTeKkhBhojRmXCmO3fKaihx2nBlCgZhtPNNhPxFPGBlLDq0XbHcofTIVity84rJ4jMr1CIef1pFeJonQzCqKZJl2O/s640/device-2012-03-01-204404.png" width="640" /></a></div>
<br />Tonyhttp://www.blogger.com/profile/04642084340311831801noreply@blogger.com0tag:blogger.com,1999:blog-1320377861375642139.post-58964797758645978452012-02-29T21:48:00.003-08:002012-03-01T20:12:41.417-08:00More picturesPictures of just bilateral filter (two passes) -- no edges:<br />
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlHLT2-o8x7b_a01BEp35y_yL7d68WKIwfjS4NpsUw2kYQN2EU1_qnCvBsOke-QbtOodbhPp-bjdtWeAlABMgXSyeClNuEmpV-J_jHrzDnIk_8rxNnbJg2MAsh-l59WjtsVJZDLpgkX98T/s1600/device-2012-02-29-214521.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="356" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlHLT2-o8x7b_a01BEp35y_yL7d68WKIwfjS4NpsUw2kYQN2EU1_qnCvBsOke-QbtOodbhPp-bjdtWeAlABMgXSyeClNuEmpV-J_jHrzDnIk_8rxNnbJg2MAsh-l59WjtsVJZDLpgkX98T/s640/device-2012-02-29-214521.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUnSKO759EYsK52uug5UHp_rDorFTQtZeow9Z_zX5fZc_gwpguakQL8_qCjWOljBtn9IGf2ICd32-0kifW1i4XdMmzd6CwYYaSpD8koeJecAxF3aoQGz2eu0DV3P2wyNCHR3DacNjntqsj/s1600/device-2012-02-29-214543.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="356" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUnSKO759EYsK52uug5UHp_rDorFTQtZeow9Z_zX5fZc_gwpguakQL8_qCjWOljBtn9IGf2ICd32-0kifW1i4XdMmzd6CwYYaSpD8koeJecAxF3aoQGz2eu0DV3P2wyNCHR3DacNjntqsj/s640/device-2012-02-29-214543.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijSbE04FATi_CLOfXXyqu3qy9TM8Ar5YccVS0KC9TR6EZKiixWBC7c_ptWHbfmUBttSqNXuARHuLiGM4s0_v0dNCFrUdBdkF1HRIyNHnM5HBw4PpPa7ozOXZYmVqxXK8tWLlCPv2ZzCCKA/s1600/device-2012-02-29-214707.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="356" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijSbE04FATi_CLOfXXyqu3qy9TM8Ar5YccVS0KC9TR6EZKiixWBC7c_ptWHbfmUBttSqNXuARHuLiGM4s0_v0dNCFrUdBdkF1HRIyNHnM5HBw4PpPa7ozOXZYmVqxXK8tWLlCPv2ZzCCKA/s640/device-2012-02-29-214707.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
The edge detection algorithm really needs to be improved. The bilateral filter result is beautiful.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Made a slight tweak to the edge-detection so that we don't use hard thresholding:</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2-JpD-AnKaK7SoG2GD4mEG8Vdqm4N1BTncQmD4PfiTF1f-5KhJRSWwMRcq-8RlNKCrzj_CtIFGQwgDuFySbDq_MMmbZw0c4EFRBY_mxtnFC7u_-5vyLUO0TLMdHlJk4wkX3MYtXmKQx04/s1600/device-2012-02-29-220413.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2-JpD-AnKaK7SoG2GD4mEG8Vdqm4N1BTncQmD4PfiTF1f-5KhJRSWwMRcq-8RlNKCrzj_CtIFGQwgDuFySbDq_MMmbZw0c4EFRBY_mxtnFC7u_-5vyLUO0TLMdHlJk4wkX3MYtXmKQx04/s640/device-2012-02-29-220413.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdt9AQGTlkELE95OV_kYCN5fYcKfmX9YGDMABmxe-aZE6mgQPcB7fEQNz2NWJjHDIjBTw-0QIJRrT8yPcrTwDdVewR6gQCKnrqmqGsF1WwpguYL18m-1szUAOCszNGV20z4T0nAwdKXlxj/s1600/device-2012-03-01-165602.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdt9AQGTlkELE95OV_kYCN5fYcKfmX9YGDMABmxe-aZE6mgQPcB7fEQNz2NWJjHDIjBTw-0QIJRrT8yPcrTwDdVewR6gQCKnrqmqGsF1WwpguYL18m-1szUAOCszNGV20z4T0nAwdKXlxj/s640/device-2012-03-01-165602.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZweW_UYUmpwRGjiaFUjGkRPJP8asmZH-D90w210JRF6H0vjMlHHydg9yf9YklD89hy-nZG70Lg7uh7MY_tw_FZkOACpinm-kg-w1KSOkAiwqsgoo15W6brltkLRkTLClumZu_dYWOMmF5/s1600/device-2012-02-29-220429.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZweW_UYUmpwRGjiaFUjGkRPJP8asmZH-D90w210JRF6H0vjMlHHydg9yf9YklD89hy-nZG70Lg7uh7MY_tw_FZkOACpinm-kg-w1KSOkAiwqsgoo15W6brltkLRkTLClumZu_dYWOMmF5/s640/device-2012-02-29-220429.png" width="640" /></a></div>
<br />
Comparison of stylized and non-stylized images:<br />
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEGgUNeP3e51U1OYFxA_3Jxfv3Rvg8AKlSdirE6FXseRVoCM-ov2ELVTef4aTrzmGYkiwMsskCIF5sji4NIEbh5ibB1P7L7Le5GcPruviE-K0WglcMp2UINdeC_PwHw2CRncbn3iRtJSTq/s1600/device-2012-02-29-220517.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEGgUNeP3e51U1OYFxA_3Jxfv3Rvg8AKlSdirE6FXseRVoCM-ov2ELVTef4aTrzmGYkiwMsskCIF5sji4NIEbh5ibB1P7L7Le5GcPruviE-K0WglcMp2UINdeC_PwHw2CRncbn3iRtJSTq/s640/device-2012-02-29-220517.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQ34xWIeGYqRHA4Hh1NYDvADTn63KwXHe0QmpJxqHZ9x5GjVu0_Ge9WP65P5R6hnoHwW7MDsmJWCBIV0v8PbYTB40JKGdEEAxS1RdKxwB1GMeRo6hK5O2R4heWyfS-fOvJpz6QNlKt2zg9/s1600/device-2012-02-29-220533.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQ34xWIeGYqRHA4Hh1NYDvADTn63KwXHe0QmpJxqHZ9x5GjVu0_Ge9WP65P5R6hnoHwW7MDsmJWCBIV0v8PbYTB40JKGdEEAxS1RdKxwB1GMeRo6hK5O2R4heWyfS-fOvJpz6QNlKt2zg9/s640/device-2012-02-29-220533.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSzZPVs5GmtKgFR9rdnAB05qP7eFt790-37075u7-FnUsMPrhjXTWRGLSuAvckx7i8TvANoYZsYVe8HjUg_P7ZmyrL54MzHCGrZ6nC9y_58nu5VvRIhk4mBhLuu0rblacXNGsS0oAoWfzD/s1600/device-2012-03-01-201031.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSzZPVs5GmtKgFR9rdnAB05qP7eFt790-37075u7-FnUsMPrhjXTWRGLSuAvckx7i8TvANoYZsYVe8HjUg_P7ZmyrL54MzHCGrZ6nC9y_58nu5VvRIhk4mBhLuu0rblacXNGsS0oAoWfzD/s640/device-2012-03-01-201031.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<br />Tonyhttp://www.blogger.com/profile/04642084340311831801noreply@blogger.com0tag:blogger.com,1999:blog-1320377861375642139.post-66445724467288619342012-02-29T11:32:00.001-08:002012-02-29T11:33:02.877-08:00Continued agendaFrom my email:<br />
<br />
<div style="border-collapse: collapse;">
<span class="Apple-style-span" style="color: #eeeeee; font-family: inherit;">0) Obviously we can tweak the current shader algorithm. Before we do this, I would like for us to do item #1 below.</span></div>
<div style="border-collapse: collapse;">
<span class="Apple-style-span" style="color: #eeeeee; font-family: inherit;"><br /></span></div>
<div style="border-collapse: collapse;">
<span class="Apple-style-span" style="color: #eeeeee; font-family: inherit;">1) I would like to run a detailed benchmark on all shader operations. I run a recursive approximation to the bilateral filter, for instance, and do a basic Laplacian edge detection. There are many hard-coded parameters for the filters (such as spatial extent), and I would like to know the dependence of the shader runtime on these parameters. I think that this information will be generally useful to the class and Nvidia, for instance.</span></div>
<div style="border-collapse: collapse;">
<span class="Apple-style-span" style="color: #eeeeee; font-family: inherit;"><br /></span></div>
<div style="border-collapse: collapse;">
<span class="Apple-style-span" style="color: #eeeeee; font-family: inherit;">2) We can further work on flash integration. I have all of the necessary framework to copy flash and non-flash images into toggled destinations as we discussed on Sunday. However, we need to work out the details of flash timing. Basically, I find that the non-flash image has lingering flash from the flash-shot.</span></div>
<div style="border-collapse: collapse;">
<span class="Apple-style-span" style="color: #eeeeee; font-family: inherit;"><br /></span></div>
<div style="border-collapse: collapse;">
<span class="Apple-style-span" style="color: #eeeeee; font-family: inherit;">3) We can also think about stereo integration, even independent of flash integration. Here, we need some idea of what it is that we can achieve with stereo shots. Do you have any estimated results on depth calculations from stereo images? (Say, just by taking the difference of two images?)</span></div>
<div style="border-collapse: collapse;">
<span class="Apple-style-span" style="color: #eeeeee; font-family: inherit;"><br /></span></div>
<div style="border-collapse: collapse;">
<span class="Apple-style-span" style="color: #eeeeee; font-family: inherit;">4) I have been interested in the NPR application to augmented reality. I may code up a virtual object that you can put on top of the viewfinder stream.</span></div>Tonyhttp://www.blogger.com/profile/04642084340311831801noreply@blogger.com0tag:blogger.com,1999:blog-1320377861375642139.post-84559604031265271832012-02-29T11:30:00.000-08:002012-02-29T11:30:18.450-08:00Basic perf measurement<div>
<b>Copying CPU-->GPU:</b></div>
<div>
<br /></div>
<div>
Destination 640x480: 18+/-7 ms</div>
<div>
<br /></div>
<div>
<b>Copying GPU-->CPU: </b></div>
<div>
<br /></div>
<div>
Destination 640x480: 31+/11 ms</div>
<div>
<br /></div>
<b>Bilateral filter perf:</b><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqZIRN9TR5tqJIu-1lXMbA2z5HWBhAVbe4tbvORp3qI-53VCjaJD9e09EgisG1CN3yjiBFfURolbrlz1q8apAKfh2-YGfJDi6Mj2XcXXFfIewhB-G3Wj5gG6pOxbQ8yCvSsy_UgrWWYEuQ/s1600/20120229_basicperf.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="246" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqZIRN9TR5tqJIu-1lXMbA2z5HWBhAVbe4tbvORp3qI-53VCjaJD9e09EgisG1CN3yjiBFfURolbrlz1q8apAKfh2-YGfJDi6Mj2XcXXFfIewhB-G3Wj5gG6pOxbQ8yCvSsy_UgrWWYEuQ/s640/20120229_basicperf.png" width="640" /></a></div>
<div>
<br /></div>Tonyhttp://www.blogger.com/profile/04642084340311831801noreply@blogger.com0tag:blogger.com,1999:blog-1320377861375642139.post-77219907239474240862012-02-28T17:41:00.001-08:002012-02-28T18:18:27.041-08:00Shader workflow -- The "underlying reasons"Recap of last week's work.<br />
<br />
After few days of serious thinking, I decided to implement the GPU flow in the underlying C loop of the FCam application, rather than the OnDrawFrame rendering thread on Java. Here was my <span class="Apple-style-span" style="color: blue;">pro</span>/<span class="Apple-style-span" style="color: red;">con</span> list:<br />
<br />
Java:<br />
<ul>
<li><span class="Apple-style-span" style="color: blue;">The rendering thread already makes use of the GPU. Having multiple GPU access points, i.e. in the Java thread and the C loop, seemed redundant. I was annoyed, for instance, at the prospect of having to do multiple RGB<-->YUV conversions.</span></li>
<li><span class="Apple-style-span" style="color: blue;">We had already worked on a shader in Java-side.</span></li>
<li><span class="Apple-style-span" style="color: red;">On the Java thread after "TripleBuffer", I didn't know how to implement multiple frames for flash/no-flash fusion.</span></li>
<li><span class="Apple-style-span" style="color: red;">I also did not figure out how to do multiple shader passes on the same image.</span></li>
</ul>
<div>
C:</div>
<div>
<ul>
<li><span class="Apple-style-span" style="color: blue;">Full control. I knew how to do multiple SharedBuffers, as well as how to do multiple shader passes.</span></li>
<li><span class="Apple-style-span" style="color: blue;">I realized that I did not have to do the RGB conversion if I didn't want to, even if the buffer itself was set up as 4-byte RGBA (8888). I would just use the R byte for Y, G for U, etc.</span></li>
<li><span class="Apple-style-span" style="color: blue;">I personally prefer C to Java.</span></li>
<li><span class="Apple-style-span" style="color: red;">Had to do an extra copy of the image from 'frame.image' to the SharedBuffers.</span></li>
<li><span class="Apple-style-span" style="color: red;">Multiple places in code access GPU (C and Java). Maybe a bit less elegant.</span></li>
</ul>
<div>
<br />
Ultimately, I had to choose the C implementation because I had spent at least one full day and could not figure out how to do multi-pass shading in Java. I had not even attempted to figure out how to do multiple frame-buffers (for flash/no-flash fusion).</div>
</div>
<div>
<br /></div>
<div>
The shader pipeline in the C thread looks like the following:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqpoVzfK_0WZkOWqOowgF32mfNHfrGY2-_jKolip43xBWIVWlvPq6JIX4ZuyMaq5kZbMfC5Mf7g8JyagjukGQiRQBUgfJ9l3JHRUZn1p-j1m6AJ7il1DJ0fozG85sHqOOx-ZQl8I65JheB/s1600/gpuprocessing.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="172" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqpoVzfK_0WZkOWqOowgF32mfNHfrGY2-_jKolip43xBWIVWlvPq6JIX4ZuyMaq5kZbMfC5Mf7g8JyagjukGQiRQBUgfJ9l3JHRUZn1p-j1m6AJ7il1DJ0fozG85sHqOOx-ZQl8I65JheB/s640/gpuprocessing.png" width="640" /></a></div>
<br /></div>
<div>
<br /></div>Tonyhttp://www.blogger.com/profile/04642084340311831801noreply@blogger.com0tag:blogger.com,1999:blog-1320377861375642139.post-6325080662287548582012-02-28T17:27:00.000-08:002012-02-28T20:56:40.401-08:00NPR updateFor the last week or so, I have fallen into the terrible habit of not documenting my progress. Details to come.<br />
<br />
Results first! The first demonstration of NPR, at "pretty okay" frame rates (~10 FPS).<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilEJ3oj94JxK74jwFl_76UIkFXNIZ28K1g7BtDKdR9_lK3hbFs5Z8ZeeRRjj3efjR8sKwF7E5gPbx7_BqW6B3WCI2lmEaYm6SQTPUndr1EeGPJ0mE9Pm2K4x7hcPZ-fZ3ViZr8KZIwXv0j/s1600/20120228_legomodel.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilEJ3oj94JxK74jwFl_76UIkFXNIZ28K1g7BtDKdR9_lK3hbFs5Z8ZeeRRjj3efjR8sKwF7E5gPbx7_BqW6B3WCI2lmEaYm6SQTPUndr1EeGPJ0mE9Pm2K4x7hcPZ-fZ3ViZr8KZIwXv0j/s320/20120228_legomodel.JPG" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0PUJWjH26H-QCWNCEDkr9bNbnd4tkzJdM-AUIZQIaEr5vvJng-OeOTSoRQeYg7gIeiVYVrijUHild9AT2i19DCR8I2xA05_PiKpSTALM6RTf8apAz_bWtCcXNyfGZHwJOGL2VGtbORLmg/s1600/20120228_legomodel2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0PUJWjH26H-QCWNCEDkr9bNbnd4tkzJdM-AUIZQIaEr5vvJng-OeOTSoRQeYg7gIeiVYVrijUHild9AT2i19DCR8I2xA05_PiKpSTALM6RTf8apAz_bWtCcXNyfGZHwJOGL2VGtbORLmg/s320/20120228_legomodel2.JPG" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Learned that you can just take screenshots straight off the device, using Eclipse:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6zzkrAJZtKb18um5oBy9yB7T2F2g-kdO88LXFvpe0le_X047IT6dR2pESDIlgXD_dUUGQIJzTQAAyYi-GcSfo_lOK9GuXXEnFNgtsBrAI4tr7GYmYeHtWdQmZW3yTNttrDwGZ25JxSLK5/s1600/device-2012-02-28-205110.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="356" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6zzkrAJZtKb18um5oBy9yB7T2F2g-kdO88LXFvpe0le_X047IT6dR2pESDIlgXD_dUUGQIJzTQAAyYi-GcSfo_lOK9GuXXEnFNgtsBrAI4tr7GYmYeHtWdQmZW3yTNttrDwGZ25JxSLK5/s640/device-2012-02-28-205110.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEAUldkvGPylRXzb-_fnKzu-hC8Ikd9v8Mik7jMU3Vwf1_QJiJYMmUtrstdW_vZrHWrZiY7YK7HPZGGbPLuTsdZH-mGWVj5ZoX2cMwvk-xqXmB_fB7PhD_fS9hea3CH0oCIpzbAe7cWsWV/s1600/device-2012-02-28-205504.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="356" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEAUldkvGPylRXzb-_fnKzu-hC8Ikd9v8Mik7jMU3Vwf1_QJiJYMmUtrstdW_vZrHWrZiY7YK7HPZGGbPLuTsdZH-mGWVj5ZoX2cMwvk-xqXmB_fB7PhD_fS9hea3CH0oCIpzbAe7cWsWV/s640/device-2012-02-28-205504.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<br />Tonyhttp://www.blogger.com/profile/04642084340311831801noreply@blogger.com0tag:blogger.com,1999:blog-1320377861375642139.post-55087418295344717062012-02-21T14:51:00.001-08:002012-02-21T15:52:10.065-08:00Multiple passes with GLSL<a href="http://stackoverflow.com/questions/5421419/how-could-possibly-gl-readpixels-depend-on-shader-complexity">This</a> is what I want to do!<br />
<br />
How do I do it? Perhaps <a href="http://www.swiftless.com/tutorials/opengl/framebuffer.html">helpful</a>. And perhaps <a href="http://www.gpgpu.org/forums/viewtopic.php?t=5960&sid=a8f0ee6628463b77e723b140a2518a80">this guy</a> does exactly what I want to do.Tonyhttp://www.blogger.com/profile/04642084340311831801noreply@blogger.com0tag:blogger.com,1999:blog-1320377861375642139.post-15394774133545091952012-02-15T19:47:00.000-08:002012-02-15T21:51:44.308-08:00Parametrized shader and gesturesI implemented some basic swipe actions on the viewfinder, and hooked it up with the blurring shader. Left-right swipes control the size of the Gaussian filter. Vertical swipe basically resets it to the non-blurred state.<br />
<br />
Seems like getting multi-touch gestures might be trickier: <a href="http://android-developers.blogspot.com/2010/06/making-sense-of-multitouch.html">"Making sense of multitouch"</a><br />
<br />
At this point, it might be also worth it to clean up and optimize the shader, and to implement a kind of a cooler filter.<br />
<br />
The fact that we're in RGB in shader is a bit inconvenient. Where does FCam::Frame get converted into RGB? Can I delay it?<br />
<br />
Some info on bilateral filtering implementations:<br />
<ul>
<li><a href="http://vision.lbl.gov/Conferences/cvpr/Papers/data/papers/2161.pdf">Real-time bilateral filtering</a></li>
<li><a href="http://elynxsdk.free.fr/ext-docs/Bilateral/ICME2005_TPLV.pdf">Separable bilateral filtering for fast video preprocessing</a></li>
</ul>Tonyhttp://www.blogger.com/profile/04642084340311831801noreply@blogger.com0tag:blogger.com,1999:blog-1320377861375642139.post-16833752105076712222012-02-14T10:56:00.000-08:002012-02-14T12:45:24.979-08:00Gaussian blur shaderYes, it turned out to be so much simpler to programmatically manipulate the viewfinder shader from the Java-side, specifically from CameraView::onDrawFrame.<br />
<div>
<br /></div>
<div>
Let's implement a Gaussian shader and programmatically program the filter dimensions.<br />
<br />
Ok, I now have a programmatically parameterized Gaussian-like filter. Remarks:<br />
<br />
<ul>
<li>Some thought should go into the logical organization of code,</li>
<li>Beginning to see some preceivable frame-rate drop from the simple viewfinder. </li>
</ul>
</div>Tonyhttp://www.blogger.com/profile/04642084340311831801noreply@blogger.com0tag:blogger.com,1999:blog-1320377861375642139.post-74136158801107692142012-02-12T18:08:00.001-08:002012-02-12T23:41:19.635-08:00Shader workflowObservations on the apparent shader workflow, in Timo's example:<br />
<div>
<ol>
<li>Push the fragment shader to a known location in the tablet. </li>
<li>Declare shader via "setup_shader" on the push path; nv_set_attrib_by_name (?)</li>
<li>Declare SharedBuffers sbuf_in, sbuf_2</li>
<li>Initialize sbuf_in by sbuf_in->map</li>
<li>glUseProgram(shader)</li>
<li>sbuf_in->bindAsTexture2D()</li>
<li>sbuf_out->makeCurrentSurface()</li>
<li>glDrawArrays</li>
<li>glFinish</li>
</ol>
<div>
I've now integrated the above framework into FCam main loop. However, I haven't yet worked out the conversion of the FCam frame data into the SharedBuffer memory. Nevertheless, I've learned a few things:<br />
<br />
<ul>
<li>Running the "manual" shader will compete with the shader that is already in place for the Viewfinder. Thankfully, there's nothing really jarring, because the viewfinder simply doesn't update for the period that you've hijacked the GPU, which is a fraction of a second in the test shader that I'm using ("feature.frag" from Nvidia).</li>
<li>At the same time, I found that CameraView::onDrawFrame is doing basically all the steps in Java that I've now integrated into the C++ loop. Given that it is feasible to parametrize the shader at runtime, doing the image processing in this "Viewfinder shader" directly seems like the way to go.</li>
<li>Importantly, Timo's example shows that it is possible to hook up two texture buffers to a single shader, to do some fusion-based image processing. We should aim to implement this in the Viewfinder shader.</li>
<li><b>Yes</b>,<b> that is the most natural way to do things. Let's set up a cascade (if needed) of programmable shaders in the CameraView::onDrawFrame routine.</b></li>
</ul>
<br />
<br />
What do the GLSL keywords mean?</div>
</div>
<div>
<ul>
<li>Uniform: read only. Set from the CPU source as follows:</li>
<ul>
<li>int location = glGetUniformLocation(shaderIdx,"attributeName");</li>
<li><a href="http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml">glUniform4fv</a>(location,1,value)</li>
</ul>
<li>Attribute: read-only in vertex shader</li>
<li>Varying: data is transferred from vertex to fragment shader. Read-only in fragment.</li>
<ul>
</ul>
</ul>
</div>
<div>
Maybe useful links:</div>
<div>
<ul>
<li><a href="http://nehe.gamedev.net/article/glsl_an_introduction/25007/">GLSL Introduction</a></li>
<li><a href="http://www.lighthouse3d.com/tutorials/glsl-tutorial/">GLSL 1.2 Tutorial</a></li>
</ul>
</div>Tonyhttp://www.blogger.com/profile/04642084340311831801noreply@blogger.com0tag:blogger.com,1999:blog-1320377861375642139.post-47423774827384220802012-02-11T22:33:00.001-08:002012-02-12T19:04:59.398-08:00SharedBufferFirst things first. I want to find out how to share buffer between CPU and GPU, so that I can control the GPU filter parameters "live". Nvidia guys supposedly provided an example that demonstrates this. I was able to run the program. Let's see if I can dissect it.<br />
<br />
NB: The second shader "ridge.frag" uses two source textures. Great for image fusion!<br />
<br />
Here are the input and output images (feature.frag and ridge.frag) provided:<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2XBksSsPmg-FiEhNMLQAbryomfH2NXLAWaELkveKOkwzWl7T4d5asz7S2ra-s8o_cpm0-B2LvdYydk4ZUUsSohMQzUNo5KgWo3RCHF-HQgnP-85SCrTczqTzfygc23HI4SsZWB4OdOeNq/s1600/superman-logo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="151" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2XBksSsPmg-FiEhNMLQAbryomfH2NXLAWaELkveKOkwzWl7T4d5asz7S2ra-s8o_cpm0-B2LvdYydk4ZUUsSohMQzUNo5KgWo3RCHF-HQgnP-85SCrTczqTzfygc23HI4SsZWB4OdOeNq/s200/superman-logo.png" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCbN_J9IdO1Fims0DF_HVoOkmsCadBsBBc9XCYGG4p-gBqrVrkiYu_hInA_yx3LCHZd3gLooTfYqUbFPD-yo4WN7uXB4TcZZsxDxxqaktb4J2k_rfZ0NHo-FNUZCqMMW5CPoc0blY51Fsi/s1600/feature.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="151" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCbN_J9IdO1Fims0DF_HVoOkmsCadBsBBc9XCYGG4p-gBqrVrkiYu_hInA_yx3LCHZd3gLooTfYqUbFPD-yo4WN7uXB4TcZZsxDxxqaktb4J2k_rfZ0NHo-FNUZCqMMW5CPoc0blY51Fsi/s200/feature.png" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoN4qCu0TfiHS60XjQFP65yUv0vKmoPb6K9bMg0waivbACJrnaiy5Jzo3HYP9CpvWvP7XlWeVjvjlyL-ITeE1G0tu7VOdVlWmdkDMo2TVYduCnvEdo4boyUhsgkGGKHygkr2Ks8M7ZvWS8/s1600/result.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="151" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoN4qCu0TfiHS60XjQFP65yUv0vKmoPb6K9bMg0waivbACJrnaiy5Jzo3HYP9CpvWvP7XlWeVjvjlyL-ITeE1G0tu7VOdVlWmdkDMo2TVYduCnvEdo4boyUhsgkGGKHygkr2Ks8M7ZvWS8/s200/result.png" width="200" /></a></div>
<br />
Timo's fixed vertex shader ("FULLSCREEN_QUAD_VERTEX_SHADER"), in readable form:<br />
<br />
attribute mediump vec2 pos_attr<br />
attribute mediump vec2 uv_attr<br />
varying mediump vec2 outUV0<br />
<br />
void main()<br />
{<br />
gl_Position = vec4(pos_attr,0.0,1.0);<br />
outUV0 = uv_attr;<br />
}<br />
<br />
* * *<br />
<br />
What is EGL? <a href="http://android-dls.com/wiki/index.php?title=EGL_notes">"EGL is an API for giving direct control over creation of OpenGL contexts that render to on-screen windows, offscreen pixmaps, or additional graphics-card memory."</a><br />
<br />
To get the example (written by Timo Stich at Nvidia) ported to FCam environment:<br />
<ol>
<li>Copy over the libraries from the tablet to NDK as per Timo's instructions. (Slight typo in his filenames.)</li>
<li>Merge Timo's makefile configuration 'Android.mk' to the FCam project you are working on. In particular, link 'cutils.so'.</li>
</ol>
<div>
With these steps, it should now be possible to declare SharedBuffer and the shader-related functions from the FCam source.</div>
<div>
<br /></div>
Also might be an interesting read:<br />
<ul>
<li><a href="http://snorp.net/2011/12/16/android-direct-texture.html">Using direct textures on Android</a></li>
<li><a href="https://plus.google.com/105051985738280261832/posts/2FXDCz8x93s">Android graphics "facts"</a></li>
</ul>Tonyhttp://www.blogger.com/profile/04642084340311831801noreply@blogger.com0