<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-28093388</id><updated>2012-01-19T14:32:00.455-08:00</updated><category term='gephex'/><category term='openscenegraph'/><category term='laser'/><category term='processing'/><category term='bundler'/><category term='opencv'/><category term='structuredlight'/><category term='lidar'/><category term='robotics'/><category term='ec2'/><category term='3d'/><category term='octave'/><category term='rangefinder'/><category term='django'/><category term='tip'/><category term='matlab'/><category term='photo'/><category term='velodyne'/><category term='python'/><category term='gimp'/><category term='artoolkit'/><category term='video'/><category term='photosynth'/><category term='bullet'/><category term='mewantee'/><category term='dorkbot'/><title type='text'>binarymillenium</title><subtitle type='html'>My videos and photographs, and other creative efforts.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://binarymillenium.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default?start-index=101&amp;max-results=100'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>106</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-28093388.post-4378386414732950233</id><published>2011-11-23T20:03:00.001-08:00</published><updated>2011-11-28T13:07:09.300-08:00</updated><title type='text'>Lunar DTM100 to Blender displacment map</title><content type='html'>&lt;div&gt;This post is an aggregration of multiple threads created on google plus and additional findings, the scattered nature of those threads made it impossible to find all the information in one place hence this post. &amp;nbsp; It's also a work in progress with some blank spots- help is welcome!&lt;br /&gt;&lt;br /&gt;(I've mostly moved to google plus which is great for mini-blogging (as opposed to the micro blogging of twitter and full size regular blogger blogging) and has very good engagement once you find good people to put in your circles. &amp;nbsp;I expect greater plus/blogger integration in the future probably starting with comments becoming plusified.)&lt;br /&gt;&lt;br /&gt;&lt;table style="width: auto;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="https://picasaweb.google.com/lh/photo/Xv6S3L3VANIMyLaK05bDp9MTjNZETYmyPJy0liipFm0?feat=embedwebsite"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;img height="356" src="https://lh5.googleusercontent.com/-D0fHb1b33lM/TsxG2-0tkZI/AAAAAAAAJKU/472LzseXddI/s144" width="500" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align: right;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;From&amp;nbsp;&lt;a href="https://picasaweb.google.com/wsacul/LROCLunarMap?authuser=0&amp;amp;feat=embedwebsite"&gt;LROC Lunar Map&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Lunar Elevation Data&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Source DTM files are in the IMG files:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;a class="ot-anchor" href="http://lroc.sese.asu.edu/data/LRO-L-LROC-5-RDR-V1.0/LROLRC_2001/DATA/SDP/WAC_DTM/" style="background-color: white; color: #3366cc; cursor: pointer; line-height: 18px; text-decoration: none;"&gt;http://lroc.sese.asu.edu/data/LRO-L-LROC-5-RDR-V1.0/LROLRC_2001/DATA/SDP/WAC_DTM/&lt;/a&gt;&lt;span class="Apple-style-span" style="background-color: white; line-height: 18px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;The highest resolution maps are in the&amp;nbsp;&lt;/span&gt;100M.IMG&amp;nbsp;files, which means 100 meters/pixel (which seems large for an object so close as the moon- why don't we have 1 meter per pixel, or 0.1 meter yet?).&lt;br /&gt;&lt;br /&gt;I haven't written a script for handling the files that don't completely cover the lunar globe, and will probably use other tools to get that right. &amp;nbsp;(grass gis&amp;nbsp;&lt;a href="http://grass.fbk.eu/gdp/index.php"&gt;http://grass.fbk.eu/gdp/index.php&lt;/a&gt;?)&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;TBD detail on file format.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Generating 32-bit elevation tifs with Python&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a class="ot-anchor" href="http://code.google.com/p/binarymillenium/source/browse/trunk/python/lroc_to_vtx.py" style="background-color: white; color: #3366cc; cursor: pointer; line-height: 18px; text-decoration: none;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;http://code.google.com/p/binarymillenium/source/browse/trunk/python/lroc_to_vtx.py&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;span style="background-color: white; line-height: 18px;"&gt;Current 32-bit tifs:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;a href="https://docs.google.com/open?id=0BwP06t4a405kNDFhNjE3NTUtNTc2YS00NjFlLWExNTgtOTBkZjVmM2M0MGM2" style="background-color: white; color: #3366cc; line-height: 18px; text-decoration: none;" target="_blank"&gt;https://docs.google.com/open?&lt;wbr&gt;&lt;/wbr&gt;id=&lt;wbr&gt;&lt;/wbr&gt;0BwP06t4a405kNDFhNjE3NTUtNTc2Y&lt;wbr&gt;&lt;/wbr&gt;S00NjFlLWExNTgtOTBkZjVmM2M0MGM&lt;wbr&gt;&lt;/wbr&gt;2&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br style="background-color: white; line-height: 18px;" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;a href="https://docs.google.com/open?id=0BwP06t4a405kMzA0MGMzY2ItZGJmZC00NDI2LWE5NmYtYjM1ZTI5MmQ1OWZh" style="background-color: white; color: #3366cc; line-height: 18px; text-decoration: none;" target="_blank"&gt;https://docs.google.com/open?&lt;wbr&gt;&lt;/wbr&gt;id=&lt;wbr&gt;&lt;/wbr&gt;0BwP06t4a405kMzA0MGMzY2ItZGJmZ&lt;wbr&gt;&lt;/wbr&gt;C00NDI2LWE5NmYtYjM1ZTI5MmQ1OWZ&lt;wbr&gt;&lt;/wbr&gt;h&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br style="background-color: white; line-height: 18px;" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="https://docs.google.com/open?id=0BwP06t4a405kNzM3ODIyZjktOWM3MC00NDJlLWI3ZGYtNGIwMWRmMWJjYTUz" style="background-color: white; color: #3366cc; line-height: 18px; text-decoration: none;" target="_blank"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;https://docs.google.com/open?&lt;wbr&gt;&lt;/wbr&gt;id=&lt;wbr&gt;&lt;/wbr&gt;0BwP06t4a405kNzM3ODIyZjktOWM3M&lt;wbr&gt;&lt;/wbr&gt;C00NDJlLWI3ZGYtNGIwMWRmMWJjYTU&lt;wbr&gt;&lt;/wbr&gt;z&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;b&gt;Conversion to viewable&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Not a lot of programs can display those 32-bit tifs correctly, and Blender didn't like them. &amp;nbsp;Get a version of imagemagick with hdri enabled (./configure --enable-hdri when building it from source) so they can be converted to friendlier formats.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Making an easier to view jpg from the 32-bit tifs:&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;convert -define quantum:scale=255.0 -normalize moon.tif moon_fromtif.jpg&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;And the following is the result:&lt;/span&gt;&lt;br /&gt;&lt;table style="width: auto;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="https://picasaweb.google.com/lh/photo/-V7RXQLsAGzZNlKXUsa749MTjNZETYmyPJy0liipFm0?feat=embedwebsite"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align: right;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-k67XFc5srBk/Ts3PxYTrY7I/AAAAAAAAJLE/y7q_dRvBRbk/s1600/WAC_GLD100_E000N1800_032P_norm_downsized.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="72" src="https://lh6.googleusercontent.com/-k67XFc5srBk/Ts3PxYTrY7I/AAAAAAAAJLE/y7q_dRvBRbk/s144/WAC_GLD100_E000N1800_032P_norm_downsized.jpg" width="144" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;From&amp;nbsp;&lt;a href="https://picasaweb.google.com/wsacul/LROCLunarMap?authuser=0&amp;amp;feat=embedwebsite"&gt;LROC Lunar Map&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The jpeg is usable in Blender but doesn't hold up well with a lot of zooming- the 255 levels of elevation possible in a jpeg produce stair step artifacts:&lt;br /&gt;&lt;table style="width: auto;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="https://picasaweb.google.com/lh/photo/4aD7wu5CE12GtVpmghsKBdMTjNZETYmyPJy0liipFm0?feat=embedwebsite"&gt;&lt;img height="80" src="https://lh3.googleusercontent.com/-oHyfDDEdQxs/TswNuXCFHwI/AAAAAAAAJJc/pxIzMr8oprE/s144/moon_quantized.png" width="144" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"&gt;From &lt;a href="https://picasaweb.google.com/wsacul/LROCLunarMap?authuser=0&amp;amp;feat=embedwebsite"&gt;LROC Lunar Map&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;b&gt;Conversion to blender usable&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;So Blender&lt;span class="Apple-style-span" style="font-family: inherit;"&gt; could use a 16-bit format like openexr for 255x smoother gradations, use this conversion:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: white; color: #222222;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;convert -define quantum:scale=255.0 moon.tif moon.exr&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: white; color: #222222;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: white; color: #222222;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;The quantum scale there seems like it ought to be 65535.0 but the 255.0 works, and imagemagick identify -verbose shows that the range of values is 65535.0.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;b&gt;Setting up image based displacement + bump in Blender 2.6x Cycles (latest svn)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;TBD flesh this out in greater detail&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Add | Mesh | UV sphere&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Object Modifies | Add Modifier | Subdivision Surface | Render 6&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Material | Surface | Use Nodes&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Shift-A | Texture | Image Texture | Open moon.exr&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Connect the color to the diffuse bsdf, then should see texture on sphere if in texture or render view mode (maybe have to do something to force redraw/update).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Edit Mode | Select all edges&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Mesh | UV Unwrap | Sphere projection | Align to object&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Connect image texture to color to bw converter and then to displacement input on material output. &amp;nbsp;TBD proper height scaling of craters.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Object Data | Displacement | Method | Both&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Link to .blend file:&lt;br /&gt;&lt;br /&gt;&lt;span class="zj"&gt;&lt;a class="ot-anchor" href="http://goo.gl/ZrPJ8"&gt;http://goo.gl/ZrPJ8&lt;/a&gt;&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;table style="width: auto;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="https://picasaweb.google.com/lh/photo/Z5zT1e3oEWTnEtsic-Kb_NMTjNZETYmyPJy0liipFm0?feat=embedwebsite"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;img height="250" src="https://lh3.googleusercontent.com/-3f2yDhWKuWk/TsyKj2GrDnI/AAAAAAAAJKo/YBKPLD1A4z4/s144" width="500" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align: right;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;From &lt;a href="https://picasaweb.google.com/wsacul/LROCLunarMap?authuser=0&amp;amp;feat=embedwebsite"&gt;LROC Lunar Map&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;b&gt;UV Sphere Projection Polar Problems&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;The UV spheres generated by blender have the problem of having triangles instead of quads around the poles. &amp;nbsp;The spherical projection will produce distortion at the poles, smoothing the sphere prior to uv unwrap helps minimize it. &amp;nbsp;I wonder if there is something problematic about making the pole polygons quads because it would involve multiple polygon points and edges right on top of each other.&lt;br /&gt;&lt;br /&gt;You can see the problem areas in the uv image below- the nice quad projections become distorted triangles at the top and bottom. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-L5u-bg2c60I/TtP1WtKs0YI/AAAAAAAAJZk/Lpz2q6Qhodw/s1600/blender_uv_sphere_problems.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="134" src="http://4.bp.blogspot.com/-L5u-bg2c60I/TtP1WtKs0YI/AAAAAAAAJZk/Lpz2q6Qhodw/s320/blender_uv_sphere_problems.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The result is these pinched areas:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-OACAPVoHsbc/TtP1yNwHegI/AAAAAAAAJZs/ket-RScJ5k8/s1600/blender_uv_sphere_distortion.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="154" src="http://2.bp.blogspot.com/-OACAPVoHsbc/TtP1yNwHegI/AAAAAAAAJZs/ket-RScJ5k8/s320/blender_uv_sphere_distortion.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;b&gt;Lunar Visual Mosaics&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;The moon isn't perfectly grey, there are many interesting light and dark features. &amp;nbsp;I haven't located a good texture generated from LROC or Clementine data (LROC would be ideal since it would probably guarantee all visual features line up with elevation features). &lt;br /&gt;&lt;br /&gt;&lt;a href="http://wms.lroc.asu.edu/lroc/wac_mosaic"&gt;http://wms.lroc.asu.edu/lroc/wac_mosaic&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ser.sese.asu.edu/MOON/clem_color.html"&gt;http://ser.sese.asu.edu/MOON/clem_color.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There are some random ones to be found on the web but I haven't tried them yet.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;b&gt;Future&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Grass gis&amp;nbsp;&lt;a href="http://grass.fbk.eu/gdp"&gt;http://grass.fbk.eu/gdp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;gdal - has python bindings &amp;nbsp; &amp;nbsp;(ubuntu intall&amp;nbsp;python-gdal gdal-bin) &amp;nbsp;&lt;a href="http://www.gdal.org/"&gt;http://www.gdal.org/&lt;/a&gt;&lt;br /&gt;Turn python generated tiff images into geotiffs&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;osgearth - uses geotiff output from gdal to produce lod/paged terrain databases viewable in OpenSceneGraph osgviewer.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Use 100M data (the 256P IMG files). &amp;nbsp;Parse dtm within python to do this? &amp;nbsp;Minimum is extracting width x height.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;b&gt;Sources&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Original discussions that originated this post:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://feeds.laughingsquid.com/~r/laughingsquid/~3/mGUeRmGUfu0/"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;http://feeds.laughingsquid.com/~r/laughingsquid/~3/mGUeRmGUfu0/&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="https://plus.google.com/u/0/107180534974005900062/posts/713nRXGEhn7"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;https://plus.google.com/u/0/107180534974005900062/posts/713nRXGEhn7&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="https://plus.google.com/u/0/116599331662269985445/posts/5GJw1T8Tu27"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;https://plus.google.com/u/0/116599331662269985445/posts/5GJw1T8Tu27&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="https://plus.google.com/u/0/103190342755104432973/posts/1krmFVvnh7d"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;https://plus.google.com/u/0/103190342755104432973/posts/1krmFVvnh7d&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-4378386414732950233?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/4378386414732950233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=4378386414732950233' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/4378386414732950233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/4378386414732950233'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2011/11/lunar-dtm100-to-blender-displacment-map.html' title='Lunar DTM100 to Blender displacment map'/><author><name>Lucas</name><uri>http://www.blogger.com/profile/12190442172800693364</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-bkzT-UgMiJM/Tl725nnsrII/AAAAAAAAFvo/LFQoBelib6k/s1600/photo.jpg%253Fsz%253D200'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh5.googleusercontent.com/-D0fHb1b33lM/TsxG2-0tkZI/AAAAAAAAJKU/472LzseXddI/s72-c/s144' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-7084031683020050747</id><published>2011-01-30T15:49:00.000-08:00</published><updated>2011-05-08T09:04:55.171-07:00</updated><title type='text'>Google Docs Storage</title><content type='html'>I've been playing with google docs storage for about a month.  The user interface is inferior to &lt;a href="http://aws.amazon.com/s3/"&gt;Amazon S3&lt;/a&gt; + &lt;a href="http://www.s3fox.net/"&gt;S3Fox&lt;/a&gt; in every way, but for 1/5th the cost I'm willing to put up with it (though it's only 1/5th the cost if I fill up all the storage for the given price tier, I think they expect most users not to use a large fraction).  AVIs and JPEGs can be dragged-and-dropped in quantity, but NEF and .ini files have to use the 'select more pictures' dialog which can only handle 10-15 files at a time (otherwise a strange character appears instead of a list of all the files).  Upload speeds seem good (a megabyte every 3 seconds or so), better than I remember S3 being last time I tried it.&lt;br /&gt;&lt;br /&gt;There are some linux filesystem programs that can mount my entire google online storage (including blog posts), but only allow uploading of the google docs formats and not any file at all like can be done with the upload dialog.  Hopefully this changes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;5/8/2011 update&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Folder upload is now possible (no more shift selecting the contents of a folder and having to cut and paste folder names), and it looks like subfolders are uploaded properly.  But sometimes a file fails to upload properly, and using the file method it was possible to see which file failed and re-queue for upload.  Now after I've uploaded a folder with 90 items and it took 20 minutes, there is an error message saying that one file failed to upload, but no way to know which one.  Retry fails repeatedly.  &lt;a href="http://www.google.com/support/forum/p/Google+Docs/thread?tid=6f9fda70c3b02ce5&amp;hl=en"&gt;Some reports of same&lt;/a&gt;, though I haven't seen the other bugs mentioned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-7084031683020050747?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/7084031683020050747/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=7084031683020050747' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/7084031683020050747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/7084031683020050747'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2011/01/google-docs-storage.html' title='Google Docs Storage'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-129727953044804757</id><published>2010-12-14T20:46:00.000-08:00</published><updated>2010-12-14T21:05:56.778-08:00</updated><title type='text'>OpenGameArt</title><content type='html'>You can't help but want to make a 2d overhead or isometric game after looking at some of the art available on &lt;a href="http://opengameart.org"&gt;OpenGameArt&lt;/a&gt;- I'll settle for a little procedural terrain generation:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_apbW4BHhLTg/TQhK9r1_wcI/AAAAAAAACuM/Nqu5fWO-Rtg/s1600/screenshot.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 251px;" src="http://4.bp.blogspot.com/_apbW4BHhLTg/TQhK9r1_wcI/AAAAAAAACuM/Nqu5fWO-Rtg/s400/screenshot.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5550768964335813058" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.openprocessing.org/visuals/?visualID=16704"&gt;http://www.openprocessing.org/visuals/?visualID=16704&lt;/a&gt;  (click run if it asks about running old java)&lt;br /&gt;&lt;br /&gt;The OGA site could use more contributors, as well as better organization to promote the best work- and of course it could be popularized by making use of the content there.  I think I'll use this and some variations at the next VJ event I do- I've used recorded video from games before, but even better to generate some game-like imagery live.&lt;br /&gt;&lt;br /&gt;Another useful feature would be for terrain tilesets to have a standard connectivity definition file- an ascii file that says which tiles connect best to which neighbors in which direction.  Current that's hardcoded into the processing sketch.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-129727953044804757?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://opengameart.org' title='OpenGameArt'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/129727953044804757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=129727953044804757' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/129727953044804757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/129727953044804757'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2010/12/opengameart.html' title='OpenGameArt'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_apbW4BHhLTg/TQhK9r1_wcI/AAAAAAAACuM/Nqu5fWO-Rtg/s72-c/screenshot.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-1250683113802662525</id><published>2010-12-07T18:38:00.000-08:00</published><updated>2010-12-07T18:43:45.779-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gephex'/><title type='text'>Gephex 0.4.3b built on 64-bit Ubuntu 10.10</title><content type='html'>I haven't found a better graph-based VJ tool than Gephex to use in Linux or Windows (but haven't been looking much either), and it's not trivial to get it running on a modern Ubuntu system- but I've worked through all the compiler messages (with the big exception of leaving out ffmpeg) and have an archive of the results available for download.&lt;br /&gt;&lt;br /&gt;Go here for details and a link to the download:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/binarymillenium/wiki/Gephex64BitBuild"&gt;http://code.google.com/p/binarymillenium/wiki/Gephex64BitBuild&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The reconfiguring may screw it up a little, otherwise let it install to my choice of directories and then move the bin and lib etc. files as appropriate.&lt;br /&gt;&lt;br /&gt;I'm hoping there is a new and well-supported tool out there that can take the place of gephex- &lt;a href="http://movid.org/"&gt;movid&lt;/a&gt; is not intended for VJ work but may be retrofittable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-1250683113802662525?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://code.google.com/p/binarymillenium/wiki/Gephex64BitBuild' title='Gephex 0.4.3b built on 64-bit Ubuntu 10.10'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/1250683113802662525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=1250683113802662525' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/1250683113802662525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/1250683113802662525'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2010/12/gephex-043b-built-on-64-bit-ubuntu-1010.html' title='Gephex 0.4.3b built on 64-bit Ubuntu 10.10'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-7251136619810853466</id><published>2010-08-23T19:30:00.000-07:00</published><updated>2010-09-06T09:55:00.143-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bullet'/><title type='text'>First Steps in Bullet physics</title><content type='html'>I've played with &lt;a href="http://www.ode.org/"&gt;ODE&lt;/a&gt; for several small projects, but recently discovered &lt;a href="http://bulletphysics.org/wordpress/"&gt;Bullet physics&lt;/a&gt; while looking through &lt;a href="http://www.ros.org/wiki/"&gt;ROS&lt;/a&gt; (Robot Operating System) documentation.  The difference in rigid body simulation between the two is not that obvious, the Bullet rigid body demos seem very impressive and perhaps speedier than ODE.  But the soft body physics have no equivalent in ODE, and seem very worthy of investigation- and equally intriguing are the decomposition capabilities, where objects can be shattered into smaller pieces with a function call (it may be more difficult than that, I haven't looked at the code yet).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_apbW4BHhLTg/THMy4c3cHVI/AAAAAAAACq4/Yiq44tmmXYw/s1600/bullet_soft.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_apbW4BHhLTg/THMy4c3cHVI/AAAAAAAACq4/Yiq44tmmXYw/s400/bullet_soft.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5508802714607033682" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There is a good forum, not a ton of documentation or second-party dispersed know-how in the form of tutorials especially for the soft body physic, but the demo code is great- and beyond that it comes down to experimentation.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Soft bodies from 3d files&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A long time ago I made my own soft body physics simulation code where I would load an .obj file and replace all vertex edges with spring-dampers, and also create a grid of internal springs to give the body volume.  It worked okay in the best conditions but would frequently explode in others.  Now in bullet there is a toolchain to take a 3d object and turn it volumetric, and then simulate much more robustly than in my amateur effort (though explosions still can occur).&lt;br /&gt;&lt;br /&gt;The bunny.inl and cube.inl files in Demos/SoftDemo provide the first clues, they have auto-generated comments like '# Generated by tetgen -YY bunny.smesh'.  &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Installation of tools&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://tetgen.berlios.de/"&gt;Tetgen&lt;/a&gt; is in the Ubuntu repositories, but &lt;a href="http://tetgen.berlios.de/tetview.html"&gt;tetview&lt;/a&gt; has to be downloaded as a binary.  libg2c isn't in Ubuntu 10.04 lucid lynx, I had to download prebuilt version here http://www.fluvial.ch/d/libg2c.tgz , and also libstdc++.so.5 from http://packages.debian.org/lenny/i386/libstdc++5/download (extract with dpkg-deb file.deb .).&lt;br /&gt;&lt;br /&gt;Wings3D is a good program for generating 3d meshes, and is in Ubuntu repositories.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_apbW4BHhLTg/THNCp6oVjAI/AAAAAAAACrA/sFepHvTvD1w/s1600/wings_b.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 293px;" src="http://2.bp.blogspot.com/_apbW4BHhLTg/THNCp6oVjAI/AAAAAAAACrA/sFepHvTvD1w/s400/wings_b.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5508820057084759042" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The stl it exports in binary and doesn't work for tetgen ("wrong number of vertices"), use meshlab (also in ubuntu repos) to save it as an stl but uncheck binary.  Objects with holes in them didn't work right, tetview kind of locks up on them. Concave areas don't seem quite right either.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_apbW4BHhLTg/THNL6w7LBPI/AAAAAAAACrI/6Gvn7dmwQM8/s1600/tetview.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 400px;" src="http://4.bp.blogspot.com/_apbW4BHhLTg/THNL6w7LBPI/AAAAAAAACrI/6Gvn7dmwQM8/s400/tetview.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5508830242141832434" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I used 'tetgen -p file.stl' and it outputs file.1.ele, file.1.face, file.1.node, and file.1.smesh.  'tetview file.1' will view the output.  In the bunny.inl file there is a getElements() and getNodes() function, the data there corresponds to the lists in file.1.ele and file.1.node.  Cut and paste the lists into the functions, then use a text editor to put the quotes and line breaks in as seen in bunny.inl.&lt;br /&gt;&lt;br /&gt;On trying to use the inl in SoftDemo I get this error&lt;br /&gt;&lt;code&gt;./AppSoftBodyDemo &lt;br /&gt;*** glibc detected *** ./AppSoftBodyDemo: malloc(): memory corruption: 0x090f5c38 ***&lt;br /&gt;======= Backtrace: =========&lt;br /&gt;/lib/tls/i686/cmov/libc.so.6(+0x6b591)[0x75f591]&lt;br /&gt;/lib/tls/i686/cmov/libc.so.6(+0x6e395)[0x762395]&lt;br /&gt;/lib/tls/i686/cmov/libc.so.6(__libc_malloc+0x5c)[0x763f9c]&lt;br /&gt;/usr/lib/nvidia-current/libGL.so.1(+0x33e80)[0x2fae80]&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Building the debug version helps out (cmake -DCMAKE_BUILD_TYPE=debug), but I haven't been able to figure it out yet.&lt;br /&gt;&lt;br /&gt;Here is the backtrace:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Program received signal SIGABRT, Aborted.&lt;br /&gt;0x0012d422 in __kernel_vsyscall ()&lt;br /&gt;(gdb) bt&lt;br /&gt;#0  0x0012d422 in __kernel_vsyscall ()&lt;br /&gt;#1  0x003ff651 in raise () from /lib/tls/i686/cmov/libc.so.6&lt;br /&gt;#2  0x00402a82 in abort () from /lib/tls/i686/cmov/libc.so.6&lt;br /&gt;#3  0x0043649d in ?? () from /lib/tls/i686/cmov/libc.so.6&lt;br /&gt;#4  0x00440591 in ?? () from /lib/tls/i686/cmov/libc.so.6&lt;br /&gt;#5  0x00443395 in ?? () from /lib/tls/i686/cmov/libc.so.6&lt;br /&gt;#6  0x00444f9c in malloc () from /lib/tls/i686/cmov/libc.so.6&lt;br /&gt;#7  0x08157d51 in btAllocDefault (size=1195)&lt;br /&gt;    at /home/bm/other/bullet-2.77/src/LinearMath/btAlignedAllocator.cpp:24&lt;br /&gt;#8  0x08157e6f in btAlignedAllocInternal (size=1176, alignment=16)&lt;br /&gt;    at /home/bm/other/bullet-2.77/src/LinearMath/btAlignedAllocator.cpp:170&lt;br /&gt;#9  0x080b4803 in btCollisionObject::operator new (sizeInBytes=1176)&lt;br /&gt;    at /home/bm/other/bullet-2.77/src/BulletCollision/CollisionDispatch/btCollisionObject.h:115&lt;br /&gt;#10 0x080e9e85 in btSoftBodyHelpers::CreateFromTetGenData (worldInfo=..., &lt;br /&gt;    ele=0x81707e4 "48  4  0\n    1      26    28    16    12\n    2      28    21    16    12\n    3      25    19     2    20\n    4      28    27    10    14\n    5      17     3    20     1\n    6      20    24    18    19"..., &lt;br /&gt;    face=0x0, node=0x81707bb "# Generated by tetgen -YY test.1.smesh \n", &lt;br /&gt;    bfacelinks=false, btetralinks=true, bfacesfromtetras=true)&lt;br /&gt;    at /home/bm/other/bullet-2.77/src/BulletSoftBody/btSoftBodyHelpers.cpp:957&lt;br /&gt;#11 0x080b0bc5 in Init_TetraCube (pdemo=0x8309c60)&lt;br /&gt;---Type &lt;return&gt; to continue, or q &lt;return&gt; to quit---&lt;br /&gt;    at /home/bm/other/bullet-2.77/Demos/SoftDemo/SoftDemo.cpp:1315&lt;br /&gt;#12 0x080b122c in SoftDemo::clientResetScene (this=0x8309c60)&lt;br /&gt;    at /home/bm/other/bullet-2.77/Demos/SoftDemo/SoftDemo.cpp:1451&lt;br /&gt;#13 0x080b383f in SoftDemo::initPhysics (this=0x8309c60)&lt;br /&gt;    at /home/bm/other/bullet-2.77/Demos/SoftDemo/SoftDemo.cpp:1849&lt;br /&gt;#14 0x080a5b90 in main (argc=1, argv=0xbffff384)&lt;br /&gt;    at /home/bm/other/bullet-2.77/Demos/SoftDemo/main.cpp:28&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I put the question to the forum &lt;a href="http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?f=9&amp;t=5567"&gt;here&lt;/a&gt; but no responses- not many people are that adept at the soft body physics yet.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Something functional&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;But I've been able to create a trivial example from scratch that works:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;static const char* getNodes() { return(&lt;br /&gt;"8  3  0  0\n"&lt;br /&gt;"   0    1   1   1\n"&lt;br /&gt;"   1    1   1  -1\n"&lt;br /&gt;"   2    1  -1  -1\n"&lt;br /&gt;"   3    1  -1   1\n"&lt;br /&gt;"   4   -1  -1   1\n"&lt;br /&gt;"   5   -1   1   1\n"&lt;br /&gt;"   6   -1   1  -1\n"&lt;br /&gt;"   7   -1  -1  -1\n"&lt;br /&gt;"#  \n"); }&lt;br /&gt;&lt;br /&gt;static const char* getElements() { return(&lt;br /&gt;"4  4  0\n"&lt;br /&gt;"    0      0    1    3    5\n"&lt;br /&gt;"    1      4    7    5    3\n"&lt;br /&gt;"    2      6    5    1    7\n"&lt;br /&gt;"    3      2    1    7    3\n"&lt;br /&gt;"#  \n"); }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_apbW4BHhLTg/TIBrSpq4XLI/AAAAAAAACrQ/OzSJoifsoqw/s1600/softbody_works.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_apbW4BHhLTg/TIBrSpq4XLI/AAAAAAAACrQ/OzSJoifsoqw/s400/softbody_works.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5512523912069012658" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Maybe I should try to corrupt the above into provoking the same kind of crash?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Update- Solution Found&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;tetgen by default is creating 1-based vertex indices, while Bullet is expecting 0-based indices- the -z flag will make tetgen output zero-based.  So no more crashing.&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://player.vimeo.com/video/14738742?portrait=0&amp;amp;color=01AAEA" width="400" height="287" frameborder="0"&gt;&lt;/iframe&gt;&lt;p&gt;&lt;a href="http://vimeo.com/14738742"&gt;Bullet Soft Body Physics&lt;/a&gt; from &lt;a href="http://vimeo.com/user168788"&gt;binarymillenium&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-7251136619810853466?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://bulletphysics.org/wordpress/' title='First Steps in Bullet physics'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/7251136619810853466/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=7251136619810853466' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/7251136619810853466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/7251136619810853466'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2010/08/first-steps-in-bullet-physics.html' title='First Steps in Bullet physics'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_apbW4BHhLTg/THMy4c3cHVI/AAAAAAAACq4/Yiq44tmmXYw/s72-c/bullet_soft.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-2854187290393247242</id><published>2010-04-08T07:45:00.000-07:00</published><updated>2010-04-08T08:00:58.472-07:00</updated><title type='text'>Bundler on 64-bit Ubuntu 9.10</title><content type='html'>It builds fine, but seg faults when run:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;...&lt;br /&gt;[KeyMatchFull] Matching to image 312&lt;br /&gt;[KeyMatchFull] Matching took 71.610s&lt;br /&gt;[KeyMatchFull] Matching to image 313&lt;br /&gt;[KeyMatchFull] Matching took 69.720s&lt;br /&gt;mkdir: cannot create directory `bundle': File exists&lt;br /&gt;[- Running Bundler -]&lt;br /&gt;/home/binarymillenium/bundler-v0.3-source/RunBundler.sh: line 93: 22589 Segmentation fault      $BUNDLER list.txt --options_file options.txt &amp;rsaquo; bundle/out&lt;br /&gt;[- Done -]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Program received signal SIGSEGV, Segmentation fault.&lt;br /&gt;0x0000000000522650 in dscal_ ()&lt;br /&gt;(gdb) bt&lt;br /&gt;#0  0x0000000000522650 in dscal_ ()&lt;br /&gt;#1  0x0000000000519d16 in dsytf2_ ()&lt;br /&gt;#2  0x00000000004e9644 in dsytrf_ ()&lt;br /&gt;#3  0x00000000004a6d99 in sba_symat_invert_BK ()&lt;br /&gt;#4  0x00000000004a05ec in sba_motstr_levmar_x ()&lt;br /&gt;#5  0x000000000049d058 in sba_motstr_levmar ()&lt;br /&gt;#6  0x000000000049ae8e in run_sfm ()&lt;br /&gt;#7  0x0000000000415e06 in BundlerApp::RunSFM(int, int, int, bool, camera_params_t*, v3_t*, int*, v3_t*, std::vector&amp;lsaquo;std::vector&amp;lsaquo;std::pair&amp;lsaquo;int, int&amp;rsaquo;, std::allocator&amp;lsaquo;std::pair&amp;lsaquo;int, int&amp;rsaquo; &amp;rsaquo; &amp;rsaquo;, std::allocator&amp;lsaquo;std::vector&amp;lsaquo;std::pair&amp;lsaquo;int, int&amp;rsaquo;, std::allocator&amp;lsaquo;std::pair&amp;lsaquo;int, int&amp;rsaquo; &amp;rsaquo; &amp;rsaquo; &amp;rsaquo; &amp;rsaquo;&amp;, double, double*, double*, double*, double*, bool) ()&lt;br /&gt;#8  0x000000000042a16e in BundlerApp::BundleAdjustFast() ()&lt;br /&gt;#9  0x0000000000405c33 in BundlerApp::OnInit() ()&lt;br /&gt;#10 0x0000000000406f77 in main ()&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I'll update this post with results of trying out the 32-bit binaries, and also trying to build it on 64-bit with 32-bit compilation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-2854187290393247242?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/2854187290393247242/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=2854187290393247242' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/2854187290393247242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/2854187290393247242'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2010/04/bundler-on-64-bit-ubuntu-910.html' title='Bundler on 64-bit Ubuntu 9.10'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-2146089238043474874</id><published>2010-02-14T09:01:00.000-08:00</published><updated>2010-02-14T09:05:32.860-08:00</updated><title type='text'>There needs to be better buzz blogger integration</title><content type='html'>The generic rss import gadget sort of works, but the rss headlines of buzz are really useless, only saying that there is a new buzz from username- they should have the first sentence at least of a buzz item:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_apbW4BHhLTg/S3gtDvb9LFI/AAAAAAAACoY/CrO5Cc9iMYc/s1600-h/buzzimport.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 355px; height: 400px;" src="http://2.bp.blogspot.com/_apbW4BHhLTg/S3gtDvb9LFI/AAAAAAAACoY/CrO5Cc9iMYc/s400/buzzimport.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5438146092346453074" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-2146089238043474874?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/2146089238043474874/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=2146089238043474874' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/2146089238043474874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/2146089238043474874'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2010/02/there-needs-to-be-better-buzz-blogger.html' title='There needs to be better buzz blogger integration'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_apbW4BHhLTg/S3gtDvb9LFI/AAAAAAAACoY/CrO5Cc9iMYc/s72-c/buzzimport.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-2045467312158226102</id><published>2010-01-08T18:25:00.001-08:00</published><updated>2010-01-08T18:47:27.639-08:00</updated><title type='text'>Xbox Project Natal - Estimated Specs</title><content type='html'>This video went up yesterday, was pulled down and then restored later for some reason (not before other youtube users posted their own copies and gathered many more views than the official channel)&lt;br /&gt;&lt;br /&gt;&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/-_UzcnTYqc4&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/-_UzcnTYqc4&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;The video states 30Hz, and there is an interesting shot starting at two minutes.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_apbW4BHhLTg/S0fq8eyPssI/AAAAAAAACm8/q6_iT6NQMIU/s1600-h/natal_grid.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 239px;" src="http://2.bp.blogspot.com/_apbW4BHhLTg/S0fq8eyPssI/AAAAAAAACm8/q6_iT6NQMIU/s400/natal_grid.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5424562600967910082" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_apbW4BHhLTg/S0ftxLfDyPI/AAAAAAAACnM/byRGJQOEvOE/s1600-h/natal_grid3.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 238px;" src="http://1.bp.blogspot.com/_apbW4BHhLTg/S0ftxLfDyPI/AAAAAAAACnM/byRGJQOEvOE/s400/natal_grid3.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5424565705343486194" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_apbW4BHhLTg/S0ftbCVuSnI/AAAAAAAACnE/33EBnoOpHv0/s1600-h/natal_grid2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 238px;" src="http://4.bp.blogspot.com/_apbW4BHhLTg/S0ftbCVuSnI/AAAAAAAACnE/33EBnoOpHv0/s400/natal_grid2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5424565324931287666" /&gt;&lt;/a&gt;&lt;br /&gt;From the above screenshots it's possible to count the number of pixels horizontally and vertically, and also most of the depth bins (there may be more range beyond the wall behind the person but a minimum count is better than nothing).&lt;br /&gt;&lt;br /&gt;So there at least 18 depth bins, counted at 2:01-2:04 in the video.  Each is maybe 2 or3 inches spaced.&lt;br /&gt;&lt;br /&gt;The resolution looks like 64x64.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-2045467312158226102?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/2045467312158226102/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=2045467312158226102' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/2045467312158226102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/2045467312158226102'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2010/01/xbox-project-natal-estimated-specs.html' title='Xbox Project Natal - Estimated Specs'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_apbW4BHhLTg/S0fq8eyPssI/AAAAAAAACm8/q6_iT6NQMIU/s72-c/natal_grid.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-7539569823164550036</id><published>2010-01-04T06:17:00.000-08:00</published><updated>2010-01-04T06:45:24.074-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3d'/><category scheme='http://www.blogger.com/atom/ns#' term='structuredlight'/><title type='text'>Structured Light For 3d Scanning</title><content type='html'>I learned a little about structured light from the 2008 House of Cards Radiohead video and more since Kyle McDonald created an open source &lt;a href="http://code.google.com/p/structured-light/"&gt;google code implementation&lt;/a&gt;- but only very recently really gotten into how it works.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://binarymillenium.googlecode.com/svn/trunk/processing/simstructuredlight/"&gt;Simulated Structured Light&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I had trouble getting good scans initially and I thought it would be good to create a perfectly controlled setup that didn't require a projector or camera- instead generate scenes from software, projecting textures onto 3d objects.  &lt;br /&gt;&lt;br /&gt;One of the generated input phase images:&lt;br /&gt;&lt;img src="http://binarymillenium.googlecode.com/svn/trunk/processing/simstructuredlight/phase1.jpg"&gt;&lt;/img&gt;&lt;br /&gt;&lt;br /&gt;Output from the google code ThreePhase processing app:&lt;br /&gt;&lt;img src="http://binarymillenium.googlecode.com/svn/trunk/processing/simstructuredlight/threephase1.jpg"&gt;&lt;/img&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The obvious improvement is to add in an obj loader to this program, instead of just generating a semi-random blobby shape.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Real World Scans&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I was hoping for a lot more but managed to get a few scans of people during a New Year's Eve party:&lt;br /&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/O0MHQyKynl8Hd3IHTAtxfg?feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_apbW4BHhLTg/Sz8DU20ZiqI/AAAAAAAAChk/7oJY-F2TshU/s400/out2hud.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/binarymillenium/20091231_nextyear?feat=embedwebsite"&gt;2009.12.31_nextyear&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/D4fkrfwcFvycnei0Ki_RaA?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_apbW4BHhLTg/Sz8E-nUbK7I/AAAAAAAACh0/AM8gxznCTXA/s400/out4hud.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/binarymillenium/20091231_nextyear?feat=embedwebsite"&gt;2009.12.31_nextyear&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/6Yj-wxn5tDBNvIay7LcVyQ?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_apbW4BHhLTg/Sz8DZY3EKiI/AAAAAAAAChs/Oto8gJsJ4Sk/s400/out3hud.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/binarymillenium/20091231_nextyear?feat=embedwebsite"&gt;2009.12.31_nextyear&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Those were all made using modified versions of Kyle McDonald's slDecode and slCapture programs.  I'll post those somewhere eventually.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://binarymillenium.googlecode.com/svn/trunk/processing/simstructuredlight/slight.m"&gt;Matlab Script&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This script is currently very very slow, but it's good to be able to debug in matlab and have easy access to fft and other functions.&lt;br /&gt;&lt;br /&gt;Wrapped phase:&lt;br /&gt;&lt;img src="http://binarymillenium.googlecode.com/svn-history/r487/trunk/processing/simstructuredlight/wrapped.png" width=600&gt;&lt;/img&gt;&lt;br /&gt;&lt;br /&gt;Unwrapped phase:&lt;br /&gt;&lt;img src="http://binarymillenium.googlecode.com/svn-history/r487/trunk/processing/simstructuredlight/unwrapped.png" width=600&gt;&lt;/img&gt;&lt;br /&gt;&lt;br /&gt;Note the vertical lines where phase propagates vertically in glitchy ways- some filtering (and even slower processing time) ought to be able to clean that during the flood fill.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Next&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I hope to go mainly in the direction of high resolution high fidelity scans, as opposed to high frame-rate low sample-time scans, though I think I can access several high frame rate cameras for use in the latter.  There is also lots of room for improvements (especially at the phase unwrapping stage) that would benefit either one of those.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-7539569823164550036?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/7539569823164550036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=7539569823164550036' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/7539569823164550036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/7539569823164550036'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2010/01/structured-light-for-3d-scanning.html' title='Structured Light For 3d Scanning'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_apbW4BHhLTg/Sz8DU20ZiqI/AAAAAAAAChk/7oJY-F2TshU/s72-c/out2hud.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-184947235287636871</id><published>2009-11-21T13:13:00.000-08:00</published><updated>2009-11-21T14:01:42.679-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lidar'/><title type='text'>Natal competitor: Optricam?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_apbW4BHhLTg/SwhgjsV55uI/AAAAAAAACdA/X9FRISjmujc/s1600/ico_camera.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 90px; height: 90px;" src="http://2.bp.blogspot.com/_apbW4BHhLTg/SwhgjsV55uI/AAAAAAAACdA/X9FRISjmujc/s400/ico_camera.png" alt="" id="BLOGGER_PHOTO_ID_5406677518973003490" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;For a while I was worried that after Microsoft acquired 3DV Systems and their depth sensing ZCam, which might have been available at the beginning of this year, they were going to release the &lt;a href="http://binarymillenium.com/2009/06/xbox-project-natal.html"&gt;Natal&lt;/a&gt; exclusively for the Xbox and the possibilities for non-MS sanctioned applications would be severely hampered.  And then to have to suffer delays for software I don't care about when the hardware may be ready now.  But there may be similar products from other vendors due to arrive soon.&lt;br /&gt;&lt;br /&gt;I learned about the &lt;a href="http://www.pmdtec.com/products-services/pmdvisionr-cameras/pmdvisionr-camcube-20/"&gt;PMDTec Camcube&lt;/a&gt; a few months ago.  It is a lot less expensive than a Swissranger, but there are no U.S. distributors and nothing on the web from customers that are using it.&lt;br /&gt;&lt;br /&gt;But this last week there was &lt;a href="http://www.pr-inside.com/softkinetic-optrima-and-texas-instruments-collabor-r1591685.htm"&gt;this press-release&lt;/a&gt; about a Belgian company &lt;a href="http://www.optrima.com/"&gt;Optrima&lt;/a&gt;  (Israel, Germany, Switzerland, and now Belgium- all the U.S. flash lidar vendors seemed to have missed the boat on low cost continuous-wave IR led range finding systems to instead focus on extremely expensive aerospace and high end mobile robotics applications) teaming with TI and a body motion capture software vendor (&lt;a href="http://www.softkinetic.net/"&gt;Softkinetic&lt;/a&gt;) to produce Natal/Zcam-like results in the same application area- games and general computer UI.  There is mention of Beagleboard support in the press-release, so having say Ubuntu be able to communicate is very likely.&lt;br /&gt;&lt;br /&gt;Hopefully TI will really get behind it and all the economies of scale that MS can bring to bear can be matched, and it will only cost around $100. &lt;br /&gt;&lt;br /&gt;Also, I'm seeing more and more red clothing and jumpsuits- possibly with specially IR reflective component, which makes me suspicious about the limitations of these sensors (also using them with windows letting in direct sunlight is probably out of the question).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_apbW4BHhLTg/Swhfs35IozI/AAAAAAAACc4/T_RahWpWxNI/s1600/Project-NatalXBOX-6_816648a.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 235px;" src="http://2.bp.blogspot.com/_apbW4BHhLTg/Swhfs35IozI/AAAAAAAACc4/T_RahWpWxNI/s400/Project-NatalXBOX-6_816648a.jpg" alt="" id="BLOGGER_PHOTO_ID_5406676577180754738" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_apbW4BHhLTg/SwhfgvuT2II/AAAAAAAACcw/9ujshkZZvuY/s1600/natal-on-jimmy-fallon.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 267px;" src="http://4.bp.blogspot.com/_apbW4BHhLTg/SwhfgvuT2II/AAAAAAAACcw/9ujshkZZvuY/s400/natal-on-jimmy-fallon.jpg" alt="" id="BLOGGER_PHOTO_ID_5406676368829438082" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_apbW4BHhLTg/SwhfTjAL3hI/AAAAAAAACco/Lt-F4XJ0F-Q/s1600/Karate-300x200.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 300px; height: 200px;" src="http://4.bp.blogspot.com/_apbW4BHhLTg/SwhfTjAL3hI/AAAAAAAACco/Lt-F4XJ0F-Q/s400/Karate-300x200.png" alt="" id="BLOGGER_PHOTO_ID_5406676142076452370" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-184947235287636871?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://eu.techcrunch.com/2009/11/19/texas-instruments-targets-3d-gaming-with-softkinetic-optrima-gesture-recognition-sdk/' title='Natal competitor: Optricam?'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/184947235287636871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=184947235287636871' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/184947235287636871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/184947235287636871'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2009/11/natal-competitor-optricam.html' title='Natal competitor: Optricam?'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_apbW4BHhLTg/SwhgjsV55uI/AAAAAAAACdA/X9FRISjmujc/s72-c/ico_camera.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-3264874910143539535</id><published>2009-11-02T20:40:00.000-08:00</published><updated>2009-11-02T20:49:42.342-08:00</updated><title type='text'>Using a canon camera to view jpegs</title><content type='html'>I tried using my Canon camera as a picture viewer, putting some downloaded jpegs on it- the pictures didn't show up at all when I tried to review them, only the pictures I had taken with the camera.  Renaming the pictures to have camera names like DSC_0025.jpg made the camera show a question mark icon for the picture at least.&lt;br /&gt;&lt;br /&gt;A little searching later I discovered a tool called &lt;a href="http://paint.net/"&gt;paint.net&lt;/a&gt;, which saves jpegs in the proper format so the Canon will like them.  The other trick is to re-size the canvas the picture is on so all dimensions are multiples of 8.  &lt;br /&gt;&lt;br /&gt;paint.net itself is somewhat interesting, quicker to load than &lt;a href="http://www.gimp.org"&gt;Gimp&lt;/a&gt; but not so much easier or more intuitive or like Deluxe Paint that I'll use it for anything else.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-3264874910143539535?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/3264874910143539535/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=3264874910143539535' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/3264874910143539535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/3264874910143539535'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2009/11/using-canon-camera-to-view-jpegs.html' title='Using a canon camera to view jpegs'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-3701323389634514146</id><published>2009-09-12T18:54:00.000-07:00</published><updated>2009-09-12T18:42:00.075-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ec2'/><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>Instructions for rendering with Processing on Amazon EC2</title><content type='html'>There are detailed instructions elsewhere on how to get started with EC2 in general, here are the high level things to do for my &lt;a href="http://binarymillenium.com/2009/08/computing-cloud-rendering-with.html"&gt;headless rendering project&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;Get a unix command line environment that has python and ssh, I use cygwin under Windows, other times I dual boot into Ubuntu.&lt;br /&gt;&lt;br /&gt;Get an &lt;a href="http://aws.amazon.com/ec2/"&gt;Amazon EC2 account&lt;/a&gt;, create a ~/username.pem file, and make environmental variables for the keys (follow &lt;a href="http://boto.googlecode.com/svn/trunk/doc/ec2_tut.txt"&gt;boto instructions&lt;/a&gt;).&lt;br /&gt;Make sure pem permission are set to 700.&lt;br /&gt;&lt;br /&gt;Edit ssh_config so that StrictHostChecking is set to no, otherwise ssh sessions started by the scripts will ask if it's okay to connect to every created instance- I could probably automate that response though.&lt;br /&gt;&lt;br /&gt;Make sure there are no carriage returns (\r) in the pem file in Linux.&lt;br /&gt;&lt;br /&gt;Get &lt;a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=609"&gt;Elasticfox&lt;/a&gt;, put your credentials in.&lt;br /&gt;&lt;br /&gt;Get &lt;a href="http://code.google.com/p/boto/"&gt;boto&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Get &lt;a href="http://code.google.com/p/trajectorset/source/checkout"&gt;trajectorset&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Create a security group called http that at least allows your ip to access a webserver of an ec2 instance that uses it.  &lt;br /&gt;&lt;br /&gt;At this point it should be possible to run ec2start.py, visit the ip address of the head node and watch the results come in.  The ec2start script launches a few instances, one head node that will create noise seeds to send to the worker nodes via sqs, and then wait for the workers to process the seeds and send sqs messages back.  The head node then copies the results files and renders the graphics, copying the latest results to folder that can be seen by index.html for web display.&lt;br /&gt;&lt;br /&gt;My code is mainly for demonstration, so the key things I did that will help with alternate applications follow:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Custom AMI&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;You can use the AMI I created with the id 'ami-2bfd1d42', I used one of the Alestic Ubuntu amis and added Java, Xvfb, Boto, and a webserver like lighttpd (I forget if Xvfb was already installed or not).  &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Headless rendering&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The EC2 instance lack graphics contexts at first, and trying to run a graphical application like an exported Processing project will not work (TBD did I ever try that?).  &lt;a href="http://en.wikipedia.org/wiki/Xvfb"&gt;Xvfb&lt;/a&gt; creates a virtual frame buffer that Processing can render to after running these commands:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Xvfb :2&lt;br /&gt;export DISPLAY=:2&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Launching processes and detaching from them&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I use python subprocess.Popen frequently to execute commands on the instances like this:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;cmd = "Xvfb :2" &lt;br /&gt;whole_cmd = "ssh -i ~/lucasw.pem root@" + dns_name + " \"" + cmd + "\""   &lt;br /&gt;proc = subprocess.Popen(whole_cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)&lt;br /&gt;(stdout,stderr) = proc.communicate()&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;The problem is when one wants to run something and close the connection, and leave it running - like Xvfb above, it needs to run and stay running.  One method is to leave the ssh connection open, but there is a limit of about 20 ssh sessions.&lt;br /&gt;&lt;br /&gt;The trick is to use nohup:&lt;br /&gt;&lt;code&gt;cmd = "nohup Xvfb :2"&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Don't put extra quotes around the command to execute, which brings me to the next topic.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Quote escaping&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;There are a few bash commands that require parts to be in quotes- but in python the bash command is already is in quotes, and python will not understand the inner set of quotes unless they are escaped with the backslash:&lt;br /&gt;&lt;code&gt;cmd = "echo \"blah\" &gt; temp.txt";&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Then at other times an additional level of quote escaping is required:&lt;br /&gt;&lt;code&gt;cmd = "echo \\\"blah\\\" &gt; temp.txt";&lt;/code&gt;&lt;br /&gt;(I do this when I pass all of the cmd variable to be executed by ssh, and ssh wants it in quotes)&lt;br /&gt;&lt;br /&gt;One backslash escapes on level of quoting, three escapes two levels?  It's because the escaping backslash itself needs to be escaped.  This gets confusing fast, and some experimentation with python in interactive mode is required to get it right.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Config file driven&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;It's not currently, not as much as at it needs to be, which makes it very brittle- to change plots requires making about three different edits, when a source config file should specify it for all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-3701323389634514146?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/3701323389634514146/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=3701323389634514146' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/3701323389634514146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/3701323389634514146'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2009/08/instructions-for-rendering-with.html' title='Instructions for rendering with Processing on Amazon EC2'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-883487580297623465</id><published>2009-08-27T22:26:00.000-07:00</published><updated>2009-08-27T22:31:58.956-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ec2'/><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>Computing Cloud Rendering with Processing and Amazon EC2</title><content type='html'>This &lt;a href="code.google.com/p/trajectorset/source/browse/#svn/trunk/ec2"&gt;project&lt;/a&gt; is my first experiment with using &lt;a href="http://aws.amazon.com/ec2/"&gt;Amazon EC2&lt;/a&gt; for cloud rendering.  The source code is all there and I'll post detailed instructions on how to use it later, but here is a speeded up video of the output:&lt;br /&gt;&lt;br /&gt;&lt;object width="400" height="225"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=6299622&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=6299622&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;p&gt;&lt;a href="http://vimeo.com/6299622"&gt;Computing Cloud Rendering&lt;/a&gt; from &lt;a href="http://vimeo.com/user168788"&gt;binarymillenium&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;It looks kind of cool, but not too exciting- but there's potential for better things.&lt;br /&gt;&lt;br /&gt;What I've done is launched several compute instances on EC2, where worker nodes create individual lines seen in the plots, and then pass data back to a head node, which creates the plots, puts them on a web page for real-time feedback, and stores all the frames for retrieval at the end of the run.  &lt;br /&gt;&lt;br /&gt;The plots are aggregations of all the results, blue is the presence of any line, and white is a high density of lines, and greenish tinge signifies the line was from a recently aggregated set.  It's interesting because the more lines are aggregated, the less the plot changes, so it becomes increasingly boring.&lt;br /&gt;&lt;br /&gt;All the plotting and data generation is done using java applications exported from Processing.  3D graphics are also possible, and something like this &lt;a href="http://vimeo.com/5648243"&gt;earlier video&lt;/a&gt; could be ported to the scripts I've made.  There is no graphics card accessible on the EC2 machines, but virtual frame buffer software like Xvfb and software rendering (either Processing's P3D or software opengl) make it possible to trick the application into thinking there is.&lt;br /&gt;&lt;br /&gt;It's not distributed rendering since all the rendering is on one computer, but I think I need to distribute the rendering in order to speed it up.&lt;br /&gt;&lt;br /&gt;There is potential for more dynamic applications, involving user interaction through webpages, or simulations that interact with the results of previous simulations, and communicate with other nodes to alter what they are doing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-883487580297623465?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/883487580297623465/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=883487580297623465' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/883487580297623465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/883487580297623465'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2009/08/computing-cloud-rendering-with.html' title='Computing Cloud Rendering with Processing and Amazon EC2'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-5001407671779331866</id><published>2009-08-23T17:30:00.000-07:00</published><updated>2009-08-23T20:47:36.628-07:00</updated><title type='text'>Save Image As And Close Tab Firefox Addon</title><content type='html'>I haven't made a firefox addon before, but I thought I'd try something simple: &lt;a href="http://binarymillenium.googlecode.com/svn/trunk/mozilla/saveasclosetab/saveasclosetab.xpi"&gt;combine the context menu "Save Image As..." with closing the current tab&lt;/a&gt;.  My contribution consists of putting these two lines together:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;gContextMenu.saveImage();&lt;br /&gt;gBrowser.removeCurrentTab();&lt;br /&gt;&lt;/code&gt; &lt;br /&gt;&lt;br /&gt;To start out with I used the &lt;a href="http://ted.mielczarek.org/code/mozilla/extensionwiz/"&gt;Firefox/Thunderbird Extension Wizard&lt;/a&gt;.  Initially I didn't select the 'Create context menu item' and that may have caused problems with gContextMenu not being defined - it was either that or the fact I was trying to embed the commands into the firefoxOverlay.xul file as embedded javascript instead of putting it in the overlay.js file.&lt;br /&gt;&lt;br /&gt;I found the first function by looking through the firefox source code first for the menuitem name of the function "Save Image As", and from there finding saveImage.  The removeCurrentTab function was harder to find, but this addon provided source code that showed it: &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1466"&gt;Stephen Clavering's CTC&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Tutorial pages I initially found about extension development were helpful, but I didn't see anything that talks about mozilla fundamentals- probably I need to find a book about it.&lt;br /&gt;&lt;br /&gt;This addon goes well with the &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/710"&gt;Menu Editor&lt;/a&gt; and &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/25"&gt;Download Sort&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;There is code in the real Save Image As for determining whether an image is being selected or not (my addon shows up regardless) I should add in next, and there should be logic that prevents the close action if the save as was canceled (less sure how to do that).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-5001407671779331866?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://binarymillenium.googlecode.com/svn/trunk/mozilla/saveasclosetab/saveasclosetab.xpi' title='Save Image As And Close Tab Firefox Addon'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/5001407671779331866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=5001407671779331866' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/5001407671779331866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/5001407671779331866'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2009/08/save-image-as-and-close-tab-firefox.html' title='Save Image As And Close Tab Firefox Addon'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-8818658482814032343</id><published>2009-08-05T09:32:00.000-07:00</published><updated>2009-08-05T09:33:14.813-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='matlab'/><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>Quick jmatio in Processing example</title><content type='html'>1. Download jmatio from &lt;a href="http://www.mathworks.com/matlabcentral/fileexchange/10759"&gt;mathworks file exchange&lt;/a&gt;&lt;br /&gt;2. unzip and put contents in folder called jmatio&lt;br /&gt;3. rename lib dir to library&lt;br /&gt;3. rename library/jamtio.jar to library/jmatio.jar&lt;br /&gt;4. create a mat file in the sketch data dir called veh_x.mat which contains an array called veh_x&lt;br /&gt;5. Run the following code:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import com.jmatio.io.*;&lt;br /&gt;import com.jmatio.types.*;&lt;br /&gt;&lt;br /&gt;  MatFileReader mfr = null;&lt;br /&gt;  try {&lt;br /&gt;    mfr = new MatFileReader(sketchPath + "/data/veh_x.mat" );&lt;br /&gt;  } catch (IOException e) {&lt;br /&gt;   e.printStackTrace();&lt;br /&gt;   exit(); &lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;if (mfr != null) {&lt;br /&gt;  double[][] data = ((MLDouble)mfr.getMLArray( "veh_x" )).getArray();&lt;br /&gt;  &lt;br /&gt;  println(data.length +" " + data[0].length + " "  + data[0][0]);&lt;br /&gt;  &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;TBD use getContents instead of requiring the mat file name and array name be the same.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-8818658482814032343?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/8818658482814032343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=8818658482814032343' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/8818658482814032343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/8818658482814032343'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2009/08/quick-jmatio-in-processing-example.html' title='Quick jmatio in Processing example'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-8224646938680719419</id><published>2009-07-03T14:59:00.000-07:00</published><updated>2009-07-03T15:14:11.999-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photosynth'/><title type='text'>Building Bundler v0.3 on Ubuntu</title><content type='html'>'The Office Box' requested help with running Bundler on linux ( specifically Ubuntu 9- I have a virtualbox vm of Ubuntu 8.04  fully updated to today, but I'll try this out on Ubuntu 9 soon) so I went through the process myself.&lt;br /&gt;&lt;br /&gt;The binary version depends on libgfortran.so.3, which I couldn't find with aptitude, so I tried the building from source- it turned out to be not that hard.  The is no 'configure' for bundler 0.3 to search for dependencies that aren't installed, so I built incrementally and installed packages as I ran into build failures.  I might be missing a few I already had installed for other purposes, but do a sudo aptitude install on the following:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;build-essentials&lt;br /&gt;gfortran-4.2  &lt;br /&gt;zlib1g-dev&lt;br /&gt;libjpeg-dev&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;A missing gfortran produces the cryptic 'error trying to exec 'f951': execvp: No such file or directory)' message.&lt;br /&gt;&lt;br /&gt;These might be necessary I'm not sure:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;lapack3&lt;br /&gt;libminpack1&lt;br /&gt;f2c&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;After that run the provided makefile, add the bundler bin folder to your LD_LIBRARY_PATH, and then go into the examples/kermit directory and run ../../RunBundler.sh to see there are good ply files in the bundle directory.  Bundler is a lot slower than Photosynth for big jobs, I haven't tried the intel math libs though.&lt;br /&gt;&lt;br /&gt;The full output from a successful kermit RunBundler run looks like this:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Using directory '.'&lt;br /&gt;0&lt;br /&gt;Image list is list_tmp.txt&lt;br /&gt;[Extracting exif tags from image ./kermit000.jpg]&lt;br /&gt;  [Focal length = 5.400mm]&lt;br /&gt;[Couldn't find CCD width for camera Canon Canon PowerShot A10]&lt;br /&gt;[Found in EXIF tags]&lt;br /&gt;  [CCD width = 5.230mm]&lt;br /&gt;  [Resolution = 640 x 480]&lt;br /&gt;  [Focal length (pixels) = 660.803&lt;br /&gt;[Extracting exif tags from image ./kermit001.jpg]&lt;br /&gt;  [Focal length = 5.400mm]&lt;br /&gt;[Couldn't find CCD width for camera Canon Canon PowerShot A10]&lt;br /&gt;[Found in EXIF tags]&lt;br /&gt;  [CCD width = 5.230mm]&lt;br /&gt;  [Resolution = 640 x 480]&lt;br /&gt;  [Focal length (pixels) = 660.803&lt;br /&gt;[Extracting exif tags from image ./kermit002.jpg]&lt;br /&gt;  [Focal length = 5.400mm]&lt;br /&gt;[Couldn't find CCD width for camera Canon Canon PowerShot A10]&lt;br /&gt;[Found in EXIF tags]&lt;br /&gt;  [CCD width = 5.230mm]&lt;br /&gt;  [Resolution = 640 x 480]&lt;br /&gt;  [Focal length (pixels) = 660.803&lt;br /&gt;[Extracting exif tags from image ./kermit003.jpg]&lt;br /&gt;  [Focal length = 5.400mm]&lt;br /&gt;[Couldn't find CCD width for camera Canon Canon PowerShot A10]&lt;br /&gt;[Found in EXIF tags]&lt;br /&gt;  [CCD width = 5.230mm]&lt;br /&gt;  [Resolution = 640 x 480]&lt;br /&gt;  [Focal length (pixels) = 660.803&lt;br /&gt;[Extracting exif tags from image ./kermit004.jpg]&lt;br /&gt;  [Focal length = 5.400mm]&lt;br /&gt;[Couldn't find CCD width for camera Canon Canon PowerShot A10]&lt;br /&gt;[Found in EXIF tags]&lt;br /&gt;  [CCD width = 5.230mm]&lt;br /&gt;  [Resolution = 640 x 480]&lt;br /&gt;  [Focal length (pixels) = 660.803&lt;br /&gt;[Extracting exif tags from image ./kermit005.jpg]&lt;br /&gt;  [Focal length = 5.400mm]&lt;br /&gt;[Couldn't find CCD width for camera Canon Canon PowerShot A10]&lt;br /&gt;[Found in EXIF tags]&lt;br /&gt;  [CCD width = 5.230mm]&lt;br /&gt;  [Resolution = 640 x 480]&lt;br /&gt;  [Focal length (pixels) = 660.803&lt;br /&gt;[Extracting exif tags from image ./kermit006.jpg]&lt;br /&gt;  [Focal length = 5.400mm]&lt;br /&gt;[Couldn't find CCD width for camera Canon Canon PowerShot A10]&lt;br /&gt;[Found in EXIF tags]&lt;br /&gt;  [CCD width = 5.230mm]&lt;br /&gt;  [Resolution = 640 x 480]&lt;br /&gt;  [Focal length (pixels) = 660.803&lt;br /&gt;[Extracting exif tags from image ./kermit007.jpg]&lt;br /&gt;  [Focal length = 5.400mm]&lt;br /&gt;[Couldn't find CCD width for camera Canon Canon PowerShot A10]&lt;br /&gt;[Found in EXIF tags]&lt;br /&gt;  [CCD width = 5.230mm]&lt;br /&gt;  [Resolution = 640 x 480]&lt;br /&gt;  [Focal length (pixels) = 660.803&lt;br /&gt;[Extracting exif tags from image ./kermit008.jpg]&lt;br /&gt;  [Focal length = 5.400mm]&lt;br /&gt;[Couldn't find CCD width for camera Canon Canon PowerShot A10]&lt;br /&gt;[Found in EXIF tags]&lt;br /&gt;  [CCD width = 5.230mm]&lt;br /&gt;  [Resolution = 640 x 480]&lt;br /&gt;  [Focal length (pixels) = 660.803&lt;br /&gt;[Extracting exif tags from image ./kermit009.jpg]&lt;br /&gt;  [Focal length = 5.400mm]&lt;br /&gt;[Couldn't find CCD width for camera Canon Canon PowerShot A10]&lt;br /&gt;[Found in EXIF tags]&lt;br /&gt;  [CCD width = 5.230mm]&lt;br /&gt;  [Resolution = 640 x 480]&lt;br /&gt;  [Focal length (pixels) = 660.803&lt;br /&gt;[Extracting exif tags from image ./kermit010.jpg]&lt;br /&gt;  [Focal length = 5.400mm]&lt;br /&gt;[Couldn't find CCD width for camera Canon Canon PowerShot A10]&lt;br /&gt;[Found in EXIF tags]&lt;br /&gt;  [CCD width = 5.230mm]&lt;br /&gt;  [Resolution = 640 x 480]&lt;br /&gt;  [Focal length (pixels) = 660.803&lt;br /&gt;[Found 11 good images]&lt;br /&gt;[- Extracting keypoints -]&lt;br /&gt;Finding keypoints...&lt;br /&gt;1245 keypoints found.&lt;br /&gt;Finding keypoints...&lt;br /&gt;1305 keypoints found.&lt;br /&gt;Finding keypoints...&lt;br /&gt;1235 keypoints found.&lt;br /&gt;Finding keypoints...&lt;br /&gt;1220 keypoints found.&lt;br /&gt;Finding keypoints...&lt;br /&gt;1104 keypoints found.&lt;br /&gt;Finding keypoints...&lt;br /&gt;1159 keypoints found.&lt;br /&gt;Finding keypoints...&lt;br /&gt;949 keypoints found.&lt;br /&gt;Finding keypoints...&lt;br /&gt;1108 keypoints found.&lt;br /&gt;Finding keypoints...&lt;br /&gt;1273 keypoints found.&lt;br /&gt;Finding keypoints...&lt;br /&gt;1160 keypoints found.&lt;br /&gt;Finding keypoints...&lt;br /&gt;1122 keypoints found.&lt;br /&gt;[- Matching keypoints (this can take a while) -]&lt;br /&gt;../../bin/KeyMatchFull list_keys.txt matches.init.txt&lt;br /&gt;[KeyMatchFull] Reading keys took 1.020s&lt;br /&gt;[KeyMatchFull] Matching to image 0&lt;br /&gt;[KeyMatchFull] Matching took 0.010s&lt;br /&gt;[KeyMatchFull] Matching to image 1&lt;br /&gt;[KeyMatchFull] Matching took 0.170s&lt;br /&gt;[KeyMatchFull] Matching to image 2&lt;br /&gt;[KeyMatchFull] Matching took 0.380s&lt;br /&gt;[KeyMatchFull] Matching to image 3&lt;br /&gt;[KeyMatchFull] Matching took 0.560s&lt;br /&gt;[KeyMatchFull] Matching to image 4&lt;br /&gt;[KeyMatchFull] Matching took 0.740s&lt;br /&gt;[KeyMatchFull] Matching to image 5&lt;br /&gt;[KeyMatchFull] Matching took 0.960s&lt;br /&gt;[KeyMatchFull] Matching to image 6&lt;br /&gt;[KeyMatchFull] Matching took 1.060s&lt;br /&gt;[KeyMatchFull] Matching to image 7&lt;br /&gt;[KeyMatchFull] Matching took 1.210s&lt;br /&gt;[KeyMatchFull] Matching to image 8&lt;br /&gt;[KeyMatchFull] Matching took 1.410s&lt;br /&gt;[KeyMatchFull] Matching to image 9&lt;br /&gt;[KeyMatchFull] Matching took 1.600s&lt;br /&gt;[KeyMatchFull] Matching to image 10&lt;br /&gt;[KeyMatchFull] Matching took 1.760s&lt;br /&gt;[- Running Bundler -]&lt;br /&gt;[- Done -]&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-8224646938680719419?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://phototour.cs.washington.edu/bundler/' title='Building Bundler v0.3 on Ubuntu'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/8224646938680719419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=8224646938680719419' title='19 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/8224646938680719419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/8224646938680719419'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2009/07/building-bundler-v03-on-ubuntu.html' title='Building Bundler v0.3 on Ubuntu'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-5588576560642549734</id><published>2009-06-16T05:08:00.000-07:00</published><updated>2009-06-24T07:37:03.988-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lidar'/><title type='text'>Xbox Project Natal</title><content type='html'>A little less than a year ago I remember stumbling across &lt;a href="http://www.3dvsystems.com/gallery/gallery.html"&gt;the Zcam from 3DV Systems&lt;/a&gt;, the company promised two orders of magnitude decreases in the cost of flash array lidar through mass production- the trick is to market it as a device anyone can use, not just as a robotics or general automation tool.  The company promised to be in the market by the end of 2008, and after emails went unanswered I assumed it was vaporware.  &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.3dvsystems.com"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 382px; height: 400px;" src="http://3.bp.blogspot.com/_apbW4BHhLTg/SjeUEjsXnUI/AAAAAAAABmw/Oc7clDltNPM/s400/pic3.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5347905888547478850" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The closest competitor would be the &lt;a href="http://www.mesa-imaging.ch/prodview4k.php"&gt;Mesa Imaging SwissRanger&lt;/a&gt;, which I think goes for $5000-$10000.  Beyond that there are very expensive products from &lt;a href="http://www.advancedscientificconcepts.com/"&gt;Advanced Scientific Concepts&lt;/a&gt; or &lt;a href="http://www.ballaerospace.com/page.jsp?page=30&amp;id=297"&gt;Ball Aerospace&lt;/a&gt; that are in the hundreds of thousands of dollars range at least.  ASC made a deal with iRobot that might bring the price down through economies of scale, though they probably aren't going to put it on the Roomba anytime soon.  More likely the Packbot which already costs $170K, why not round that up to half a million?&lt;br /&gt;&lt;br /&gt;In late 2008 to early 2009 rumors surfaced that Microsoft was going to buy 3DV Systems, and now we have the official announcements about Natal.  And of course no mention of 3DV Systems (which hasn't updated their webpage in over a year) or even how it measures the phase shift or time of flight of light pulses in a sensor array to produce depth images.  Given enough processing power, the right software, and good lighting, it would be possible to do everything seen in the Natal videos with a single camera.  The next step up would be stereo vision to get depth images- it's possible that's what Natal is, but it seems like they would have mentioned that since that technology is so conventional.&lt;br /&gt;&lt;br /&gt;But that won't stop me from speculating:&lt;br /&gt;&lt;br /&gt;Natal is probably a 0.5-2 megapixel webcam combined with a flash lidar with a resolution of 64x64 or 128x128 pixels, and maybe a few dozen levels of depth bins.&lt;br /&gt;&lt;br /&gt;The low resolution means there is a ton of software operating on the video image and the depth information to derive the skeletal structure for full body motion capture.  All that processing means the speed and precision is going to be somewhat low- it would be great to buy one of these and be able to record body movements for use in 3D animation software, machinima, independent games, or full body 3D chat (there's no easy way to do intersections or collisions with other people in an intuitive way so don't get too excited), but I doubt it will capture a lot of nuance.&lt;br /&gt;&lt;br /&gt;The lidar might be continuous wave (CW) like the SwissRanger.  This has an interesting property where beyond the maximum range of the sensor, objects appear closer again- if the range was 10 feet, an object 12 feet away is indistinguishable from one 2 feet away, or 22 feet away.&lt;br /&gt;&lt;br /&gt;Beyond that, hopefully MS sees the potential for this beyond an Xbox peripheral.  It would be criminal not to be able to plug this into a PC, and have at least Windows drivers, an SDK + DirectX support.  The next most obvious thing would be to use it to promote MS Robotics Studio, and offer a module for that software to use the Natal.  If it just has a USB connection then it could be placed on a moderately small mobile robot, and software could use the depth maps for collision avoidance and with some processing power be able to computer 3D or 2D grid maps (maybe like &lt;a href="http://vimeo.com/2383465"&gt;this&lt;/a&gt;) and figure out when it has returned to the same location.&lt;br /&gt;&lt;br /&gt;The next step is to make a portable camera that takes a high megapixel normal image along with a depth image.  Even with the low resolution and limited range (or range that rolls over), the depth information could be passed on to photosynth to reduce the amount of pictures needed to make a good synth.  MS doesn't make cameras, but why not license the technology to Nikon or Canon?  Once in dedicated cameras, it's on to cell phone integration...&lt;br /&gt;&lt;br /&gt;The one downside is that the worst application seems to be as a gaming device, which is bad because I'd like it to be very successful in order to inspire competing products and later generations of the same technology.  It is certainly not going to have the precision of a Wii MotionPlus, and maybe not even a standard Wii controller (granted that it can do some interesting things that a Wii controller can't).&lt;br /&gt;&lt;br /&gt;But even if it isn't a huge success, it should be possible to get a device from the first generation, and it's only a matter of time before someone hacks it and produces Linux drivers, right?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-5588576560642549734?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.youtube.com/user/xboxprojectnatal' title='Xbox Project Natal'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/5588576560642549734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=5588576560642549734' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/5588576560642549734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/5588576560642549734'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2009/06/xbox-project-natal.html' title='Xbox Project Natal'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_apbW4BHhLTg/SjeUEjsXnUI/AAAAAAAABmw/Oc7clDltNPM/s72-c/pic3.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-5521304960226153970</id><published>2009-05-02T12:39:00.000-07:00</published><updated>2009-05-02T12:59:41.990-07:00</updated><title type='text'>Weaponizers</title><content type='html'>Rusty of Seattle's &lt;a href="http://www.hazardfactory.org/"&gt;HazardFactory&lt;/a&gt;, known for &lt;a href="http://www.flickr.com/groups/830505@N22//"&gt;power tool drag racing&lt;/a&gt; and other events usually involving &lt;a href="http://picasaweb.google.com/binarymillenium/20081231_hazardfactory_new_years#5286350731453237426"&gt;conflagrations of some sort&lt;/a&gt;, is now turning cars into remote control tools of destruction:&lt;br /&gt;&lt;br /&gt;&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/TgBNkKGcfYo&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/TgBNkKGcfYo&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Some choice quotes on &lt;a href="http://www.brepettis.com/blog/2009/5/1/real-car-wars-weaponizers.html"&gt;Bre's blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dsc.discovery.com/tv-schedules/series.html?paid=1.14710.25975.37228.1"&gt;Discovery channel listing&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The RC is probably great fun and well suited for television but I'd like to see (or better yet work on) an autonomous version of this, or incorporate more autonomous elements into it, though the cars would probably be an order or three of magnitude more expensive.  Which is why you should tune in and make sure the ratings are high so they can afford to destroy $5K lidars or gimbal mounts in future iterations...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-5521304960226153970?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://dsc.discovery.com/tv-schedules/series.html?paid=1.14710.25975.37228.1' title='Weaponizers'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/5521304960226153970/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=5521304960226153970' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/5521304960226153970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/5521304960226153970'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2009/05/weaponizers.html' title='Weaponizers'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-546225746260077561</id><published>2009-04-06T06:05:00.000-07:00</published><updated>2009-04-06T06:26:09.665-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opencv'/><title type='text'>OpenCV example, and why does Google do so poorly?</title><content type='html'>Take searching for cvGetSpatialMoment:&lt;br /&gt;&lt;a href="http://www.google.com/search?hl=en&amp;q=cvGetSpatialMoment&amp;btnG=Google+Search&amp;aq=f&amp;oq="&gt;http://www.google.com/search?hl=en&amp;q=cvGetSpatialMoment&amp;btnG=Google+Search&amp;aq=f&amp;oq=&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;All the top results are nearly useless, just code that doesn't help much if you don't know what cvGetSpatialMoment does.&lt;br /&gt;&lt;br /&gt;The "CV Reference Manual" that comes with an install of OpenCV probably should come up first (the local html files of course aren't google searchable), or any real text explanation or tutorial of the function.  So scrolling down further there are some odd but useful sites like &lt;a href="http://www.ieeta.pt/~jmadeira/OpenCV/OpenCVdocs/ref/opencvref_cv.htm"&gt;http://www.ieeta.pt/~jmadeira/OpenCV/OpenCVdocs/ref/opencvref_cv.htm&lt;/a&gt;.  I guess the official &lt;a href="http://opencv.willowgarage.com/wiki/CxCore"&gt;Willow Garage docs here&lt;/a&gt; haven't been linked to enough.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://books.google.com/books?id=seAgiOfu2EIC&amp;printsec=frontcover&amp;dq=opencv#PPP1,M1"&gt;official OpenCV book on Google&lt;/a&gt; is highly searchable, some pages are restricted but many are not.&lt;br /&gt;&lt;br /&gt;Through all that frustration I did manage to learn a lot of basics to load an image and process a portion of the image to look for a certain color, and then find the center of the region that has that color.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;IplImage* image = cvLoadImage( base_filename, CV_LOAD_IMAGE_COLOR );&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;split it into two halves for separate processing&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;IplImage* image_left = cvCreateImage( cvSize( image-&gt;width/2, image-&gt;height), IPL_DEPTH_8U, 3 );&lt;br /&gt;cvSetImageROI( image, cvRect( 0, 0, image-&gt;width/2, image-&gt;height ) );&lt;br /&gt;cvCopy( image, image_left );&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;convert it to hsv color space&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt; IplImage* image_left_hsv = cvCreateImage( cvSize(image_left-&gt;width, image_left-&gt;height), IPL_DEPTH_8U, 3 );&lt;br /&gt;cvCvtColor(image_left,image_left_hsv,CV_BGR2HSV);&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;get only the hue component using the COI '[color] Channel Of Interest' function&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;IplImage* image_left_hue = cvCreateImage( cvSize(image_left-&gt;width, image_left-&gt;height), IPL_DEPTH_8U, 1 );&lt;br /&gt;cvSetImageCOI( image_left_hsv, 1);&lt;br /&gt;cvCopy(image_left_hsv, image_left_hue);  &lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;find only the parts of an image within a certain hue range&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;cvInRangeS(image_left_hue, cvScalarAll(huemin), cvScalarAll(huemax), image_msk);&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;erode it down to get rid of noise&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;cvErode(image_msk,image_msk,NULL, 3);&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;and then find the centers of mass of the found regions &lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;CvMoments moments;&lt;br /&gt;    cvMoments(image_msk, &amp;moments, 1);&lt;br /&gt;    double m00, m10, m01;&lt;br /&gt;&lt;br /&gt;    m00 = cvGetSpatialMoment(&amp;moments, 0,0);&lt;br /&gt;    m10 = cvGetSpatialMoment(&amp;moments, 1,0);&lt;br /&gt;    m01 = cvGetSpatialMoment(&amp;moments, 0,1);&lt;br /&gt; &lt;br /&gt;    // TBD check that m00 != 0&lt;br /&gt;    float center_x = m10/m00;&lt;br /&gt;    float center_y = m01/m00;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Copy the single channel mask back into a three channel rgb image&lt;br /&gt;&lt;code&gt;&lt;blockquote&gt; &lt;br /&gt;    IplImage* image_rgb = cvCreateImage( cvSize(image_msk-&gt;width, image_msk-&gt;height), IPL_DEPTH_8U, 3 );&lt;br /&gt;    cvSetImageCOI( image_rgb, 2);&lt;br /&gt;    cvCopy(image_msk,image_rgb);&lt;br /&gt;    cvSetImageCOI( image_rgb, 0);&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;and draw circles on a temp image where the centers of mass are&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;cvCircle(image_rgb,cvPoint(int(center_x),int(center_y)), 10, CV_RGB(200,50,50),3);&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;All the work of setting channels of interest and regions of interest was new to me.  I could have operated on images in place rather than creating many new ones, taking up more memory (and I would need to remember to free the memory created by all of them), but for debugging it's nice to keep around the intermediate steps.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-546225746260077561?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://opencv.willowgarage.com/' title='OpenCV example, and why does Google do so poorly?'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/546225746260077561/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=546225746260077561' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/546225746260077561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/546225746260077561'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2009/03/opencv-example-and-why-does-google-do.html' title='OpenCV example, and why does Google do so poorly?'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-8448765828247593560</id><published>2009-03-29T09:42:00.001-07:00</published><updated>2009-03-29T09:51:10.866-07:00</updated><title type='text'>mewantee example</title><content type='html'>I've made enough fixes to &lt;a href="http://mewantee.com"&gt;mewantee&lt;/a&gt; to open it open and allow most of it to be viewed without logging in, and creating a user no longer requires activation.&lt;br /&gt;&lt;br /&gt;There isn't much on there right now, but I have a good example:  There's a project called &lt;a href="http://code.google.com/p/crossephex/"&gt;crossephex&lt;/a&gt; I was working on a few months ago, and I'll probably start on it again soon.  It's supposed to be a vj/visuals generating tool for &lt;a href="http://processing.org"&gt;processing&lt;/a&gt; similar to gephex.  I need a bunch of basic graphics to use as primitives to mix with each other to create interesting effects, so on mewantee I have &lt;a href="http://mewantee.com/request/4"&gt;this request&lt;/a&gt;, which asks for help from other people generating those graphics.  Each one shouldn't take more than a few minutes to make, of course I could do it myself but I think it's a good example of what the site might be good for.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-8448765828247593560?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://mewantee.com' title='mewantee example'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/8448765828247593560/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=8448765828247593560' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/8448765828247593560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/8448765828247593560'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2009/03/mewantee-example.html' title='mewantee example'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-2158022368142251655</id><published>2009-03-25T19:02:00.000-07:00</published><updated>2009-03-25T19:15:56.251-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mewantee'/><title type='text'>mewantee!</title><content type='html'>I created a website called &lt;a href="http://mewantee.com"&gt;mewantee&lt;/a&gt; using google appengine.  It's closed to the public right now, but I need some users to try it out and tell me if they run into any problems using it normally, or any feedback at all.  If you login with a gmail account (google handles the login, I won't know anything except your email address, and even that will be hidden from other users), I'll be sent a notification email and I can then activate your account.&lt;br /&gt;&lt;br /&gt;What is it about?  Mainly I'd like it to incentivize the creation of creative commons and open source content and it uses a sort of economic model to do it.  Even if it is too strange or the kind of users needed to make it work don't show up, it was a good exercise to learn python and appengine.&lt;br /&gt;&lt;br /&gt;Something else to figure out- I have mewantee.com pointing to mewanteee.appspot.com, is there any way to make it stay mewantee.com to everyone else like they way this blog is really on blogspot.com but is seen as binarymillenium.com.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-2158022368142251655?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://mewantee.com' title='mewantee!'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/2158022368142251655/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=2158022368142251655' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/2158022368142251655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/2158022368142251655'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2009/03/mewantee.html' title='mewantee!'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-568512935779595335</id><published>2009-02-21T13:35:00.000-08:00</published><updated>2009-02-23T19:56:36.403-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gephex'/><title type='text'>Gephex 0.4.3 updated for Ubuntu 8.10</title><content type='html'>Since there hasn't been a better version of Gephex since 0.4.3 (though I haven't tried compiling the repository recently, last time was not successful), I've downloaded the source and hacked it until it built on Ubuntu 8.10 updated to today:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://binarymillenium.googlecode.com/files/gephex-0.4.3updated.tgz"&gt;http://binarymillenium.googlecode.com/files/gephex-0.4.3updated.tgz&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I haven't tested it all the way, especially the video input modules, but it probably works.  &lt;br /&gt;&lt;br /&gt;Most of the changes have to do with updates to gcc, where it treats classname::method in cpp files as errors, and some files needed to include stdlib.h or string.h that didn't before.  Also some structure definition in libavcodec had to be messed with- the static declaration removed.&lt;br /&gt;&lt;br /&gt;nasm, qt3 in the form libqt3-headers, and libxv-dev had to be installed (and other non-standard things for 8.10 that I already had installed for other purposes).  For qt3, flags for the include, bin, and lib dir needed to be passed to configure.&lt;br /&gt;&lt;br /&gt;I had to run configure in the ffmpeg library and disable mmx with the --disable-mmx flag, putting that flag in the top-level makefile didn't work.  My configuration specific makefiles are in the tarball so you would definitely have to rerun configure to override them.&lt;br /&gt;&lt;br /&gt;Next I'll be creating a new custom gephex module for my ARToolkit multimarker UI project.&lt;br /&gt;&lt;br /&gt;----&lt;br /&gt;&lt;br /&gt;Update&lt;br /&gt;&lt;br /&gt;I've tested this build more extensively, and have discovered that the Ubuntu visual effects that are on by default cause the gephex output window to flicker.  To disable them go to System | Preferences | Appearance | Visual Effects and select none.  It's possible I need to build gephex with OpenGL support and these options will co-exist better.&lt;br /&gt;&lt;br /&gt;Also, my &lt;A href="http://code.google.com/p/binarymillenium/source/browse/#svn/trunk/screencap%3Fstate%3Dclosed"&gt;screencap frei0r module&lt;/a&gt; I've depended on extensively in the past updates extremely slowly on the laptop I'm using currently, it may be an ATI thing (I originally developed it on an Nvidia system).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-568512935779595335?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/568512935779595335/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=568512935779595335' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/568512935779595335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/568512935779595335'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2009/02/gephex-043-updated-for-ubuntu-810.html' title='Gephex 0.4.3 updated for Ubuntu 8.10'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-4051679337877992886</id><published>2009-02-18T07:17:00.000-08:00</published><updated>2009-02-18T07:32:34.657-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='artoolkit'/><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>Marker Tracking as Visualization Interface</title><content type='html'>My idea is that I would be able to do an ARToolkit based visualization performance by using a clear table with markers I can slide, rotate, add and remove, and all those movement could correspond to events on screen.  Unlike other AR videos the source video wouldn't be incorporated into the output necessarily, the markers provide an almost infinitely expressive set of UI knobs and sliders.  &lt;br /&gt;&lt;br /&gt;So far I have this:&lt;br /&gt;&lt;br /&gt;&lt;object width="400" height="225"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=3264793&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=3264793&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/3264793"&gt;AR User Interface&lt;/a&gt; from &lt;a href="http://vimeo.com/user168788"&gt;binarymillenium&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The lighting is difficult, the markers need to be white and black pixels but the plexiglass tends to produce reflections.  Also if the light source itself is visible a marker will not be able to be right on top of it.  I need a completely black backdrop under the plexiglass so there are no reflections that will obscure the markers, and also more numerous and softer diffuse lights.&lt;br /&gt;&lt;br /&gt;One way to solve the reflection problem is to have the camera looking down at a table, though it's a little harder to get the camera up high enough, and I didn't want my hands or body to obscure the markers- the clear table idea is more elegant and self-contained.&lt;br /&gt;&lt;br /&gt;The frame rate isn't very high, I need to work on making it all more real-time and responsive.  It may have to be that one computer is capturing video and finding marker positions and sending them to another computer completely free to visualize it.  Also more interpolation and position prediction could smooth things out, and cover up gaps if a marker isn't recognized in a frame, but that could produce more lag.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-4051679337877992886?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/4051679337877992886/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=4051679337877992886' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/4051679337877992886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/4051679337877992886'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2009/02/marker-tracking-as-visualization.html' title='Marker Tracking as Visualization Interface'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-1371087457545469717</id><published>2009-01-29T06:37:00.000-08:00</published><updated>2009-02-03T06:39:44.365-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='bundler'/><category scheme='http://www.blogger.com/atom/ns#' term='3d'/><category scheme='http://www.blogger.com/atom/ns#' term='photosynth'/><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>Bundler - the Photosynth core algorithms GPLed</title><content type='html'>&lt;a href="http://www.flickr.com/photos/binarymillenium/3243645203/" title="bundler 212009 65922 AM.bmp by binarymillenium, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3094/3243645203_77818b9561.jpg" width="500" height="333" alt="bundler 212009 65922 AM.bmp" /&gt;&lt;/a&gt;&lt;br /&gt;[update- the output of bundler is less misaligned looking than this, I was incorrectly displaying the results here and in the video]&lt;br /&gt;&lt;br /&gt;Bundler (&lt;a href="http://phototour.cs.washington.edu/bundler"&gt;http://phototour.cs.washington.edu/bundler&lt;/a&gt;) takes photographs and can create 3D point clouds and camera positions derived from them similar to what Photosynth does- this is called structure from motion.  It's hard to believe this has been out as long as the publically available Photosynth but I haven't heard about it- it seems to be in stealth mode.&lt;br /&gt;&lt;br /&gt;&lt;object width="400" height="225"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=3035817&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=3035817&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/3035817"&gt;Bundler - GPLed Photosynth - Car&lt;/a&gt; from &lt;a href="http://vimeo.com/user168788"&gt;binarymillenium&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;From that video it is apparent that highly textured flat surfaces do best.  The car is reflective and dull grey and so generates few correspondences, but the hubcaps, license plate, parking strip lines, and grass and trees work well.  I wonder if this could be combined with a space carving technique to get a better car out of it.&lt;br /&gt;&lt;br /&gt;It's a lot rougher around the edges lacking the Microsoft Live Labs contribution, a few sets I've tried have crashed with messages like "RunBundler.sh: line 60:  2404 Segmentation fault      (core dumped) $MATCHKEYS list_keys.txt matches.init.txt" or sometimes individual images throw it with "This application has requested the Runtime to terminate it..." but it appears to plow through (until it reaches that former error).  &lt;br /&gt;&lt;br /&gt;Images without good EXIF data trip it up, the other day I was trying to search flickr and find only images that have EXIF data and allow full view, but am not successful so far.  Some strings supposed limit search results by focal length, which seems like would limit results only to EXIF, but that wasn't the case.&lt;br /&gt;&lt;br /&gt;Bundler outputs ply files, which can be read in &lt;a href="http://meshlab.sourceforge.net/"&gt;Meshlab&lt;/a&gt; with the modification that these two lines be added to ply header:&lt;br /&gt;&lt;br /&gt;element face 0&lt;br /&gt;property list uchar int vertex_index&lt;br /&gt;&lt;br /&gt;Without this Meshlab will give an error about there being no faces, and give up.&lt;br /&gt;&lt;br /&gt;Also I have some Processing software that is a little less user friendly but doesn't require the editing:&lt;br /&gt;&lt;a href="http://code.google.com/p/binarymillenium/source/browse/trunk/processing/bundler/"&gt;&lt;br /&gt;http://code.google.com/p/binarymillenium/source/browse/trunk/processing/bundler/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Bundler can't handle filenames with spaces right now, I think I can fix this myself without too much work, it's mostly a matter of making sure names are passed everywhere with quotes around them.&lt;br /&gt;&lt;br /&gt;Multi-megapixel files load up sift significantly until it crashes after taking a couple of gigabytes of memory (and probably not able to get more from windows):&lt;br /&gt;&lt;code&gt;&lt;br /&gt;...&lt;br /&gt;[Found in EXIF tags]&lt;br /&gt;  [CCD width = 5.720mm]&lt;br /&gt;  [Resolution = 3072 x 2304]&lt;br /&gt;  [Focal length (pixels) = 3114.965&lt;br /&gt;[Found 18 good images]&lt;br /&gt;[- Extracting keypoints -]&lt;br /&gt;&lt;br /&gt;This application has requested the Runtime to terminate it in an unusual way.&lt;br /&gt;Please contact the application's support team for more information.&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Resizing them to 1600x1200 worked without crashing and took only a few hundred megabytes of memory per image, so more megapixels may work as well.&lt;br /&gt;&lt;br /&gt;The most intriguing feature is the incremental option, I haven't tested it yet but it promises to be able to take new images and incorporate them into existing bundles.  Unfortunately each new image has a matching time proportional to the number of previous images- maybe it would be possible to incrementally remove images also, or remove found points that are in regions that already have high point densities?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-1371087457545469717?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://phototour.cs.washington.edu/bundler' title='Bundler - the Photosynth core algorithms GPLed'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/1371087457545469717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=1371087457545469717' title='21 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/1371087457545469717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/1371087457545469717'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2009/01/bundler-photosynth-core-algorithms.html' title='Bundler - the Photosynth core algorithms GPLed'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3094/3243645203_77818b9561_t.jpg' height='72' width='72'/><thr:total>21</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-5817101514802457167</id><published>2009-01-24T23:20:00.000-08:00</published><updated>2009-01-24T23:37:59.298-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><title type='text'>Nested blocks in Django duplication problems</title><content type='html'>The official instructions and cursory google searches didn't turn up a good explanation, but I've figured it out for myself.  I was confused about nesting blocks, sometimes getting no output or getting duplicate output.&lt;br /&gt;&lt;br /&gt;In this example the base has a single level of nesting with two sub-blocks.&lt;br /&gt;&lt;br /&gt;base.html:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;{% block outer %}&lt;br /&gt;&lt;br /&gt;{% block inner1 %}&lt;br /&gt;this is inner1&lt;br /&gt;{% endblock inner1 %}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;{% block inner2 %}&lt;br /&gt;this is inner2&lt;br /&gt;{% endblock inner2 %}&lt;br /&gt;&lt;br /&gt;{% endblock outer %}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;This file duplicate the original block structure but adds a comment:&lt;br /&gt;some.html:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;{% extends base.html %}&lt;br /&gt;&lt;br /&gt;{% block outer %}&lt;br /&gt;{{ block.super }}&lt;br /&gt;&lt;br /&gt;new stuff&lt;br /&gt;&lt;br /&gt;{% endblock outer %}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The output would be&lt;br /&gt;&lt;blockquote&gt;this is inner1&lt;br /&gt;this is inner 2&lt;br /&gt;new stuff&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Moving the 'new stuff' line before the the block.super would swap the order of the output statements.  There is no way to interject the new comment inbetween inner1 and inner2 without creating a new block that sits inbetween them in the parent base.html file.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Don't try to do this (which is what I thought to do initially):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;{% extends base.html %}&lt;br /&gt;&lt;br /&gt;{% block outer %}&lt;br /&gt;{{ block.super }}&lt;br /&gt;&lt;br /&gt;new stuff&lt;br /&gt;&lt;br /&gt;{% block inner2 %}&lt;br /&gt;new inner2&lt;br /&gt;{% endblock inner2 %}&lt;br /&gt;&lt;br /&gt;{% endblock outer %}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;It will result in duplication like this:&lt;br /&gt;&lt;blockquote&gt;this is inner1&lt;br /&gt;new inner2&lt;br /&gt;new stuff&lt;br /&gt;new inner2&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Instead, the extending file that wants to alter any parent block does it in a non-nested way, don't redefine an inherited block while inside of another inherited block:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;{% extends base.html %}&lt;br /&gt;&lt;br /&gt;{% block outer %}&lt;br /&gt;{{ block.super }}&lt;br /&gt;&lt;br /&gt;new stuff&lt;br /&gt;&lt;br /&gt;{% endblock outer %}&lt;br /&gt;&lt;br /&gt;{% block inner2 %}&lt;br /&gt;new inner2&lt;br /&gt;{% endblock inner2 %}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;And now the output will be without duplication.  &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;this is inner1&lt;br /&gt;new inner2&lt;br /&gt;new stuff&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;block.super needs to be in there or the redefinition of inner2 won't be applied to anything.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-5817101514802457167?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/5817101514802457167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=5817101514802457167' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/5817101514802457167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/5817101514802457167'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2009/01/nested-blocks-in-django-duplication.html' title='Nested blocks in Django duplication problems'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-8067230817716735687</id><published>2009-01-04T09:13:00.000-08:00</published><updated>2009-01-04T09:34:46.154-08:00</updated><title type='text'>Laser Scanning</title><content type='html'>The idea is to project laser lines onto a flat surface, image them, and then put objects in front of the surface and compute the displacement made by the object.&lt;br /&gt;&lt;br /&gt;Here is the flat base with a line on it:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_apbW4BHhLTg/SWDu9q5noiI/AAAAAAAABb8/dRvY_HboZq0/s1600-h/base1001.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 320px;" src="http://4.bp.blogspot.com/_apbW4BHhLTg/SWDu9q5noiI/AAAAAAAABb8/dRvY_HboZq0/s400/base1001.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5287488705788355106" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here is the line at the same position with objects intersecting:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_apbW4BHhLTg/SWDvXIIBIXI/AAAAAAAABcE/Ae0_83lxe6w/s1600-h/misc1001.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 320px;" src="http://4.bp.blogspot.com/_apbW4BHhLTg/SWDvXIIBIXI/AAAAAAAABcE/Ae0_83lxe6w/s400/misc1001.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5287489143130104178" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Finding depth involves figuring out what the 2d projection of the normal line that is perpendicular to the wall at any point along the laser line.  I'm working on this but it's also possible to guess an average line for low precision demonstration.  The software looks for all points where it believes the laser is shining, and then computes the intersection of the normal line with the original object free laser line, and gets depth.&lt;br /&gt;&lt;br /&gt;I had about 8 different images from laser lines, here are the results from two:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_apbW4BHhLTg/SWDydC0oPgI/AAAAAAAABcM/wyu48viKbDM/s1600-h/laserdepth1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 323px;" src="http://3.bp.blogspot.com/_apbW4BHhLTg/SWDydC0oPgI/AAAAAAAABcM/wyu48viKbDM/s400/laserdepth1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5287492543320702466" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_apbW4BHhLTg/SWDyhIpukEI/AAAAAAAABcU/sDxCi28ULMI/s1600-h/laserdepth2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 307px;" src="http://1.bp.blogspot.com/_apbW4BHhLTg/SWDyhIpukEI/AAAAAAAABcU/sDxCi28ULMI/s400/laserdepth2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5287492613605068866" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The yellow lines are the projected normals from the base line to the found laser line on the backpack and broom.  There are some spurious results, and also on the dark woven backpack material the laser was not always reflected strongly enough to register. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The source code is here:&lt;br /&gt;&lt;br /&gt;http://code.google.com/p/binarymillenium/source/browse/trunk/processing/laserscan&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-8067230817716735687?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://code.google.com/p/binarymillenium/source/browse/trunk/processing/laserscan' title='Laser Scanning'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/8067230817716735687/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=8067230817716735687' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/8067230817716735687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/8067230817716735687'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2009/01/laser-scanning.html' title='Laser Scanning'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_apbW4BHhLTg/SWDu9q5noiI/AAAAAAAABb8/dRvY_HboZq0/s72-c/base1001.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-1068429562652796568</id><published>2008-12-09T20:30:00.000-08:00</published><updated>2008-12-09T20:44:15.843-08:00</updated><title type='text'>Multicamera Balloon Imagery</title><content type='html'>&lt;object width="400" height="225"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=2470571&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=2470571&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/2470571"&gt;AHAB Tether Test&lt;/a&gt; from &lt;a href="http://vimeo.com/user168788"&gt;binarymillenium&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I originally was reminded of the unused source images because another team member recently posted some pictures from their camera, and then I made this, and then &lt;a href="http://brepettis.com/blog/2008/12/09/diy-space/"&gt;Bre posted about it&lt;/a&gt;, so it's getting a lot of positive feedback.&lt;br /&gt;&lt;br /&gt; This video would have been made earlier but I had assumed that the cameras were screwy and firing at different times and image sequences would not line up at all- turns out they did, they just had wildly different start points.&lt;br /&gt;&lt;br /&gt;Also I finished this school project that was kind of a simple occupancy grid inspired thing, this video shows parts of it:&lt;br /&gt;&lt;br /&gt;&lt;object width="400" height="225"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=2383465&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=2383465&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/2383465"&gt;2.5D&lt;/a&gt; from &lt;a href="http://vimeo.com/user168788"&gt;binarymillenium&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I might revisit some of this and get the registration code working (and working a lot faster), instead of cheating and using the known camera position and attitude.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-1068429562652796568?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://vimeo.com/2470571' title='Multicamera Balloon Imagery'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/1068429562652796568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=1068429562652796568' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/1068429562652796568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/1068429562652796568'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/12/multicamera-balloon-imagery.html' title='Multicamera Balloon Imagery'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-1199091849418268343</id><published>2008-11-21T08:34:00.000-08:00</published><updated>2008-11-28T16:56:53.672-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>Depth buffer to 3d coordinates?</title><content type='html'>I'm having trouble transforming screen coordinates back to 3d, which &lt;a href="http://processing.org/discourse/yabb_beta/YaBB.cgi?board=OpenGL;action=display;num=1227285113;start=0#0"&gt;this post&lt;/a&gt; describes- can anyone help me?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_apbW4BHhLTg/SSbj5x_kgfI/AAAAAAAABVo/tfMC1rPf8JI/s1600-h/depth10000.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 400px;" src="http://4.bp.blogspot.com/_apbW4BHhLTg/SSbj5x_kgfI/AAAAAAAABVo/tfMC1rPf8JI/s400/depth10000.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5271150995695763954" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_apbW4BHhLTg/SSbkC6DhS-I/AAAAAAAABVw/06OGdPIrmVU/s1600-h/frame00001.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 200px;" src="http://1.bp.blogspot.com/_apbW4BHhLTg/SSbkC6DhS-I/AAAAAAAABVw/06OGdPIrmVU/s400/frame00001.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5271151152478637026" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;Update - I've got it figured out now, I should have been using gluUnProject:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;FloatBuffer fb;&lt;br /&gt;&lt;br /&gt;fb = BufferUtil.newFloatBuffer(width*height);&lt;br /&gt;&lt;br /&gt;gl.glReadPixels(0, 0, width, height, GL.GL_DEPTH_COMPONENT, GL.GL_FLOAT, fb); &lt;br /&gt;fb.rewind();&lt;br /&gt;&lt;br /&gt;int viewport[] = new int[4]; &lt;br /&gt;double[] proj=new double[16];&lt;br /&gt;double[] model=new double[16];&lt;br /&gt;gl.glGetIntegerv(GL.GL_VIEWPORT, viewport, 0);&lt;br /&gt;gl.glGetDoublev(GL.GL_PROJECTION_MATRIX,proj,0);&lt;br /&gt;gl.glGetDoublev(GL.GL_MODELVIEW_MATRIX,model,0);&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;for(int i...&lt;br /&gt;for (int j...&lt;br /&gt;...&lt;br /&gt;glu.gluUnProject(i,height-j,rawd, model,0,proj,0,viewport,0,pos,0); &lt;br /&gt;float d = (float)-pos[2];&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;After all that depth d will be linear and in proper world coordinates.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-1199091849418268343?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://processing.org/discourse/yabb_beta/YaBB.cgi?board=OpenGL;action=display;num=1227285113;start=0#0' title='Depth buffer to 3d coordinates?'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/1199091849418268343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=1199091849418268343' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/1199091849418268343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/1199091849418268343'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/11/depth-buffer-to-3d-coordinates.html' title='Depth buffer to 3d coordinates?'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_apbW4BHhLTg/SSbj5x_kgfI/AAAAAAAABVo/tfMC1rPf8JI/s72-c/depth10000.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-7174226668015457395</id><published>2008-11-20T07:02:00.000-08:00</published><updated>2008-11-20T07:11:35.602-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lidar'/><category scheme='http://www.blogger.com/atom/ns#' term='laser'/><category scheme='http://www.blogger.com/atom/ns#' term='artoolkit'/><category scheme='http://www.blogger.com/atom/ns#' term='rangefinder'/><title type='text'>Artoolkit + rangefinder</title><content type='html'>Since my relatively inexpensive &lt;a href="http://binarymillenium.com/2008/10/artoolkit-rangefinding-continued.html"&gt;purely visual depth map&lt;/a&gt; approach wasn't that successful, I've tried it out using a rangefinder instead of a visible laser.  This means I can point the video camera straight at the marker (which is attached to the rangefinder), and it can point at anything provided I don't tilt it so the camera can't see the marker/fiducial.&lt;br /&gt;&lt;br /&gt;This is the result:&lt;br /&gt;&lt;br /&gt;&lt;object width="400" height="225"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=2294333&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=2294333&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/2294333"&gt;Artoolkit with a Rangefinder&lt;/a&gt; from &lt;a href="http://vimeo.com/user168788"&gt;binarymillenium&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The following plots show the tracked attitude of the rangefinder as measured by ARToolkit:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_apbW4BHhLTg/SSV8p4_g8kI/AAAAAAAABUY/7uUlOalikJo/s1600-h/camera_angle_side.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 293px;" src="http://3.bp.blogspot.com/_apbW4BHhLTg/SSV8p4_g8kI/AAAAAAAABUY/7uUlOalikJo/s400/camera_angle_side.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5270755998022300226" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_apbW4BHhLTg/SSV8iB5L4wI/AAAAAAAABUQ/bYvT63vGNlA/s1600-h/camera_angle_top.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 293px;" src="http://3.bp.blogspot.com/_apbW4BHhLTg/SSV8iB5L4wI/AAAAAAAABUQ/bYvT63vGNlA/s400/camera_angle_top.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5270755862972719874" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_apbW4BHhLTg/SSV8R4Ch3gI/AAAAAAAABUA/fvoejwdpL2E/s1600-h/camera_angle_45.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 293px;" src="http://4.bp.blogspot.com/_apbW4BHhLTg/SSV8R4Ch3gI/AAAAAAAABUA/fvoejwdpL2E/s400/camera_angle_45.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5270755585449647618" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;My left to right bottom to top scanning approach is very apparent.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And here is the tracked attitude (as a 3-component vector) plus the range vs. time:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_apbW4BHhLTg/SSV8_pYKGbI/AAAAAAAABUg/pjBm8I-gMQ0/s1600-h/dist.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 295px;" src="http://4.bp.blogspot.com/_apbW4BHhLTg/SSV8_pYKGbI/AAAAAAAABUg/pjBm8I-gMQ0/s400/dist.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5270756371787815346" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can see how cyclical it is, as I scan the floor in front of me the range doesn't change much until I reach one end and tilt the tripod up a little, and then later on I start to capture the two wheels of the car.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-7174226668015457395?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/7174226668015457395/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=7174226668015457395' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/7174226668015457395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/7174226668015457395'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/11/artoolkit-rangefinder.html' title='Artoolkit + rangefinder'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_apbW4BHhLTg/SSV8p4_g8kI/AAAAAAAABUY/7uUlOalikJo/s72-c/camera_angle_side.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-3400991549239694626</id><published>2008-11-09T08:16:00.000-08:00</published><updated>2008-11-09T08:49:24.451-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='robotics'/><title type='text'>University of Washington BioRobotics Lab</title><content type='html'>I took a tour of the UW BioRobotics Lab, where an old professor of mine works on telerobotics with haptic interfaces.&lt;br /&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/XxZH072pTNFK7KzeBbvvGQ"&gt;&lt;img src="http://lh5.ggpht.com/_apbW4BHhLTg/SRcLo6O2SiI/AAAAAAAABR0/D1SlgGqL8gQ/s400/DSC_8019.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;This is a &lt;a href="http://brl.ee.washington.edu/Research_Active/Surgery/Project_07/Project_07.html"&gt; surgery robot called 'The Raven'&lt;/a&gt;.  It's mostly camouflaged due to the large amounts of detail and contrast in the robot itself and in the background.  The DV camera is going to be replaced by a pair of HD cameras that will provide stereo vision.&lt;br /&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/AM0mNj0RMzh6YYmtJ7GCnw"&gt;&lt;img src="http://lh5.ggpht.com/_apbW4BHhLTg/SRcLrb-sf5I/AAAAAAAABR8/tOwvo9RdGzI/s400/DSC_8020.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Multiple motors pull on cables seen in a later photo that control the manipulator end of the arm.&lt;br /&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/J_HpC1zhsjfz7FV8ueeMGw"&gt;&lt;img src="http://lh6.ggpht.com/_apbW4BHhLTg/SRcLucmRmtI/AAAAAAAABSE/mJzMq_mgI5U/s400/DSC_8021.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/OwHZDdFb9UejpZlGwVam4A"&gt;&lt;img src="http://lh5.ggpht.com/_apbW4BHhLTg/SRcLvxfWcvI/AAAAAAAABSM/Fj5cv_kq2Z0/s400/DSC_8022.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/chP-klXN-TqNWLkf_JSRJw"&gt;&lt;img src="http://lh3.ggpht.com/_apbW4BHhLTg/SRcLxXiW39I/AAAAAAAABSU/EseschwUoiU/s400/DSC_8023.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/1G00m4EK58H1Eweba_uxRw"&gt;&lt;img src="http://lh6.ggpht.com/_apbW4BHhLTg/SRcL4g7kXQI/AAAAAAAABSs/tc6v-v49Ohc/s400/DSC_8026.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ee.washington.edu/people/faculty/hannaford/"&gt;Blake Hannaford&lt;/a&gt; shows the arms that will replace the manually positioned arms seen in the previous photos.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/0cksb52fO6X1xLE8ikET6w"&gt;&lt;img src="http://lh3.ggpht.com/_apbW4BHhLTg/SRcL7QV2lPI/AAAAAAAABS0/WUrct79qidY/s400/DSC_8027.jpg" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-3400991549239694626?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://brl.ee.washington.edu/' title='University of Washington BioRobotics Lab'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/3400991549239694626/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=3400991549239694626' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/3400991549239694626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/3400991549239694626'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/11/university-of-washington-bioobotics-lab.html' title='University of Washington BioRobotics Lab'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_apbW4BHhLTg/SRcLo6O2SiI/AAAAAAAABR0/D1SlgGqL8gQ/s72-c/DSC_8019.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-4992644749959372580</id><published>2008-10-14T20:35:00.001-07:00</published><updated>2008-10-14T20:46:00.990-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gimp'/><title type='text'></title><content type='html'>&lt;a href="http://picasaweb.google.com/binarymillenium/20081012_garden_bee#"&gt;&lt;img src="http://picasaweb.google.com/lh/photo/9pMkX5MwRNqfA437l1Rfrw?authkey=fgmD_u59U30"&gt;&lt;img src="http://lh4.ggpht.com/binarymillenium/SPVlRN5K7xI/AAAAAAAABIU/SGNPsY1S2Oc/s800/hang_in_there_bee2.jpg" title="hang in there"/&gt;&lt;/img&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hey lil feller.  I'm just going to pick you up with this stick and you can hang on, take you back to the garden.  I didn't mean to wake you up from your hibernation or whatever.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-4992644749959372580?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/4992644749959372580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=4992644749959372580' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/4992644749959372580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/4992644749959372580'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/10/hey-lil-feller.html' title=''/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/binarymillenium/SPVlRN5K7xI/AAAAAAAABIU/SGNPsY1S2Oc/s72-c/hang_in_there_bee2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-3255840443634716279</id><published>2008-10-07T21:10:00.000-07:00</published><updated>2008-10-08T07:20:06.454-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='artoolkit'/><title type='text'>Artoolkit rangefinding continued</title><content type='html'>I've discovered the  &lt;a href="http://artoolkit.sourceforge.net/apidoc/param_8h.html#e31d34be66699b8343aedaef1d627777"&gt;arParamObserv2Ideal() &lt;/a&gt; function to correct for image distortion, and I think it has improved things.  But my main problem is figuring out how to properly project the line from the origin through the laser dot in marker/fiducial space.  I have a message out on the mailing list but it is not that active.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_apbW4BHhLTg/SOwyypGnpMI/AAAAAAAABEU/knfZ0OEQ78Y/s1600-h/output2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_apbW4BHhLTg/SOwyypGnpMI/AAAAAAAABEU/knfZ0OEQ78Y/s400/output2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5254630710842991810" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The results of my crude &lt;a href="http://code.google.com/p/binarymillenium/source/browse/trunk/#trunk/processing/fillgaps"&gt;fillgaps&lt;/a&gt; processing app are shown below, using the somewhat sparse points from above.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_apbW4BHhLTg/SOw0FI0A3jI/AAAAAAAABEc/YgAb_9pHl-o/s1600-h/output3.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_apbW4BHhLTg/SOw0FI0A3jI/AAAAAAAABEc/YgAb_9pHl-o/s400/output3.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5254632128104160818" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The above results look pretty good- the points along the edge of the wall and floor are the furthest from the camera so appear black, and the floor and wall toward the top and bottom of the image are closer and get brighter.&lt;br /&gt;&lt;br /&gt;My main problem is getting live feedback of where I've gotten points.  With a live view that showed all found depth points it would be easier to achieve uniform coverage, rather than going off of memory.  My problem there is that to use artoolkit I have to detect the markers, then shrink the image down and draw dots over it- not too hard sounding but the first time I tried it got all messed up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-3255840443634716279?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/3255840443634716279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=3255840443634716279' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/3255840443634716279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/3255840443634716279'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/10/artoolkit-rangefinding-continued.html' title='Artoolkit rangefinding continued'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_apbW4BHhLTg/SOwyypGnpMI/AAAAAAAABEU/knfZ0OEQ78Y/s72-c/output2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-9198929206761887766</id><published>2008-10-05T21:43:00.000-07:00</published><updated>2008-10-07T21:39:07.074-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='artoolkit'/><title type='text'>Depth Maps with ARToolkit and a Laser Pointer</title><content type='html'>Flying home from a recent trip to the east coast, I tried to figure out what the most inexpensive method for approximating scanning lidar would be.  This is my answer:&lt;br /&gt;&lt;br /&gt;&lt;object width="400" height="225"&gt; &lt;param name="allowfullscreen" value="true" /&gt; &lt;param name="allowscriptaccess" value="always" /&gt; &lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=1897078&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" /&gt; &lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=1897078&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/1897078?pg=embed&amp;amp;sec=1897078"&gt;ARToolKit assisted laser rangefinding&lt;/a&gt; from &lt;a href="http://vimeo.com/user168788?pg=embed&amp;amp;sec=1897078"&gt;binarymillenium&lt;/a&gt; on &lt;a href="http://vimeo.com?pg=embed&amp;amp;sec=1897078"&gt;Vimeo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It's not that inexpensive, since I'm using a high resolution network camera similar to an Elphel- but it's possible I could replace it with a good consumer still camera with a linux supported usb interface for getting live images.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/U_aq3uoxPU2VAjekjECanA?authkey=fgmD_u59U30"&gt;&lt;img src="http://lh3.ggpht.com/binarymillenium/SOmfhfvQ6UI/AAAAAAAABDc/oDCuBVsxTvw/s400/artoolkitlaser.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In the above screen shot the line projected from the found fiducial is shown, and the target where the found red laser dot is- they ought to cross each other but I need to learn more about transforming coordinates in and out of the camera space in ARToolkit to improve upon it.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/P2mUCM-NBNssM2Gg3gMFfg?authkey=fgmD_u59U30"&gt;&lt;img src="http://lh6.ggpht.com/binarymillenium/SOmUz51lTVI/AAAAAAAABC8/YryXJFQtpZs/s400/now0001.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/olFcKziqe5H_4k2T6Xmf3g?authkey=fgmD_u59U30"&gt;&lt;img src="http://lh3.ggpht.com/binarymillenium/SOmU0EIhutI/AAAAAAAABDM/X_lzrEfGcuI/s400/output_good.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/GJGiClHNWXHgoPS6UNp0xA?authkey=fgmD_u59U30"&gt;&lt;img src="http://lh3.ggpht.com/binarymillenium/SOmU0NvBkTI/AAAAAAAABDE/F_YufxTtw24/s400/output_good_composite.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This picture shows that the left side of the screen is 'further' away than the wall on the right, but that is not quite right- it is definitely further away from the fiducial, so I may be making an error.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/binarymillenium/source/browse/trunk/artoolkit/laser"&gt;source code&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-9198929206761887766?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/9198929206761887766/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=9198929206761887766' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/9198929206761887766'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/9198929206761887766'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/10/depth-maps-with-artoolkit-and-laser.html' title='Depth Maps with ARToolkit and a Laser Pointer'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/binarymillenium/SOmfhfvQ6UI/AAAAAAAABDc/oDCuBVsxTvw/s72-c/artoolkitlaser.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-6117933513931773536</id><published>2008-10-05T09:59:00.000-07:00</published><updated>2008-11-09T08:49:36.302-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='robotics'/><title type='text'>Intel Research Seattle - Open House</title><content type='html'>&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/ik_UmEYwc8ZjhJNeCjf0DQ"&gt;&lt;img src="http://lh3.ggpht.com/binarymillenium/SORD6tpYj8I/AAAAAAAAA98/Y5Aeavzdmwk/s400/DSC_7809.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/binarymillenium/20081001IntelResearchSeattle"&gt;2008.10.01 Intel Research Seattle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Robotic Arm&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/iK9dqQiI03BI6fTkIjeUuQ"&gt;&lt;img src="http://lh6.ggpht.com/binarymillenium/SORDZd30OVI/AAAAAAAAA7Y/HyikAOu1peI/s400/DSC_7785.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/binarymillenium/20081001IntelResearchSeattle"&gt;2008.10.01 Intel Research Seattle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/NC1uWHPvpmeV5Vod-HOzQA"&gt;&lt;img src="http://lh4.ggpht.com/binarymillenium/SORDchUJ94I/AAAAAAAAA7w/YCKWSMrlWMA/s400/DSC_7792.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/binarymillenium/20081001IntelResearchSeattle"&gt;2008.10.01 Intel Research Seattle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;This robot had a camera and em field sensors in its hand, and could detect the presence of an object within grasping distant.  Some objects it had been trained to recognize, and others it did not but would attempt to grab anyway.  Voice synthesis provided additional feedback- most humorously when it accidently (?) dropped something it said 'oops'.  Also motor feedback sensed when the arm was pushed on, and the arm would give way- making it much safer than an arm that would blindly power through any obstacle.&lt;br /&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/oFBC7KYIWVahZUx7YbPMvg"&gt;&lt;img src="http://lh4.ggpht.com/binarymillenium/SORDahjNPsI/AAAAAAAAA7g/3IpE5B9XVFU/s400/DSC_7786.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/binarymillenium/20081001IntelResearchSeattle"&gt;2008.10.01 Intel Research Seattle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/ubKWf-72K5h-pgPb-42yiw"&gt;&lt;img src="http://lh5.ggpht.com/binarymillenium/SORDbgkea_I/AAAAAAAAA7o/9Kar0dqKf8M/s400/DSC_7789.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/binarymillenium/20081001IntelResearchSeattle"&gt;2008.10.01 Intel Research Seattle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;It's insane, this application level taint&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/p8zcdYvAb__PYaps3osdEw"&gt;&lt;img src="http://lh5.ggpht.com/binarymillenium/SORDqtuKUbI/AAAAAAAAA80/iaRuJw6UG2A/s400/DSC_7800.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/binarymillenium/20081001IntelResearchSeattle"&gt;2008.10.01 Intel Research Seattle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;I don't really know what this is about...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Directional phased array wireless networking&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/jswwJWLRwppU1xiW_oEOJw"&gt;&lt;img src="http://lh3.ggpht.com/binarymillenium/SORDrz_3ZgI/AAAAAAAAA88/Y4k5Ns-ojuI/s400/DSC_7801.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/binarymillenium/20081001IntelResearchSeattle"&gt;2008.10.01 Intel Research Seattle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;The phased array part is pretty cool, but the application wasn't that compelling:  Using two directional antennas a select zone can be provided with wireless access and other zones not overlapped by the two excluded.  Maybe if it's more power efficient that way?&lt;br /&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/Ab-JOGWC3SHaYzEe3wp6Vg"&gt;&lt;img src="http://lh4.ggpht.com/binarymillenium/SORDuF7PdmI/AAAAAAAAA9E/Q0UwrmEq4eY/s400/DSC_7802.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/binarymillenium/20081001IntelResearchSeattle"&gt;2008.10.01 Intel Research Seattle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/YNXADR0MizM8uss-vYu3KQ"&gt;&lt;img src="http://lh6.ggpht.com/binarymillenium/SORDvu6_CII/AAAAAAAAA9M/lbkyRSfjcHI/s400/DSC_7803.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/binarymillenium/20081001IntelResearchSeattle"&gt;2008.10.01 Intel Research Seattle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;This antenna also had a motorized base, so that comparisons between physically rotating the antenna and rotating the field pattern could be made.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Haptic squeeze&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/qSBu_NNnsFvPN7nn-5uQZg"&gt;&lt;img src="http://lh6.ggpht.com/binarymillenium/SORD1Le5oMI/AAAAAAAAA9k/DaWh8AfTDSI/s400/DSC_7806.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/binarymillenium/20081001IntelResearchSeattle"&gt;2008.10.01 Intel Research Seattle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;This squeeze thing has a motor in it to resist pressure, but was broken at the time I saw it.  The presenter said it wasn't really intended to simulate handling of real objects in virtual space like other haptic interfaces might, but be used more abstractly as a interface to anything.&lt;br /&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/3Nt2spvaG_g-i_8KVqd9nQ"&gt;&lt;img src="http://lh3.ggpht.com/binarymillenium/SORD4HnG2jI/AAAAAAAAA90/1cc-O2VgFYk/s400/DSC_7808.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/binarymillenium/20081001IntelResearchSeattle"&gt;2008.10.01 Intel Research Seattle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;RFID Accelerometer&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/ygbK_shWTDW3SnNRRYwvUg"&gt;&lt;img src="http://lh5.ggpht.com/binarymillenium/SORD-fiHFsI/AAAAAAAAA-M/4a7kJFAdu8o/s400/DSC_7815.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/binarymillenium/20081001IntelResearchSeattle"&gt;2008.10.01 Intel Research Seattle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/AQZvs7DJLFojUXhZZUYKxg"&gt;&lt;img src="http://lh3.ggpht.com/binarymillenium/SOREBx9fjyI/AAAAAAAAA-g/ZoxSGN41_6g/s400/DSC_7817.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/binarymillenium/20081001IntelResearchSeattle"&gt;2008.10.01 Intel Research Seattle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;This was one of two rfid accelerometers- powered entirely from the rfid antenna, the device sends back accelerometer data to rotate a planet on a computer screen.  The range was very limited, and the update rate about 10 Hz.  The second device could be charged within range of the field, then be taken out of range and moved around, then brought back to the antenna and download a time history (only 2 Hz now) of measurements taken.  The canonical application is putting the device in a shipped package and then reading what it experienced upon receipt.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Wireless Resonant Energy&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/Qr4_TffooM9hwA3jtpqjiQ"&gt;&lt;img src="http://lh3.ggpht.com/binarymillenium/SOREGsDo2AI/AAAAAAAAA-w/_Rp1scC96kM/s400/DSC_7821.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/binarymillenium/20081001IntelResearchSeattle"&gt;2008.10.01 Intel Research Seattle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/xV-Ljh6P5GgUoMXJXjhubg"&gt;&lt;img src="http://lh4.ggpht.com/binarymillenium/SOREEebu4ZI/AAAAAAAAA-o/uhh87c82Noo/s400/DSC_7819.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/binarymillenium/20081001IntelResearchSeattle"&gt;2008.10.01 Intel Research Seattle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;This has had plenty of coverage elsewhere but is very cool to see in person.  Currently moving the receiver end more than an inch forward or back or rotating it causes the light buld to dim and go out.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Scratch Interface&lt;/b&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/jnvrjTRcnShLBJD8JA6fOA"&gt;&lt;img src="http://lh4.ggpht.com/binarymillenium/SOREJpxJbPI/AAAAAAAAA_A/8z1xpLEotag/s400/DSC_7825.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/binarymillenium/20081001IntelResearchSeattle"&gt;2008.10.01 Intel Research Seattle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;A simple interface where placing a microphone on a surface and then tapping on the surface in distinct ways can be used to control a device.  Also a very simple demo of using opencv face tracking to reorient a displayed video to correct for distortion seen when viewing a flat screen from an angle.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Look around the building&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/n0NOSAeeYb3_HmCu4Wj0Ew"&gt;&lt;img src="http://lh5.ggpht.com/binarymillenium/SORDxpPCmqI/AAAAAAAAA9U/cDVR86Ei1cM/s400/DSC_7804.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/binarymillenium/20081001IntelResearchSeattle"&gt;2008.10.01 Intel Research Seattle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/wNse03Iv1ZoySptIKgKGLg"&gt;&lt;img src="http://lh3.ggpht.com/binarymillenium/SOREk193RsI/AAAAAAAABA0/EDoTmJGsNpE/s400/DSC_7839.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/binarymillenium/20081001IntelResearchSeattle"&gt;2008.10.01 Intel Research Seattle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/vykS5nGqAKJ-049yJcsylA"&gt;&lt;img src="http://lh4.ggpht.com/binarymillenium/SOREnSDqRLI/AAAAAAAABA8/s_0O6vvQZU8/s400/DSC_7840.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/binarymillenium/20081001IntelResearchSeattle"&gt;2008.10.01 Intel Research Seattle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;I found myself walking in a circle and not quite intuitively feeling I had completed a circuit when I actually had.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Also see &lt;a href="http://www.xconomy.com/boston/2008/10/02/personal-robots-home-sensing-private-networks-and-more-from-intel-research-seattles-open-house/attachment/wirelesspower/"&gt;another article about this&lt;/a&gt;, and Intel's &lt;a href="http://www.flickr.com/photos/intelphotos/sets/72157607675418748/"&gt;flickr photos&lt;/a&gt;, and a &lt;a href="http://www.wherearejohnandtodd.com/?p=278"&gt;a video&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-6117933513931773536?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.seattle.intel-research.net/' title='Intel Research Seattle - Open House'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/6117933513931773536/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=6117933513931773536' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/6117933513931773536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/6117933513931773536'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/10/intel-research-seattle-open-house.html' title='Intel Research Seattle - Open House'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/binarymillenium/SORD6tpYj8I/AAAAAAAAA98/Y5Aeavzdmwk/s72-c/DSC_7809.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-7971744072355724666</id><published>2008-09-26T21:08:00.000-07:00</published><updated>2008-09-26T21:12:49.282-07:00</updated><title type='text'>initialization discards qualifiers from pointer target type</title><content type='html'>A const may be needed, the following produces the error:&lt;br /&gt;&lt;code&gt;&lt;br /&gt; PixelPacket *p = AcquireImagePixels(image,0,y,image-&gt;columns,1,&amp;image-&gt;exception);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;while this fixes it:&lt;br /&gt;&lt;code&gt;&lt;br /&gt; const PixelPacket *p = AcquireImagePixels(image,0,y,image-&gt;columns,1,&amp;image-&gt;exception);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;In other news hopefully soon I'll have an ARToolkit app for reading in jpegs using ImageMagick, and also that app will have some other more exciting attributes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-7971744072355724666?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/7971744072355724666/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=7971744072355724666' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/7971744072355724666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/7971744072355724666'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/09/initialization-discards-qualifiers-from.html' title='initialization discards qualifiers from pointer target type'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-6421253582753382191</id><published>2008-09-08T22:24:00.000-07:00</published><updated>2008-09-09T20:49:55.422-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>Increased Dynamic Range For Depth Maps, and Collages in Picasa 3</title><content type='html'>&lt;object width="400" height="225"&gt; &lt;param name="allowfullscreen" value="true" /&gt; &lt;param name="allowscriptaccess" value="always" /&gt; &lt;param name="movie" value="http://www.vimeo.com/moogaloop.swf?clip_id=1604343&amp;amp;server=www.vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" /&gt; &lt;embed src="http://www.vimeo.com/moogaloop.swf?clip_id=1604343&amp;amp;server=www.vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://www.vimeo.com/1604343?pg=embed&amp;amp;sec=1604343"&gt;360 Vision + 3rd Person Composite&lt;/a&gt; from &lt;a href="http://www.vimeo.com/user168788?pg=embed&amp;amp;sec=1604343"&gt;binarymillenium&lt;/a&gt; on &lt;a href="http://vimeo.com?pg=embed&amp;amp;sec=1604343"&gt;Vimeo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;After I compressed the above video into a WMV I was dissatisfied with how little depth detail there is in the 360 degree vision part - it's the top strip.  I initially liked the cleaner single shade look, but now I realize the utility of using a range of colors for depth fields (or IR/thermal imaging also)- it increases the number of colors to represent different depths beyond 256 to a larger number.  Earlier I tried using one color channel for higher order bits and another for lower order bits (so the depth could be computed like red*256+green) for a total of 256*256 depth levels (or even 256^3 or 256^4 using alpha), but visually it's a mess.&lt;br /&gt;&lt;br /&gt;But visual integrity can be maintained while multiplying that 256 levels by five or a bit more with additional work.&lt;br /&gt;&lt;br /&gt;Taking six colors, three of them are pure red, green, blue, and inbetween there is (255,255,0) for yellow and the other two pure combinations of two channels.  Between each subsequent set there can be 256 interpolated values, and in the end a color bar like the follow is generated with 1280 different values:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_apbW4BHhLTg/SLTQVBl2J1I/AAAAAAAAAdg/jtd2VPXQSjQ/s1600-h/colorrange.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_apbW4BHhLTg/SLTQVBl2J1I/AAAAAAAAAdg/jtd2VPXQSjQ/s400/colorrange.png" alt="" id="BLOGGER_PHOTO_ID_5239041326161733458" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://chart.apis.google.com/chart?cht=lc&amp;chco=ff0000,0000ff,00ff00&amp;chd=t:100,0,0,0,100,100|100,100,100,0,0,0|0,0,100,100,100,0&amp;chs=400x120&amp;chl=purple|blue|lightblue|green|yellow|red&amp;chls=5,1,0|5,1,0|5,1,0&amp;chxs="&gt;&lt;/img&gt;&lt;br /&gt;&lt;br /&gt;The bottom color bar shows the differences between adjacent values- if the difference was none then it would be black in spots, so my interpolation is verified.&lt;br /&gt;&lt;br /&gt;Applying this to the &lt;A href="http://binarymillenium.googlecode.com/files/velodyne.zip"&gt;lidar data&lt;/a&gt;, I produced a series of images with a &lt;a href="http://binarymillenium.googlecode.com/svn-history/r286/trunk/processing/velosphere/color_spectrum.pde"&gt;processing project&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_apbW4BHhLTg/SMYH6CXwnSI/AAAAAAAAApM/3MfaArHHDrU/s1600-h/frames.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_apbW4BHhLTg/SMYH6CXwnSI/AAAAAAAAApM/3MfaArHHDrU/s400/frames.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5243887509769854242" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;After making all the images I tried out Picasa 3 to produce a collage- the straightforward grid makes the most sense here.  Picasa 3 crashed a few times in the collage editor before I was able to get this exported.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-6421253582753382191?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/6421253582753382191/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=6421253582753382191' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/6421253582753382191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/6421253582753382191'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/09/increased-dynamic-range-for-depth-maps.html' title='Increased Dynamic Range For Depth Maps, and Collages in Picasa 3'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_apbW4BHhLTg/SLTQVBl2J1I/AAAAAAAAAdg/jtd2VPXQSjQ/s72-c/colorrange.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-2926487370076967743</id><published>2008-08-31T07:50:00.000-07:00</published><updated>2009-06-05T06:39:05.092-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photosynth'/><title type='text'>Photosynth Export Process Tutorial</title><content type='html'>It looks like I have unofficial recognition/support for my export process, but I get the feeling it's still too user unfriendly:&lt;br /&gt;&lt;a href="http://getsatisfaction.com/livelabs/topics/pointcloud_exporter"&gt;&lt;br /&gt;http://getsatisfaction.com/livelabs/topics/pointcloud_exporter&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What to do&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Get Wireshark &lt;a href="http://www.wireshark.org/"&gt;http://www.wireshark.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Allow it to install the special software to intercept packets.&lt;br /&gt;&lt;br /&gt;Start Wireshark.  Put&lt;br /&gt;&lt;code&gt;&lt;br /&gt;http.request&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;into the filter field.&lt;br /&gt;&lt;br /&gt;Quit any unnecessary network activity like playing youtube videos- this will dump in a lot of data to wireshark that will making finding the bin files harder.&lt;br /&gt;&lt;br /&gt;*** Update ***&lt;br /&gt;Some users have found the bin files stored locally in %temp%/photosynther, which makes finding them much easier than using Wireshark, but the for me on Vista the directory exists for one user but not others- but the bin files have to be stored locally somewhere right?&lt;br /&gt;***&lt;br /&gt;&lt;br /&gt;Open the photosynth site in a browser.  Find a synth with a good point cloud, it will probably be one with several hundred photos and a synthiness of &gt; 70%.  There are some synths that are 100% synthy but have point clouds that are flat billboards rather than cool 3D features- you don't want those.  Press p or hold ctrl to see the underlying point cloud.&lt;br /&gt;&lt;br /&gt;*** Update ***&lt;br /&gt;Use the direct 3d viewer option to view the synth, otherwise you won't get the synth files. (thanks losap)&lt;br /&gt;***&lt;br /&gt;&lt;br /&gt;Start a capture in Wireshark - the upper left butter and then click the proper interface (experiment if necessary).&lt;br /&gt;&lt;br /&gt;Hit reload on the browser window showing the synth.  Wireshark should then start show ing what files are being sent to your computer.  Stop the capture once the browser has finished reloading.  There may be a couple screen fulls but near the bottom should be a few listings of bin files.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_apbW4BHhLTg/SLqwNkkv5xI/AAAAAAAAAeM/RDZG47PsOyk/s1600-h/wiresharkbin.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_apbW4BHhLTg/SLqwNkkv5xI/AAAAAAAAAeM/RDZG47PsOyk/s400/wiresharkbin.png" alt="" id="BLOGGER_PHOTO_ID_5240694863601592082" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Select one of the lines that shows a bin file request, and right-click and hit Copy | Summary (text).  Then in a new browser window paste that into the address field.  Delete the parts before and after /d8/348345348.../points_0_0.bin.  Look back in Wireshark to discover what http address to use prior the that- it should be http://mslabs-nnn.vo.llnwd.net, but where nnn is any three digit number.  TBD- is there a way to cut and paste the fully formed url less manually?&lt;br /&gt;&lt;br /&gt;If done correctly hit return and make the browser load the file- a dialog will pop up, save it to disk.  If there were many points bin files increment the 0 in the file name and get them all.  If you have cygwin a bash script works well:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;for i in `seq 0 23`&lt;br /&gt;do&lt;br /&gt;wget http://someurl/points_0_$i.bin&lt;br /&gt;done&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Python&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Install python.  If you have cygwin installed the cygwin python with setup.exe, otherwise http://www.python.org/download/ and download the windows installer version.&lt;br /&gt;*** UPDATE ***  It appears the 2.5.2 windows python doesn't work correctly, which I'll look into- the best solution is to use Linux or Cygwin with the python that can be installed with Linux ***&lt;br /&gt;&lt;br /&gt;Currently the script &lt;a href="http://binarymillenium.googlecode.com/svn/trunk/processing/psynth/bin_to_csv.py"&gt;http://binarymillenium.googlecode.com/svn/trunk/processing/psynth/bin_to_csv.py&lt;/a&gt; works like this from the command line:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;python bin_to_csv.py somefile.bin &gt; output.csv&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;But I think the '&gt;' will only work with cygwin and not the windows command prompt.  I'll update the script to optionally take a second argument that is the output file.&lt;br /&gt;&lt;br /&gt;If there are multiple points bin files it's easy to do another bash loop to process them all in a row, otherwise manually do the command above and create n different csvs for n bin files, and then cut and paste the contents of each into one complete csv file.&lt;br /&gt;&lt;br /&gt;The output will be file with a long listing of numbers, each one looks like this:&lt;br /&gt;&lt;code&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;-4.17390823, -1.38746762, 0.832364499, 24, 21, 16&lt;br /&gt;-4.07660007, -1.83771312, 1.971277475, 17, 14, 9&lt;br /&gt;-4.13320493, -2.56310105, 2.301105737, 10, 6, 0&lt;br /&gt;-2.97198987, -1.44950056, 0.194522276, 15, 12, 8&lt;br /&gt;-2.96658635, -1.45545017, 0.181564241, 15, 13, 10&lt;br /&gt;-4.20609378, -2.08472299, 1.701148629, 25, 22, 18&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;The first three numbers are the xyz coordinates of a point, and the last three is the red, green, and blue components of the color.  In order to get a convention 0-255 number for each color channel red and blue would have to be multiplied by 8, and green by 4.  The python script could be easily changed to do that, or even convert the color channels to 0.0-1.0 floating point numbers.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Point Clouds - What Next?&lt;/b&gt;&lt;br /&gt;The processing files here can use the point clouds:&lt;br /&gt;&lt;a href="http://binarymillenium.googlecode.com/svn/trunk/processing/psynth/"&gt;http://binarymillenium.googlecode.com/svn/trunk/processing/psynth/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Also programs like &lt;a href="http://meshlab.sourceforge.net/"&gt;Meshlab&lt;/a&gt; can use them with some modification- I haven't experimented with it much but I'll look into that and make a post about it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-2926487370076967743?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/2926487370076967743/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=2926487370076967743' title='102 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/2926487370076967743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/2926487370076967743'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/08/photosynth-export-process-tutorial.html' title='Photosynth Export Process Tutorial'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_apbW4BHhLTg/SLqwNkkv5xI/AAAAAAAAAeM/RDZG47PsOyk/s72-c/wiresharkbin.png' height='72' width='72'/><thr:total>102</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-6965333409369769408</id><published>2008-08-28T20:59:00.001-07:00</published><updated>2008-08-29T07:13:16.101-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='photosynth'/><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>Color Correction</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_apbW4BHhLTg/SLd03jQMEEI/AAAAAAAAAdw/RYzOsU11ULA/s1600-h/sphinx3.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_apbW4BHhLTg/SLd03jQMEEI/AAAAAAAAAdw/RYzOsU11ULA/s400/sphinx3.jpg" alt="" id="BLOGGER_PHOTO_ID_5239785189173628994" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I have the colors figured out now: I was forgetting to byteswap the two color bytes, and after that the rgb elements line up nicely.  And it's 5:6:5 bits per color channel rather than 4 as I thought previously, thanks to Marvin &lt;a href="http://binarymillenium.blogspot.com/2008/08/exporting-point-clouds-from-photosynth.html"&gt;who commented below&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The sphinx above looks right, but earlier the boxer shown below looked so wrong I colored it falsely to make the video:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="400" height="225"&gt; &lt;param name="allowfullscreen" value="true" /&gt; &lt;param name="allowscriptaccess" value="always" /&gt; &lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=1619784&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" /&gt; &lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=1619784&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/1619784?pg=embed&amp;amp;sec=1619784"&gt;The Boxer - Photosynth Export&lt;/a&gt; from &lt;a href="http://vimeo.com/user168788?pg=embed&amp;amp;sec=1619784"&gt;binarymillenium&lt;/a&gt; on &lt;a href="http://vimeo.com?pg=embed&amp;amp;sec=1619784"&gt;Vimeo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;But I've fixed the boxer now:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_apbW4BHhLTg/SLeCUCeOX1I/AAAAAAAAAeA/w9z7O58tL30/s1600-h/boxer.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_apbW4BHhLTg/SLeCUCeOX1I/AAAAAAAAAeA/w9z7O58tL30/s400/boxer.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5239799972241497938" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://binarymillenium.googlecode.com/svn/trunk/processing/psynth/bin_to_csv.py"&gt;python script is updated&lt;/a&gt; with this code:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  bin.byteswap()&lt;br /&gt;  red =  (bin[0] &gt;&gt; 11) &amp; 0x1f&lt;br /&gt;  green = (bin[0] &gt;&gt; 5)  &amp; 0x3f&lt;br /&gt;  blue =  (bin[0] &gt;&gt; 0)  &amp; 0x1f&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-6965333409369769408?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/6965333409369769408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=6965333409369769408' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/6965333409369769408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/6965333409369769408'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/08/color-correction.html' title='Color Correction'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_apbW4BHhLTg/SLd03jQMEEI/AAAAAAAAAdw/RYzOsU11ULA/s72-c/sphinx3.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-4914368733492988100</id><published>2008-08-27T10:28:00.000-07:00</published><updated>2008-08-28T22:06:45.418-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='photosynth'/><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>Exporting Point Clouds From Photosynth</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_apbW4BHhLTg/SLWXYydOO2I/AAAAAAAAAdo/xcT0DtU3z_8/s1600-h/sphinx.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_apbW4BHhLTg/SLWXYydOO2I/AAAAAAAAAdo/xcT0DtU3z_8/s400/sphinx.png" alt="" id="BLOGGER_PHOTO_ID_5239260193632435042" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Since my last post about photosynth I've revisited the site and discovered that the pictures can be toggled off with the 'p' key, and the viewing experience is much improved given there is a good point cloud underneath.  But what use is a point cloud inside a browser window if it can't be exported to be manipulated into random videos that could look like all the lidar videos I've made, or turned into 3D meshes and used in Maya or any other program?&lt;br /&gt;&lt;br /&gt;&lt;a href="http://getsatisfaction.com/livelabs/topics/3d_export_in_various_formats"&gt;Supposedly export will be added in the future&lt;/a&gt;, but I'm impatient like one of the posters on that thread so I've gone forward and figured out my own export method without any deep hacking that might violate the terms of use.&lt;br /&gt;&lt;br /&gt;Using one of those programs to intercept 3D api calls might work, though maybe not with DirectX or however the photosynth browser window is working.  What I found with Wireshark is that http requests for a series of points_m_n.bin files are made.  The m is the group number, if the photosynth is 100% synthy then there will only be one group labeled 0.  The n splits up the point cloud into smaller files, for a small synth there could just be points_0_0.bin.&lt;br /&gt;&lt;br /&gt;Inside each bin file is raw binary data.  There is a variable length header which I have no idea how to interpret, sometimes it is 15 bytes long and sometimes hundreds or thousands of bytes long (though it seems to be shorter in smaller synths).&lt;br /&gt;&lt;br /&gt;But after the header there is a regular set of position and color values each 14 bytes long.  The first 3 sets of 4 bytes are the xyz position in floating point values.  In python I had to do a byteswap on those bytes (presumably from network order) to get them to be read in right with the readfile command.&lt;br /&gt;&lt;br /&gt;The last 2 bytes is the color of the point.  It's only 4-bits per color channel, which is strange.  The first four bits I don't know about, the last three sets of 4 bits are red, blue, and green.   Why not 8-bits per channel, does the photosynth process not produce that level of precision because it is only loosely matching the color of corresponding points in photos?  Anyway as the picture above shows I'm doing the color wrong- if I have a pure red or green synth it looks right, but maybe a different color model than standard rgb is at work.&lt;br /&gt;&lt;br /&gt;I tried making a photosynth of photos that were masked to be blue only- and zero synthiness resulted - is it ignoring blue because it doesn't want to synth up the sky in photos?&lt;br /&gt;&lt;br /&gt;Anyway &lt;a href="http://binarymillenium.googlecode.com/svn/trunk/processing/psynth/bin_to_csv.py"&gt;here is the python script for interpreting the bin files&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The sceneviewer (taken from the Radiohead sceneviewer) in that source dir works well for displaying them also.&lt;br /&gt;&lt;br /&gt;Anyway to repeat this for any synth wireshark needs to figure out where the bin files are served from (filter with http.request), and then they can be downloaded in firefox or with wget or curl, and then my script can be run on them, and processing can view them.  The TOC doesn't clearly specify how the point clouds are covered so redistribution of point clouds, especially those not  from your own synths or someone who didn't CC license it, may not be kosher.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-4914368733492988100?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/4914368733492988100/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=4914368733492988100' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/4914368733492988100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/4914368733492988100'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/08/exporting-point-clouds-from-photosynth.html' title='Exporting Point Clouds From Photosynth'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_apbW4BHhLTg/SLWXYydOO2I/AAAAAAAAAdo/xcT0DtU3z_8/s72-c/sphinx.png' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-1338670466562747134</id><published>2008-08-24T00:50:00.000-07:00</published><updated>2008-08-24T00:55:11.715-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>More python pcap with pcapy</title><content type='html'>After running into pcap files several hundreds of megabytes in size that caused wireshark to crash when loaded, I returned to trying to make python work with the source pcap file:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import pcapy&lt;br /&gt;&lt;br /&gt;vel = pcapy.open_offline('unit 46 sample capture velodyne area.pcap')&lt;br /&gt;&lt;br /&gt;vel&lt;br /&gt;Reader object at 0xb7e1b308&lt;br /&gt;&lt;br /&gt;pkt = vel.next&lt;br /&gt;&lt;br /&gt;pkt&lt;br /&gt;built-in method next of Reader object at 0xb7e1b308&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;What is a Reader object, and a built-in method of it?  Why are the addresses the same?&lt;br /&gt;&lt;br /&gt;try&lt;br /&gt;&lt;code&gt;&lt;br /&gt;pkt = vel.next()&lt;br /&gt;&lt;br /&gt;type(vel)&lt;br /&gt;type 'tuple'&lt;br /&gt;&lt;br /&gt;vel[1]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;'\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x08\x00E\x00\x04\xd2&lt;br /&gt;\x00\x01\x00\x00\x80\x11\xad\x9f\xc0\xa8\x03+\xc0\xa8\x03\xff\x01\xbb&lt;br /&gt;\t@\x04\xbe\x00\x00\xff\xddz\x13\xee&lt;br /&gt;...&lt;br /&gt;\x00\x00\x10\xd63Md\xc2\xff\x00\x00\x0fp\x07v25b'&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;So that's just the problem I was running into before: '\xff' is an ascii representation of binary data that's really 0xff.  But I'm given it in ascii- I can't index into this and get a specific 8-bit 0-255 binary value, I get a '\'.  Do I have to write something that goes through this and reinterpets the ascii-ized hex back into real hex?&lt;br /&gt;&lt;br /&gt;Also I note the ff dd that marks the beginning of the data frame is there but not at the beginning- so there are other parts of the packet here I need to get rid of.  Is this where I need Impacket?&lt;br /&gt;&lt;br /&gt;import impacket&lt;br /&gt;from impacket.ImpactDecoder import EthDecoder&lt;br /&gt;&lt;code&gt;&lt;br /&gt;decoder = EthDecoder()&lt;br /&gt;b = decoder.decode(a)&lt;br /&gt;Traceback (most recent call last):&lt;br /&gt;File "stdin", line 1, in ?&lt;br /&gt;File "/var/lib/python-support/python2.4/impacket/ImpactDecoder.py", line 38, in decode&lt;br /&gt;  e = ImpactPacket.Ethernet(aBuffer)&lt;br /&gt;File "/var/lib/python-support/python2.4/impacket/ImpactPacket.py", line 340, in __init__&lt;br /&gt;  self.load_header(aBuffer)&lt;br /&gt;File "/var/lib/python-support/python2.4/impacket/ImpactPacket.py", line 255, in load_header&lt;br /&gt;  self.set_bytes_from_string(aBuffer)&lt;br /&gt;File "/var/lib/python-support/python2.4/impacket/ImpactPacket.py", line 59, in set_bytes_from_string&lt;br /&gt;  self.__bytes = array.array('B', data)&lt;br /&gt;TypeError: an integer is required&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;oops&lt;br /&gt;&lt;code&gt;&lt;br /&gt;b = decoder.decode(a[1])&lt;br /&gt;print b&lt;br /&gt;Ether: 0:0:0:0:0:0 -&gt; ff:ff:ff:ff:ff:ff&lt;br /&gt;IP 192.168.3.43 -&gt; 192.168.3.255&lt;br /&gt;UDP 443 -&gt; 2368&lt;br /&gt;&lt;br /&gt;ffdd 7a13 ee09 3cbe 093f 1811 2b1f 1020    ..z.....?..+..&lt;br /&gt;0a0a 63ac 0848 d708 53ea 085b 0000 1bc0    ..c..H..S..[....&lt;br /&gt;0a35 0c09 425b 0936 000d 2e44 0d2f 120b    .5..B[.6...D./..&lt;br /&gt;4f5e 0b30 200f 3c4e 0e50 c30b 46c7 0b4d    O^.0 .&lt;br /&gt;&lt;n.p..f..m&gt;&lt;/n.p..f..m&gt;&lt;/code&gt;&lt;br /&gt;The decode makes a nice human readable text of the packet, but not what I want.&lt;br /&gt;&lt;br /&gt;Here is a different tack- by looking in the Impacket.py source I found how to do this which converts that annoying ascii back to real bytes, which is the only real issue:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;mybytes = array.array('B', vel[1])&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;mybytes is of size 1248, so there appear to be 42 extra bytes of unwanted ethernet wrapper there- why not just index into mbytes like mybytes[42:] and dump that to a binary file?&lt;br /&gt;&lt;br /&gt;I don't know about the dumping to binary file (print mybytes prints it in ascii, not binary)- but I could easily pass that array straight into the velodyne parsing code- and this skips the intermediate file step, saving time and precious room on my always nearly full laptop hd.&lt;br /&gt;&lt;br /&gt;So &lt;a href="http://code.google.com/p/binarymillenium/source/browse/trunk/processing/velodyne/pcap_to_csv.py?r=275"&gt;here is the final result&lt;/a&gt;, which produce good CSVs I was able to load with my 'velosphere' Processing project to create 360 degree panoramas from the lidar data:&lt;br /&gt;&lt;br /&gt;Next I need a way to write pngs from python, and I could eliminate the CSVs &amp;amp; Processing step.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-1338670466562747134?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://oss.coresecurity.com/projects/pcapy.html' title='More python pcap with pcapy'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/1338670466562747134/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=1338670466562747134' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/1338670466562747134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/1338670466562747134'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/08/more-python-pcap-with-pcapy.html' title='More python pcap with pcapy'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-5151743800763199732</id><published>2008-08-23T06:31:00.000-07:00</published><updated>2008-08-29T07:13:41.060-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photosynth'/><title type='text'>Photosynth</title><content type='html'>When I first saw the original demo I was really impressed, but now that is been released I feel like it hasn't advanced enough since that demo to really be useful.  I  tried a few random synths when the server was having problems, it looks like it isn't being hammered any longer so I ought to try it again soon when I'm using a compatible OS.&lt;br /&gt;&lt;br /&gt;Overall it's confused and muddled to use and look at- like a broken quicktime VR.&lt;br /&gt;&lt;br /&gt;Photosynth seems to work best in terms of interface and experience when it is simply a panoramic viewer of stitched together images- where all the images are taken from a point of buildings or scenery around the viewer.  It's easy to click left or right to rotate left or right and have the view intuitively change.  But we've had photostitching software that produces smooth panoramas that look better than this for years, so there's nothing to offer here.&lt;br /&gt;&lt;br /&gt;When viewing more complicated synths, the UI really breaks down.  I don't understand why when I click and drag the mouse the view rotates to where I'd like, but then it snaps back to where it used to be when I let go of the button.  It's very hard to move naturally through 3D space- I think the main problem is that the program is too photo-centric: it always wants to feature a single photograph prominently rather than a more synthetic view.  Why can't I pull back to view all the photos, or at least a jumble of outlines of all the photos?&lt;br /&gt;&lt;br /&gt;It seems like there is an interesting 3D point cloud of points found to be common to multiple photos underlying the synth but it can't be viewed on it's own (much less downloaded...), there are always photos obscuring it.  The photograph prominence is constantly causing nearby photos to become blurry or transparent in visually disruptive ways.&lt;br /&gt;&lt;br /&gt;Finally, it seems like the natural end-point of technology like this is to generate 3D textured models of a location, with viewing of the source photos as a feature but not the most prominent mode.  Can this be done with photosynth-like technology or is all the aspects I don't like a way of covering up that it can't actually do that?  Maybe it can produce 3D models but they all come out horribly distorted (so then provide a UI to manually undistort them).&lt;br /&gt;&lt;br /&gt;Hopefully they will improve on this, or another well-backed site will deliver fully on the promise shown here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-5151743800763199732?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://photosynth.net/Default.aspx' title='Photosynth'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/5151743800763199732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=5151743800763199732' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/5151743800763199732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/5151743800763199732'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/08/photosynth.html' title='Photosynth'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-3663293875333649372</id><published>2008-08-20T08:48:00.000-07:00</published><updated>2008-08-23T06:30:56.496-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='lidar'/><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>Makeavi</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_apbW4BHhLTg/SKw-ZV-jUWI/AAAAAAAAAdQ/5H3fUabAGTQ/s1600-h/prepross_height_10046.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_apbW4BHhLTg/SKw-ZV-jUWI/AAAAAAAAAdQ/5H3fUabAGTQ/s400/prepross_height_10046.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5236629071842201954" /&gt;&lt;/a&gt;&lt;br /&gt;Discovered a neat windows (and vista) tool for turning image sequences into videos: &lt;a href="http://makeavi.sourceforge.net/"&gt;http://makeavi.sourceforge.net/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1280x720 in the 'Microsoft Video 1' format worked well, though 57 MB of pngs turned into 135 MB of video.  'Uncompressed' didn't produce a video just a small 23kb file.  'Intel IYUV' sort of produced a video but not correctly.  'Cinepak' only output a single frame.  'VP60 Simple profile' and 'VP61 Advanced Profile' with the default settings worked, and actually produces video smaller than the source images, though quicktime player didn't like those files.  Vimeo seems to think VP61 is okay:&lt;br /&gt;&lt;br /&gt;&lt;object width="400" height="225"&gt; &lt;param name="allowfullscreen" value="true" /&gt; &lt;param name="allowscriptaccess" value="always" /&gt; &lt;param name="movie" value="http://www.vimeo.com/moogaloop.swf?clip_id=1570449&amp;amp;server=www.vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" /&gt; &lt;embed src="http://www.vimeo.com/moogaloop.swf?clip_id=1570449&amp;amp;server=www.vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://www.vimeo.com/1570449?pg=embed&amp;amp;sec=1570449"&gt;More Velodyne Lidar - overhead view&lt;/a&gt; from &lt;a href="http://www.vimeo.com/user168788?pg=embed&amp;amp;sec=1570449"&gt;binarymillenium&lt;/a&gt; on &lt;a href="http://vimeo.com?pg=embed&amp;amp;sec=1570449"&gt;Vimeo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This new video is similar to the &lt;a href="http://binarymillenium.blogspot.com/2008/08/animated-gif-of-height-map.html"&gt;animated gifs I was producing earlier&lt;/a&gt;, but using a new set of data.  Vimeo seems to be acting up this morning, I got 75% through an upload of the entire file (the above is just a subset) and it locked up.  I may try to produce a shorter test video to see if it works.&lt;br /&gt;&lt;br /&gt;I have around 10 gigs of lidar data from Velodyne, and of course no way to host it.&lt;br /&gt;&lt;br /&gt;My process for taking pcap files and exporting the raw data has run into a hitch- wireshark crashes when trying to 'follow udp stream' for pcap files larger than a couple hundred megabytes.  Maybe there is another tool that can do the conversion to raw?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-3663293875333649372?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/3663293875333649372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=3663293875333649372' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/3663293875333649372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/3663293875333649372'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/08/makeavi.html' title='Makeavi'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_apbW4BHhLTg/SKw-ZV-jUWI/AAAAAAAAAdQ/5H3fUabAGTQ/s72-c/prepross_height_10046.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-2470274168548862337</id><published>2008-08-14T21:42:00.000-07:00</published><updated>2008-08-23T06:30:39.380-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lidar'/><category scheme='http://www.blogger.com/atom/ns#' term='octave'/><title type='text'>Phase Correlation for Lidar Image Alignment</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_apbW4BHhLTg/SKUNaOA7lQI/AAAAAAAAAdI/ul8uPZqLcXU/s1600-h/phasecorr_norot.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_apbW4BHhLTg/SKUNaOA7lQI/AAAAAAAAAdI/ul8uPZqLcXU/s400/phasecorr_norot.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5234604885977830658" /&gt;&lt;/a&gt;&lt;br /&gt;After going through the manual alignment of the point cloud data noted in the last post, I've gotten the translation step of automatic alignment using &lt;a href="http://en.wikipedia.org/wiki/Phase_correlation"&gt;phase correlation&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Phase correlation requires the use of a 2d fft, which I couldn't find in Processing (would have to bring in a java lib for that somehow?).  Instead I used Octave, which has the fft2, inverse ifft2 function, and many other convenient math functions.  The Matlab/Octave file is &lt;a href="http://code.google.com/p/binarymillenium/source/browse/trunk/processing/velodyne/phasecorr.m"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The fundamental phase correlation code is this:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;a = imread('one.png')&lt;br /&gt;b = imread('two.png')&lt;br /&gt;&lt;br /&gt;af = fft2(a);&lt;br /&gt;bf = fft2(b);&lt;br /&gt;&lt;br /&gt;% cross power&lt;br /&gt;cp = af.*conj(bf) ./ abs(af.*conj(bf));&lt;br /&gt;&lt;br /&gt;icp = (ifft2(cp));&lt;br /&gt;&lt;br /&gt;mmax = max(max(icp));&lt;br /&gt;[sx,sy,v] = find(mmax == icp);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;And sx and sy are the translation to apply to b to make it line up with image a.  An additional check is to make sure the largest value in icp is above some threshold- if it is lower than the threshold then there is no good translation to align the data.&lt;br /&gt;&lt;br /&gt;I'm a little suspicious that my input pngs are too regular and easy, every frame seems a constant displacement from the former as the vehicle with the lidar was moving at a constant velocity.&lt;br /&gt;&lt;br /&gt;Rotation is mostly working in isolation but I need to revisit the proper method to make simultaneous rotation and translation work- there was a paper somewhere I need to dig up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-2470274168548862337?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/2470274168548862337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=2470274168548862337' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/2470274168548862337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/2470274168548862337'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/08/phase-correlation-for-lidar-image.html' title='Phase Correlation for Lidar Image Alignment'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_apbW4BHhLTg/SKUNaOA7lQI/AAAAAAAAAdI/ul8uPZqLcXU/s72-c/phasecorr_norot.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-2042472916282380940</id><published>2008-08-11T08:37:00.001-07:00</published><updated>2008-08-23T23:18:03.287-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lidar'/><category scheme='http://www.blogger.com/atom/ns#' term='gimp'/><title type='text'>Point Cloud Alignment</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_apbW4BHhLTg/SKBc5u5oXlI/AAAAAAAAAco/xccc_hOzhNg/s1600-h/manual_subset.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_apbW4BHhLTg/SKBc5u5oXlI/AAAAAAAAAco/xccc_hOzhNg/s400/manual_subset.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5233284913916567122" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I took about 1/5th of the &lt;a href="http://binarymillenium.blogspot.com/2008/08/animated-gif-of-height-map.html"&gt;png images&lt;/a&gt; generated from the Velodyne point cloud data and manually aligned them in Gimp.  It's easy to shift-select a bunch of images and open them as individual layers in Gimp, but there are no multiple layer selection capabilities: it's not possible for instance select all the layers and change their transparency.&lt;br /&gt;&lt;br /&gt;In all of the images there are a few features, mostly beyond the edges of the road, that can be aligned with the earlier and later images.  The closer together the images are in time the easier this is, but I was skipping every 4 images to take the 5th in order to speed up the process- also a gimp image with 300 layers is difficult to handle.&lt;br /&gt;&lt;br /&gt;The later portions of the data are all purely translational, only at the very beginning are rotations and translations needed. &lt;br /&gt;&lt;br /&gt;I think an automatic process for alignment won't be that hard, but the inherent inconsistency in frame to frame image will make for a lot of error.  Translations correspond to phase shifts in the frequency domain, and I think rotations are almost as simple- and there isn't any scaling to account for.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-2042472916282380940?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/2042472916282380940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=2042472916282380940' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/2042472916282380940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/2042472916282380940'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/08/point-cloud-alignment.html' title='Point Cloud Alignment'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_apbW4BHhLTg/SKBc5u5oXlI/AAAAAAAAAco/xccc_hOzhNg/s72-c/manual_subset.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-861553740615814407</id><published>2008-08-07T06:21:00.000-07:00</published><updated>2008-08-07T06:30:59.680-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dorkbot'/><title type='text'>Dorkbot Cacophony</title><content type='html'>&lt;embed type="application/x-shockwave-flash" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" width="400" height="267" flashvars="host=picasaweb.google.com&amp;RGB=0x000000&amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2Fbinarymillenium%2Falbumid%2F5231648323955027825%3Fkind%3Dphoto%26alt%3Drss" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://music.columbia.edu/pipermail/dorkbotsea-announce/2008-August/000159.html"&gt;&lt;blockquote&gt;The theme is catastrophic cacophony and the challenge is to build the loudest, craziest, flashiest automated "musical" instrument ever.  You will have to be able to step back and let your creation play by itself, even if it destroys itself in the process.&lt;/blockquote&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This event was a lot of fun, I helped build a sort of guitar that gets strummed by a motor.  With a little more time I think we could have made it less repetitive by add another motor to move the first one back and forth or up and down.&lt;br /&gt;&lt;br /&gt;Other teams had things that sounded like higher frequency wind-chimes, or just pure noise.&lt;br /&gt;&lt;br /&gt;&lt;object width="400" height="302"&gt; &lt;param name="allowfullscreen" value="true" /&gt; &lt;param name="allowscriptaccess" value="always" /&gt; &lt;param name="movie" value="http://www.vimeo.com/moogaloop.swf?clip_id=1484549&amp;amp;server=www.vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" /&gt; &lt;embed src="http://www.vimeo.com/moogaloop.swf?clip_id=1484549&amp;amp;server=www.vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="302"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://www.vimeo.com/1484549?pg=embed&amp;amp;sec=1484549"&gt;Dorkbot Cacophony&lt;/a&gt; from &lt;a href="http://www.vimeo.com/user168788?pg=embed&amp;amp;sec=1484549"&gt;binarymillenium&lt;/a&gt; on &lt;a href="http://vimeo.com?pg=embed&amp;amp;sec=1484549"&gt;Vimeo&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-861553740615814407?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/861553740615814407/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=861553740615814407' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/861553740615814407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/861553740615814407'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/08/dorkbot-cacophony.html' title='Dorkbot Cacophony'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-4181643874652109203</id><published>2008-08-03T17:23:00.000-07:00</published><updated>2008-08-11T20:21:17.039-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lidar'/><category scheme='http://www.blogger.com/atom/ns#' term='velodyne'/><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>Animated gif of height map</title><content type='html'>&lt;img src="http://binarymillenium.googlecode.com/svn/trunk/processing/velodyne/frames/velodyne_hgt.gif"&gt;animated gif of height map&lt;/img&gt;&lt;br /&gt;&lt;br /&gt;Source code is here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/binarymillenium/source/browse/#svn/trunk/processing/velodyne"&gt;http://code.google.com/p/binarymillenium/source/browse/#svn/trunk/processing/velodyne&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;One interesting thing I discovered is that animated gifs with an alpha channel don't just let the back ground of the web page show through, they also don't clear the last frame of the gif- which was confusing for this gif before I blackened the background with ImageMagick:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;for i in *png; do convert $i -background black -flatten +matte flat_$i; done&lt;br /&gt;convert flat*png velodyne_hgt.gif&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-4181643874652109203?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/4181643874652109203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=4181643874652109203' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/4181643874652109203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/4181643874652109203'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/08/animated-gif-of-height-map.html' title='Animated gif of height map'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-1188987543066458275</id><published>2008-08-03T16:39:00.000-07:00</published><updated>2008-08-23T23:16:03.602-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lidar'/><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>Velodyne Lidar Sample Data</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Applying the db.xml calibration file&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As with the pcap parsing, I originally thought I'd look into Python xml parsing.  I'm sure if I was really interested in parsing xml I would have tried some of them out, but the interface I was hoping to find would look like this&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import pyxmlthing&lt;br /&gt;a = pyxmlthing.load("some.xml")&lt;br /&gt; some_array= a.item('9').rotCorrection&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;And I would have an array of all the rotCorrections of all the items of type 9.  Instead I found a several xml parsers that required tons of code to get to a point where I'm still not sure if I could get at the rotCorrections or not.  Which may be why I don't care for xml, flat-files are it.&lt;br /&gt;&lt;br /&gt;So I just used vim to strip all the xml out and leave me with a nice text file that looks like &lt;a href="http://binarymillenium.googlecode.com/svn/trunk/processing/velodyne/db.csv"&gt;this&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;0,     -3.8,     -7.0046468,     20,     21.560343,     -2.5999999&lt;br /&gt;    1,     -1.5,     -6.7674689,     26,     21.516994,     2.5999999&lt;br /&gt;    2,     5,     0.44408101,     28,     20.617426,     -2.5999999&lt;br /&gt;    3,     6.8000002,     0.78093398,     32,     20.574717,     2.5999999&lt;br /&gt;    &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Where the first column is the laser index (0-63), the next might be the rotCorrection and so on.  &lt;br /&gt;&lt;br /&gt;To apply the calibration data, it's very important that the indexing derived from the raw data is correct- reading the 0xDDEE vs. the 0xDDFF (or similar) that designates upper or lower laser block is important.&lt;br /&gt;&lt;br /&gt;The velodyne manual doesn't have a good diagram that shows the xyz axes and what is positive or negative direction for both the original lidar angle and the correction angles and offsets, so some experimentation is necessary there.  The manual did mention it in this case the rotCorrection had to be subtracted from the base rotation angle.  The vertical and horizontal offset are pretty minor for my visualization but important for accurate measurements obviously.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Processing viewer&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Using &lt;a href="http://www.aaronkoblin.com/"&gt;Aaron Koblin's&lt;/a&gt; &lt;a href="http://radiohead.googlecode.com/files/HoC_DataApplications_v1.0.zip"&gt;House of Cards SceneViewer&lt;/a&gt; as a starting point, I wrote code to take the point cloud data and display it:&lt;br /&gt;&lt;br /&gt;&lt;object width="400" height="225"&gt; &lt;param name="allowfullscreen" value="true" /&gt; &lt;param name="allowscriptaccess" value="always" /&gt; &lt;param name="movie" value="http://www.vimeo.com/moogaloop.swf?clip_id=1451349&amp;amp;server=www.vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" /&gt; &lt;embed src="http://www.vimeo.com/moogaloop.swf?clip_id=1451349&amp;amp;server=www.vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://www.vimeo.com/1451349?pg=embed&amp;sec=1451349"&gt;Monterey Full&lt;/a&gt; from &lt;a href="http://www.vimeo.com/user168788?pg=embed&amp;sec=1451349"&gt;binarymillenium&lt;/a&gt; on &lt;a href="http://vimeo.com?pg=embed&amp;sec=1451349"&gt;Vimeo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The data was split into files each containing a million data points and spanning a second in time.  With some testing I found the lidar was spinning at about 10 Hz (of the possible 5, 10, or 15 Hz), so I would bite off 1/10 of the file and display that in the current frame, then the next 1/10th for the next frame, and then load the next file after 10 frames.  A more consistent approach would be to split the data into a new text file for each frame.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Next Steps&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Right now I'm running a large job to process each point-cloud frame into png height-map files as I did for the Radiohead data.  It doesn't work as well with the 360 degrees of heights- some distances just have to be cut off and ignored to keep the resolutions low (although with the png compression having large empty spaces doesn't really take up any additional room).  A lot of detail is lost on the nearby objects compared to a lot of empty space between distant objects.&lt;br /&gt;&lt;br /&gt;So either using that data or going back to processing the raw point cloud, I'd like to track features frame-to-frame and derive the vehicle motion from them.  I suspect this will be very difficult.  Once I have the vehicle motion, I could create per-frame transformations that could create one massive point cloud or height map where still objects are in their proper places and other vehicles probably become blurs.   &lt;br /&gt;&lt;br /&gt;After that, if I can get a dataset from Velodyne or another source where a moving ground lidar moves in a circle or otherwise intersects its own path somewhere, then the proof that the algorithm works will be if in that big point cloud that point of intersection actually lines up.  (though I suspect again that more advanced logic is need to re-align the data after the logic determines that it has encounter features that it has scene before).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-1188987543066458275?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/1188987543066458275/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=1188987543066458275' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/1188987543066458275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/1188987543066458275'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/07/velodyne-lidar-sample-data.html' title='Velodyne Lidar Sample Data'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-7874226367210251158</id><published>2008-07-30T20:22:00.000-07:00</published><updated>2008-08-23T23:16:23.541-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lidar'/><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>Velodyne Lidar- Monterey Data</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_apbW4BHhLTg/SJEw3cAVmZI/AAAAAAAAAXE/8jWC3b02FDs/s1600-h/monterey2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_apbW4BHhLTg/SJEw3cAVmZI/AAAAAAAAAXE/8jWC3b02FDs/s400/monterey2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5229014371322403218" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_apbW4BHhLTg/SJEwtX1KDcI/AAAAAAAAAW8/4l6W5_nPxyA/s1600-h/monterey.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_apbW4BHhLTg/SJEwtX1KDcI/AAAAAAAAAW8/4l6W5_nPxyA/s400/monterey.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5229014198403075522" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There's something wrong with how I'm viewing the data, the streaks indicate every revolution of the lidar results in an angular drift- maybe I'm re-adding a rotational offset and allowing it to accumulate?&lt;br /&gt;&lt;br /&gt;No, it turned out to be a combination of things- applying the wrong calibration data (essentially flopping the lower and upper laser blocks).  Now it's starting to look pretty good, though there is a lot of blurriness because the environment is changing over time- that's a car pulling out into an intersection.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_apbW4BHhLTg/SJFOdZLPwkI/AAAAAAAAAXM/ROJzpQL9Wq8/s1600-h/monterey_good.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_apbW4BHhLTg/SJFOdZLPwkI/AAAAAAAAAXM/ROJzpQL9Wq8/s400/monterey_good.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5229046909235085890" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="400" height="225"&gt; &lt;param name="allowfullscreen" value="true" /&gt; &lt;param name="allowscriptaccess" value="always" /&gt; &lt;param name="movie" value="http://www.vimeo.com/moogaloop.swf?clip_id=1442762&amp;amp;server=www.vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" /&gt; &lt;embed src="http://www.vimeo.com/moogaloop.swf?clip_id=1442762&amp;amp;server=www.vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://www.vimeo.com/1442762?pg=embed&amp;sec=1442762"&gt;Velodyne Lidar - Monterey&lt;/a&gt; from &lt;a href="http://www.vimeo.com/user168788?pg=embed&amp;sec=1442762"&gt;binarymillenium&lt;/a&gt; on &lt;a href="http://vimeo.com?pg=embed&amp;sec=1442762"&gt;Vimeo&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-7874226367210251158?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/7874226367210251158/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=7874226367210251158' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/7874226367210251158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/7874226367210251158'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/07/velodyne-lidar-monterey-data.html' title='Velodyne Lidar- Monterey Data'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_apbW4BHhLTg/SJEw3cAVmZI/AAAAAAAAAXE/8jWC3b02FDs/s72-c/monterey2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-8544044170283321788</id><published>2008-07-29T22:00:00.000-07:00</published><updated>2009-06-23T08:30:11.522-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lidar'/><category scheme='http://www.blogger.com/atom/ns#' term='velodyne'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>Velodyne Lidar Sample Data:  Getting a .pcap into Python</title><content type='html'>Velodyne has provided me with this &lt;a href="http://binarymillenium.googlecode.com/files/velodyne.zip"&gt;sample data&lt;/a&gt; from their &lt;a href="http://velodyne.com/lidar/"&gt;HDL-64E lidar&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Instead of data exported from their viewer software, it's a pcap captured with Wireshark or a another network capture tool that uses the standard pcap format.  &lt;br /&gt;&lt;br /&gt;Initially I was trying to extract the lidar packets with libpcap and python, using pcapy or similar, and went through a lot of trouble getting the pcap library to build in the cygwin environment.  Python and libpcap were able to load the data from the pcap, but rendered the binary into a long string with escape codes like '\xff'.&lt;br /&gt;&lt;br /&gt;I then discovered that Wireshark has a function called 'follow udp stream'- right-click on the data part of a packet in Wireshark and then export as 'raw'.  The exported data doesn't preserve division between packets any longer, but since each is of a consistent length (1206 bytes) it's easy to parse.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_apbW4BHhLTg/SkD04P1D5LI/AAAAAAAABsI/Q2ISw0438Zo/s1600-h/wireshark.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 359px;" src="http://2.bp.blogspot.com/_apbW4BHhLTg/SkD04P1D5LI/AAAAAAAABsI/Q2ISw0438Zo/s400/wireshark.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5350545604475086002" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_apbW4BHhLTg/SkD0Nx_OQKI/AAAAAAAABsA/bGvM4Bbr2kQ/s1600-h/Follow+UDP+Stream+6232009+82533+AM.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 277px;" src="http://4.bp.blogspot.com/_apbW4BHhLTg/SkD0Nx_OQKI/AAAAAAAABsA/bGvM4Bbr2kQ/s400/Follow+UDP+Stream+6232009+82533+AM.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5350544874910138530" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Python does work well for loading binary data from file:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import array&lt;br /&gt;&lt;br /&gt;f = open('data.raw')  # the data exported from wireshark in the raw format&lt;br /&gt;&lt;br /&gt;bin = array.array('B') # setup an array of typecode unsigned byte&lt;br /&gt;&lt;br /&gt;bin.fromfile(f, 1206) # each packet has 1206 bytes of data&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The contents of bin now have 1206 bytes of data that looks like this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt;&gt;&gt; bin&lt;br /&gt;array('B', [255, 221, 33, 39, 5, 9, 67, 178, 8, 116, 160, 13, 126, 222, 13, 63, 217, 8, 162, 204, ...&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The 'B' element doesn't prevent indexing into the real data with bin[0] and getting 255 and so on.&lt;br /&gt;&lt;br /&gt;The first two bytes indicate whether the data is from the upper or lower array, and the 33 39 is interpreted to mean that the reading was taken when the sensor head was rotated to (39*255+33)/100 or 99.78 degrees.&lt;br /&gt;&lt;br /&gt;For 32 times after those first two bytes there are pairs of distance bytes followed by single intensity bytes, and then it starts over for a total of 12 times... and there are 6 more bytes with information that is unnecessary now.  See &lt;a href="http://binarymillenium.googlecode.com/svn/trunk/processing/velodyne/raw_to_csv.py"&gt;here &lt;/a&gt; for what I currently have for parsing the raw file, later I will get into add the  per laser calibration data.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-8544044170283321788?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/8544044170283321788/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=8544044170283321788' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/8544044170283321788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/8544044170283321788'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/07/velodyne-lidar-sample-data-getting-pcap.html' title='Velodyne Lidar Sample Data:  Getting a .pcap into Python'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_apbW4BHhLTg/SkD04P1D5LI/AAAAAAAABsI/Q2ISw0438Zo/s72-c/wireshark.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-1128033563917719131</id><published>2008-07-26T07:03:00.000-07:00</published><updated>2008-08-23T23:17:00.068-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lidar'/><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>More HoC: Preprocessing into pngs</title><content type='html'>&lt;img src="http://binarymillenium.googlecode.com/svn/trunk/processing/hoc/data_processed/hoc_hgt.gif"&gt;house of cards height&lt;/img&gt;&lt;br /&gt;&lt;img src="http://binarymillenium.googlecode.com/svn/trunk/processing/hoc/data_processed/hoc_intensity.gif"&gt;house of cards intensity&lt;/img&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-1128033563917719131?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://code.google.com/p/binarymillenium/wiki/HouseOfCards' title='More HoC: Preprocessing into pngs'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/1128033563917719131/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=1128033563917719131' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/1128033563917719131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/1128033563917719131'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/07/more-hoc-preprocessing-into-pngs.html' title='More HoC: Preprocessing into pngs'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-433469474084582987</id><published>2008-07-21T07:46:00.000-07:00</published><updated>2008-08-23T23:17:19.694-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lidar'/><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>Radiohead - House of Cards 2</title><content type='html'>&lt;object width="400" height="267"&gt; &lt;param name="allowfullscreen" value="true" /&gt; &lt;param name="allowscriptaccess" value="always" /&gt; &lt;param name="movie" value="http://www.vimeo.com/moogaloop.swf?clip_id=1380431&amp;amp;server=www.vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" /&gt; &lt;embed src="http://www.vimeo.com/moogaloop.swf?clip_id=1380431&amp;amp;server=www.vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="267"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://www.vimeo.com/1380431?pg=embed&amp;sec=1380431"&gt;Radiohead - House of Cards&lt;/a&gt; from &lt;a href="http://www.vimeo.com/user168788?pg=embed&amp;sec=1380431"&gt;binarymillenium&lt;/a&gt; on &lt;a href="http://vimeo.com?pg=embed&amp;sec=1380431"&gt;Vimeo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This rendered slowly, less than 1 fps.  One possible speedup would be to pre-process the csv data into binary heightmap files, rather than loading and processing each frame.&lt;br /&gt;&lt;br /&gt;Processing code is here:&lt;br /&gt;http://code.google.com/p/binarymillenium/source/browse/trunk/processing/hoc/hoc.pde&lt;br /&gt;&lt;br /&gt;It would be nice if they uploaded the data from the woman singing, and the party scene.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-433469474084582987?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://code.google.com/p/radiohead/downloads/list' title='Radiohead - House of Cards 2'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/433469474084582987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=433469474084582987' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/433469474084582987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/433469474084582987'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/07/radiohead-house-of-cards-2.html' title='Radiohead - House of Cards 2'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-3785598194698376433</id><published>2008-07-15T22:20:00.000-07:00</published><updated>2008-08-23T23:17:45.071-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lidar'/><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>Radiohead - House of Cards</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_apbW4BHhLTg/SH2KkaK8_PI/AAAAAAAAAQw/Rw80AYFbwdQ/s1600-h/houseofcards.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_apbW4BHhLTg/SH2KkaK8_PI/AAAAAAAAAQw/Rw80AYFbwdQ/s400/houseofcards.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5223483500924828914" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've been playing with the data for a couple of hours in Processing.  The main problem is that the points are not consistent across animation frames, so it is necessary to produce a new set of points in a regular grid that then can be tessellated easily.  By the end of the week I ought to have a video up in the official group on youtube and in higher quality on vimeo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-3785598194698376433?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://code.google.com/creative/radiohead/' title='Radiohead - House of Cards'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/3785598194698376433/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=3785598194698376433' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/3785598194698376433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/3785598194698376433'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/07/house-of-cards.html' title='Radiohead - House of Cards'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_apbW4BHhLTg/SH2KkaK8_PI/AAAAAAAAAQw/Rw80AYFbwdQ/s72-c/houseofcards.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-3553890822418376592</id><published>2008-06-23T21:48:00.000-07:00</published><updated>2008-07-26T06:58:53.687-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>openprocessing</title><content type='html'>This site is good for showcasing Processing projects, but is really rough around the corners- it lacks almost every feature of sites for sharing photos or art or anything except for leaving comments, and tagging.  The 'viewed nn times' increments when the page is reloaded, which is like a hit counter straight out of 1997.  There's no real good way for good graphs to float to the top and be seen more except for an unknown process by which editors select certain submissions for exhibition.  There are a lot of applets that don't work but aren't hidden or demoted from view.&lt;br /&gt;&lt;br /&gt;It's not like there are no other options for hosting java applets for free- google code works pretty good, and by putting google analytics javascript into the html page it's easy to track the traffic to the page.&lt;br /&gt;&lt;br /&gt;But there do seem to be a number of people that visit the site and look at my submissions, but I think I have more unique views from using the exhibition rollup on the official &lt;a href="http://processing.org/exhibition/index.html"&gt;processing.org site&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-3553890822418376592?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://openprocessing.org/' title='openprocessing'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/3553890822418376592/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=3553890822418376592' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/3553890822418376592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/3553890822418376592'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/06/openprocessing.html' title='openprocessing'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-5714838570730494796</id><published>2008-06-14T07:25:00.000-07:00</published><updated>2008-07-26T06:59:14.962-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>thingamajiggr, and 2 new Processing effects</title><content type='html'>I'm beginning to incorporate more processing effects into my sets, so I developed two for thingamajiggr.  They are less friendly to live alteration than gephex graphs, but if the bulk of the effect is done it's easy to live-code simple keyboard controls or change parameters.  &lt;br /&gt;&lt;br /&gt;I need a way to get video or screen captures into Processing, on Linux this is not easy- if it doesn't already exist I'm thinking of sending image data from gephex to Processing through an internal loopback path.&lt;br /&gt;&lt;br /&gt;Audio input used to work for me but now it doesn't.&lt;br /&gt;&lt;br /&gt;First effect: multicolored perlin lines.  When shown live the colors dovetailed with led lighting of an artwork in the main theater room:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://binarymillenium.googlecode.com/svn/trunk/processing/particleflow/svnapplet/index.html"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_apbW4BHhLTg/SFPYUJCzp1I/AAAAAAAAAPk/AKbFHbA7Y8E/s400/Screenshot-14.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5211747034334472018" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(click on the image to see the java applet)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_apbW4BHhLTg/SFPcdIK0ksI/AAAAAAAAAP0/daesZ5S4Mw4/s1600-h/IMG_0240.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_apbW4BHhLTg/SFPcdIK0ksI/AAAAAAAAAP0/daesZ5S4Mw4/s400/IMG_0240.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5211751586764985026" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The second effect is a standard gas/fluid simulation that uses springs.  I spent a lot of time trying to get more complicated flow fields working, but I ended up moderately simple:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://binarymillenium.googlecode.com/svn/trunk/processing/springfield_simple/svnapplet/index.html"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_apbW4BHhLTg/SFPax7pqdJI/AAAAAAAAAPs/cKEXQ9Z64SE/s400/springfield_simple.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5211749745158681746" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(click on the picture to see and play with the java applet)&lt;br /&gt;&lt;br /&gt;Things that went wrong or I need to fix:&lt;br /&gt;&lt;br /&gt;Holding my laptop on my lap is not very ideal when my laptop has an rgb output without locking screw holes.  The connector fell out a few times.  The other lesson is to always have good surface so the laptop can be left still.&lt;br /&gt;&lt;br /&gt;Not being able to eliminate window manager titles and borders around processing output.  I should find a more minimalist window manager.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-5714838570730494796?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://thingamajiggr.com/' title='thingamajiggr, and 2 new Processing effects'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/5714838570730494796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=5714838570730494796' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/5714838570730494796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/5714838570730494796'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/06/thingamajiggr-and-2-new-processing.html' title='thingamajiggr, and 2 new Processing effects'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_apbW4BHhLTg/SFPYUJCzp1I/AAAAAAAAAPk/AKbFHbA7Y8E/s72-c/Screenshot-14.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-2782774622853194777</id><published>2008-06-08T15:55:00.000-07:00</published><updated>2008-07-26T07:00:27.560-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>Optical Flow in Processing</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_apbW4BHhLTg/SExnMOzzTDI/AAAAAAAAAPM/INx525BT-K0/s1600-h/opticalflow.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_apbW4BHhLTg/SExnMOzzTDI/AAAAAAAAAPM/INx525BT-K0/s400/opticalflow.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5209652328792280114" /&gt;&lt;/a&gt;&lt;br /&gt;The standard Lucas-Kanade method as described in the wiki page entry on it &lt;a href="http://en.wikipedia.org/wiki/Lucas%E2%80%93Kanade_method"&gt;here&lt;/a&gt;.  One key thing not mentioned there (at least until I edit the page) is to use the Sobel operator to get partial derivatives in the x and y direction.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://binarymillenium.googlecode.com/svn/trunk/processing/opticalflow/svnapplet/index.html"&gt;link to applet&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Glancing at the OpenCV implementation I notice there is a check for certain kinds of matrices that aren't invertible by the primary method, I may need to be doing that for more robust operation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-2782774622853194777?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://binarymillenium.googlecode.com/svn/trunk/processing/opticalflow/svnapplet/index.html' title='Optical Flow in Processing'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/2782774622853194777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=2782774622853194777' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/2782774622853194777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/2782774622853194777'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/06/optical-flow-in-processing.html' title='Optical Flow in Processing'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_apbW4BHhLTg/SExnMOzzTDI/AAAAAAAAAPM/INx525BT-K0/s72-c/opticalflow.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-3195124879351204214</id><published>2008-06-01T16:56:00.000-07:00</published><updated>2008-06-08T15:48:57.316-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><title type='text'>Hosting java with google code</title><content type='html'>I used the export function of Processing to create a jar of an a-star search/a* search demonstration, and added the files into my google code subversion repository.  Then it's necessary to set the proper mime-types:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;svn propset svn:mime-type application/java-archive astar.jar&lt;br /&gt;svn propset svn:mime-type text/html index.html &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Here's an example:&lt;br /&gt;&lt;a href="http://binarymillenium.googlecode.com/svn/trunk/processing/astar/svnapplet/index.html"&gt; astar &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I don't think I can embed the jar directly here, I get this error:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;load: class astar.class not found.&lt;br /&gt;java.lang.ClassNotFoundException: astar.class&lt;br /&gt; at sun.applet.AppletClassLoader.findClass(AppletClassLoader.java:168)&lt;br /&gt; at java.lang.ClassLoader.loadClass(ClassLoader.java:306)&lt;br /&gt; at sun.applet.AppletClassLoader.loadClass(AppletClassLoader.java:119)&lt;br /&gt; at java.lang.ClassLoader.loadClass(ClassLoader.java:251)&lt;br /&gt; at sun.applet.AppletClassLoader.loadCode(AppletClassLoader.java:599)&lt;br /&gt; at sun.applet.AppletPanel.createApplet(AppletPanel.java:721)&lt;br /&gt; at sun.plugin.AppletViewer.createApplet(AppletViewer.java:1781)&lt;br /&gt; at sun.applet.AppletPanel.runLoader(AppletPanel.java:650)&lt;br /&gt; at sun.applet.AppletPanel.run(AppletPanel.java:324)&lt;br /&gt; at java.lang.Thread.run(Thread.java:595)&lt;br /&gt;Caused by: java.io.IOException: open HTTP connection failed.&lt;br /&gt; at sun.applet.AppletClassLoader.getBytes(AppletClassLoader.java:271)&lt;br /&gt; at sun.applet.AppletClassLoader.access$100(AppletClassLoader.java:44)&lt;br /&gt; at sun.applet.AppletClassLoader$1.run(AppletClassLoader.java:158)&lt;br /&gt; at java.security.AccessController.doPrivileged(Native Method)&lt;br /&gt; at sun.applet.AppletClassLoader.findClass(AppletClassLoader.java:155)&lt;br /&gt; ... 9 more&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;It seems like certain colormodes don't work when exporting from processing (135)- use the integer 0-255 colormode.&lt;br /&gt;&lt;br /&gt;For a jnlp (like created with the gwt kit):&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-3195124879351204214?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/3195124879351204214/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=3195124879351204214' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/3195124879351204214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/3195124879351204214'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/06/hosting-java-with-google-code.html' title='Hosting java with google code'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-6256621807573668669</id><published>2008-05-29T21:56:00.000-07:00</published><updated>2008-06-02T07:50:22.015-07:00</updated><title type='text'>K-means clustering, hough transform</title><content type='html'>The hough transform is typically used to search for lines in images, though can be generalized to other forms, and for example is used to find the edge of roads for mobile robotics applications.&lt;br /&gt;&lt;br /&gt;I'm not sure if I implemented it quite correctly- what for example should a solid white input image look like?  In any case it can make some pretty but somewhat bland curvy colored lines, below the picture on the right is the source and the left is the hough transform:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_apbW4BHhLTg/SD-Mazvm_ZI/AAAAAAAAAPE/O7xdPpttYUM/s1600-h/example.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_apbW4BHhLTg/SD-Mazvm_ZI/AAAAAAAAAPE/O7xdPpttYUM/s400/example.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5206034086457965970" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/binarymillenium/wiki/HoughTransform"&gt;description and link to processing pde file&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The k-means clustering algorithm is very simple but very interesting in it's results- an image is split into clusters and then the clusters take on the average color of the source pixels, and the cluster centers are updated in each step until convergence.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_apbW4BHhLTg/SD-L2Dvm_YI/AAAAAAAAAO8/m6agcI3ApKo/s1600-h/kmeans.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_apbW4BHhLTg/SD-L2Dvm_YI/AAAAAAAAAO8/m6agcI3ApKo/s400/kmeans.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5206033455097773442" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;object width="400" height="300"&gt; &lt;param name="allowfullscreen" value="true" /&gt; &lt;param name="allowscriptaccess" value="always" /&gt; &lt;param name="movie" value="http://www.vimeo.com/moogaloop.swf?clip_id=1059913&amp;amp;server=www.vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" /&gt; &lt;embed src="http://www.vimeo.com/moogaloop.swf?clip_id=1059913&amp;amp;server=www.vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://www.vimeo.com/1059913?pg=embed&amp;sec=1059913"&gt;K-Means Clustering Frei0r&lt;/a&gt; from &lt;a href="http://www.vimeo.com/user168788?pg=embed&amp;sec=1059913"&gt;binarymillenium&lt;/a&gt; on &lt;a href="http://vimeo.com?pg=embed&amp;sec=1059913"&gt;Vimeo&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-6256621807573668669?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://code.google.com/p/binarymillenium/wiki/KMeansCluster' title='K-means clustering, hough transform'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/6256621807573668669/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=6256621807573668669' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/6256621807573668669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/6256621807573668669'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/05/k-means-clustering-hough-transform.html' title='K-means clustering, hough transform'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_apbW4BHhLTg/SD-Mazvm_ZI/AAAAAAAAAPE/O7xdPpttYUM/s72-c/example.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-3256177236065735190</id><published>2008-05-29T21:27:00.000-07:00</published><updated>2008-05-29T21:44:23.847-07:00</updated><title type='text'>thingamajiggr</title><content type='html'>Hopefully this will go as well as the &lt;a href="http://binarymillenium.blogspot.com/2007/12/dorkbot-show.html"&gt;Dorkbot show from December&lt;/a&gt;- I have some new effects now and ought to get some more done in time for it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-3256177236065735190?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://thingamajiggr.com/' title='thingamajiggr'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/3256177236065735190/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=3256177236065735190' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/3256177236065735190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/3256177236065735190'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/05/thingamajiggr.html' title='thingamajiggr'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-8937724170228901581</id><published>2008-05-18T13:36:00.000-07:00</published><updated>2008-05-18T17:53:41.550-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photo'/><title type='text'>Senzala Capoeira at the University District Street Fair</title><content type='html'>&lt;embed type="application/x-shockwave-flash" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" width="400" height="533" flashvars="host=picasaweb.google.com&amp;RGB=0x000000&amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2Fbinarymillenium%2Falbumid%2F5201819494903710833%3Fkind%3Dphoto%26alt%3Drss" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;I thought I saw this group before, sure enough I have a bunch of pictures of them from a year ago at the Georgetown Ol' Skool Carnival:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;embed type="application/x-shockwave-flash" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" width="400" height="400" flashvars="host=picasaweb.google.com&amp;RGB=0x000000&amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2Fbinarymillenium%2Falbumid%2F5201875131910063233%3Fkind%3Dphoto%26alt%3Drss" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-8937724170228901581?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://picasaweb.google.com/binarymillenium/UniversityDistrictStreetFairCapoeiraSenzala' title='Senzala Capoeira at the University District Street Fair'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/8937724170228901581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=8937724170228901581' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/8937724170228901581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/8937724170228901581'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/05/senzala-capoeira-at-university-district.html' title='Senzala Capoeira at the University District Street Fair'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-8950729625654440267</id><published>2008-04-22T19:30:00.000-07:00</published><updated>2008-04-27T19:59:55.987-07:00</updated><title type='text'>Toorcon Seattle 2008- HBL Afterparty</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://flickr.com/photos/leduardo/2429779061/in/photostream/"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_apbW4BHhLTg/SBU9OyQ8d4I/AAAAAAAAABM/qA5Z3hUTQaI/s400/2429779061_a572ed787a.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5194125069462042498" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/lucasw/2425534225/" title="Two turntables and a youtube feed by lucasw, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2208/2425534225_da6402837f.jpg" width="335" height="500" alt="Two turntables and a youtube feed" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/lucasw/2425534231/" title="Projector surface #1 by lucasw, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2009/2425534231_6702bbcac3.jpg" width="335" height="500" alt="Projector surface #1" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Not much to say about this one, I didn't have much time to prepare... next show I'll develop some new effects.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-8950729625654440267?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://seattle.toorcon.org/2008/about.php' title='Toorcon Seattle 2008- HBL Afterparty'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/8950729625654440267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=8950729625654440267' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/8950729625654440267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/8950729625654440267'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/04/toorcon-seattle-2008-hbl-afterparty.html' title='Toorcon Seattle 2008- HBL Afterparty'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_apbW4BHhLTg/SBU9OyQ8d4I/AAAAAAAAABM/qA5Z3hUTQaI/s72-c/2429779061_a572ed787a.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-9056031680776525345</id><published>2008-02-10T12:59:00.000-08:00</published><updated>2008-02-10T13:11:37.648-08:00</updated><title type='text'>Retarded Glide Bomb</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.google.com/patents?id=baAxAAAAEBAJ"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_apbW4BHhLTg/R69mRLFw8RI/AAAAAAAAABE/X9_rEzYfz4I/s400/retardedglidebom.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5165459742838026514" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's kind of retarded.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-9056031680776525345?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.google.com/patents?id=baAxAAAAEBAJ' title='Retarded Glide Bomb'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/9056031680776525345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=9056031680776525345' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/9056031680776525345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/9056031680776525345'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/02/retarded-glide-bomb.html' title='Retarded Glide Bomb'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_apbW4BHhLTg/R69mRLFw8RI/AAAAAAAAABE/X9_rEzYfz4I/s72-c/retardedglidebom.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-8413098787657470422</id><published>2008-01-07T22:03:00.000-08:00</published><updated>2008-01-07T22:40:56.248-08:00</updated><title type='text'>Finally Ubuntu Microphone in</title><content type='html'>I've been slow to update my Ubuntu 6.10, mainly because the nvidia drivers need to be reconfigured (envy rerun basically), and minor other things might break.  The microphone input didn't work initially, but only the other day did I try to fix it- apparently the alsa drivers didn't fully support the hda-intel MCP51 soundcard I had.  &lt;br /&gt;&lt;br /&gt;So the non-full update thing was to download the latest alsa driver, lib, utils from http://www.alsa-project.org/main/index.php/Main_Page and configure-make-install them.  driver had to be configured with --with-cards=hda-intel.  &lt;br /&gt;&lt;br /&gt;After that:&lt;br /&gt;/etc/modprobe.d/alsa-base &lt;br /&gt;options snd-hda-intel model=laptop&lt;br /&gt;&lt;br /&gt;After restarting, the gnome sound recorder and audacity recorder worked fine, but gephex depends on there being a /dev/dsp0.  I only have a /dev/dsp, and creating a symlink with ln -s /dev/dsp /dev/dsp0 works well but doesn't persist after a restart.  So edit /etc/udev/rules.d/60-symlinks.rules and add the line:&lt;br /&gt;KERNEL=="dsp",          SYMLINK+="dsp0"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-8413098787657470422?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/8413098787657470422/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=8413098787657470422' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/8413098787657470422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/8413098787657470422'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/01/finally-ubuntu-microphone-in.html' title='Finally Ubuntu Microphone in'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-7907778200575038219</id><published>2008-01-02T19:50:00.000-08:00</published><updated>2008-01-03T12:43:47.733-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><title type='text'>Next Year</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_apbW4BHhLTg/R3xkuJoI0fI/AAAAAAAAAA8/EzWeX7pCCJM/s1600-h/2159331315_640636f1f0_m.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_apbW4BHhLTg/R3xkuJoI0fI/AAAAAAAAAA8/EzWeX7pCCJM/s400/2159331315_640636f1f0_m.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5151102817826034162" /&gt;&lt;/a&gt;&lt;br /&gt;http://flickr.com/photos/released/2159331315/&lt;br /&gt;&lt;br /&gt;I and a few others from Hackerbot put a bunch of work into getting the visualization running, and it worked mostly and was decent, but I didn't put much work into providing variation on the effects, I just let them go as is for hours.  But the live video input was broken, mplayer on a pvrusb2 would work for a few minutes and then lock up so hard a kill -9 wouldn't even kill it.  And the audio would work after it was futzed with but then stop upon trying it into a new graph.  &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/lucasw/2156818497/" title="Dual Projectors by lucasw, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2049/2156818497_22f47cd3b9_m.jpg" width="161" height="240" alt="Dual Projectors" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/lucasw/2157612510/" title="Easel by lucasw, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2348/2157612510_d6045f232c_m.jpg" width="161" height="240" alt="Easel" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/lucasw/2156817451/" title="Next Year 2008 by lucasw, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2175/2156817451_4f6f69b20d_m.jpg" width="161" height="240" alt="Next Year 2008" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_apbW4BHhLTg/R3xdBpoI0eI/AAAAAAAAAA0/Uwxarv1KHNw/s1600-h/2158862880_0c559a3370_m.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_apbW4BHhLTg/R3xdBpoI0eI/AAAAAAAAAA0/Uwxarv1KHNw/s400/2158862880_0c559a3370_m.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5151094356740461026" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_apbW4BHhLTg/R3xcxpoI0dI/AAAAAAAAAAs/xuzBNuAmA7o/s1600-h/2158071625_36643afe59_m.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_apbW4BHhLTg/R3xcxpoI0dI/AAAAAAAAAAs/xuzBNuAmA7o/s400/2158071625_36643afe59_m.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5151094081862554066" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;http://www.flickr.com/photos/foist/2158862880/&lt;br /&gt;http://www.flickr.com/photos/foist/2158071625/&lt;br /&gt;&lt;object type="application/x-shockwave-flash" width="400" height="300" data="http://www.vimeo.com/moogaloop.swf?clip_id=467417&amp;amp;server=www.vimeo.com&amp;amp;fullscreen=1&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA"&gt; &lt;param name="quality" value="best" /&gt; &lt;param name="allowfullscreen" value="true" /&gt; &lt;param name="scale" value="showAll" /&gt; &lt;param name="movie" value="http://www.vimeo.com/moogaloop.swf?clip_id=467417&amp;amp;server=www.vimeo.com&amp;amp;fullscreen=1&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA" /&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://www.vimeo.com/467417/l:embed_467417"&gt;Harrier&lt;/a&gt; from &lt;a href="http://www.vimeo.com/user168788/l:embed_467417"&gt;binarymillenium&lt;/a&gt; on &lt;a href="http://vimeo.com/l:embed_467417"&gt;Vimeo&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-7907778200575038219?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/7907778200575038219/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=7907778200575038219' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/7907778200575038219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/7907778200575038219'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2008/01/next-year.html' title='Next Year'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_apbW4BHhLTg/R3xkuJoI0fI/AAAAAAAAAA8/EzWeX7pCCJM/s72-c/2159331315_640636f1f0_m.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-9132266206448624037</id><published>2007-12-29T07:50:00.000-08:00</published><updated>2007-12-29T07:52:32.193-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><title type='text'>Gephex graph examples</title><content type='html'>I used to just keep my graphs to myself and only show videos of results occasionally, but from now on I'll be backing up all the good ones online suitable for distribution under the GPL.&lt;br /&gt;&lt;br /&gt;Here's a couple:&lt;br /&gt;&lt;br /&gt;http://code.google.com/p/binarymillenium/wiki/GephexGraphs&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This one is cool:&lt;br /&gt;&lt;br /&gt;&lt;object type="application/x-shockwave-flash" width="400" height="300" data="http://www.vimeo.com/moogaloop.swf?clip_id=458293&amp;amp;server=www.vimeo.com&amp;amp;fullscreen=1&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA"&gt; &lt;param name="quality" value="best" /&gt; &lt;param name="allowfullscreen" value="true" /&gt; &lt;param name="scale" value="showAll" /&gt; &lt;param name="movie" value="http://www.vimeo.com/moogaloop.swf?clip_id=458293&amp;amp;server=www.vimeo.com&amp;amp;fullscreen=1&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA" /&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://www.vimeo.com/458293/l:embed_458293"&gt;galaxy&lt;/a&gt; from &lt;a href="http://www.vimeo.com/user168788/l:embed_458293"&gt;binarymillenium&lt;/a&gt; on &lt;a href="http://vimeo.com/l:embed_458293"&gt;Vimeo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This is okay:&lt;br /&gt;&lt;br /&gt;&lt;object type="application/x-shockwave-flash" width="400" height="300" data="http://www.vimeo.com/moogaloop.swf?clip_id=458142&amp;amp;server=www.vimeo.com&amp;amp;fullscreen=1&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA"&gt; &lt;param name="quality" value="best" /&gt; &lt;param name="allowfullscreen" value="true" /&gt; &lt;param name="scale" value="showAll" /&gt; &lt;param name="movie" value="http://www.vimeo.com/moogaloop.swf?clip_id=458142&amp;amp;server=www.vimeo.com&amp;amp;fullscreen=1&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA" /&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://www.vimeo.com/458142/l:embed_458142"&gt;BW Plasm demo&lt;/a&gt; from &lt;a href="http://www.vimeo.com/user168788/l:embed_458142"&gt;binarymillenium&lt;/a&gt; on &lt;a href="http://vimeo.com/l:embed_458142"&gt;Vimeo&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-9132266206448624037?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/9132266206448624037/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=9132266206448624037' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/9132266206448624037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/9132266206448624037'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2007/12/gephex-graph-examples.html' title='Gephex graph examples'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-2299611287432273336</id><published>2007-12-16T09:30:00.000-08:00</published><updated>2007-12-16T09:40:19.871-08:00</updated><title type='text'>Dorkbot show</title><content type='html'>This went pretty well, it was low-key- the tent I was in was something of a place to relax although some of the DJs played more danceable music, and half a dozen or so people might be dancing at any time.  I showed off Gephex to anyone who was curious, and would leave effects running unattended for long lengths of time.   Not nearly the same level attention or effort from me as my last show, but good enough for the venue.&lt;br /&gt;&lt;br /&gt;I feel like I've done everything I want to do in Gephex, I have to start using it differently or try different software, but there isn't anything free I've found that and as powerful that is suitable for live editing of effects.&lt;br /&gt;&lt;br /&gt;Things that would help:&lt;br /&gt;Make the joystick input support all buttons on the logitech controller- currently only two buttons and one analog joystick are supported, I'm sure adding the rest is trivial if the module is recompiled.  More inputs to make effects more dynamic would allow more fundamentally different effects.&lt;br /&gt;&lt;br /&gt;But what really needs to be done that is outside the scope of what I can do is allowing patches to be selected and reduced to subsystems that can be better organized and combined with other subsystems.  There's a limit to how complex a graph  can become otherwise that contributes to the 'sameyness' of everything I make with it.  I think they are working on this and there may be a beta version.&lt;br /&gt;&lt;br /&gt;Better random number generation- perlin noise specifically plus more generic IIR number filter block.  I think if I connect a square wave and a random number generator to a flip-flop I can improve the randomness by only infrequently sampling the random number.  The feedback option works as a very poor filter and is inadequate.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-2299611287432273336?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/2299611287432273336/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=2299611287432273336' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/2299611287432273336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/2299611287432273336'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2007/12/dorkbot-show.html' title='Dorkbot show'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-6284681908603767504</id><published>2007-12-16T09:18:00.000-08:00</published><updated>2007-12-16T09:26:44.434-08:00</updated><title type='text'>Radio effect in Audacity</title><content type='html'>So recently I needed to figure out how to take some dialogue recorded in person and make it sound like it was being heard over the radio.  There's no built in effect for that, but on a bulletin board someone suggested notch filtering 1000-3500 Hz as radio's do the same thing- that gets you in the ball park but it misses the distortion and noise and crackle of a radio.  For that I used the &lt;a href="http://plugin.org.uk/ladspa-swh/docs/ladspa-swh.html#tth_sEc2.87"&gt;'satan maximizer'&lt;/a&gt; effect that came in the large set of ladspa plugins that work in Audacity.  With a lot more tuning and research on the type of radio I wanted to imitate I could probably do better, but short of that it at least communicates to the viewer the intention of the effect without being perfect.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-6284681908603767504?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/6284681908603767504/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=6284681908603767504' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/6284681908603767504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/6284681908603767504'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2007/12/radio-effect-in-audacity.html' title='Radio effect in Audacity'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-1573560838268330242</id><published>2007-11-21T07:21:00.000-08:00</published><updated>2007-11-21T07:28:21.095-08:00</updated><title type='text'>Dorkbot - Opening Night Party</title><content type='html'>This will be my second non Open Lab show, this year or ever.  I need to get to work making a bunch of effects, hopefully mostly new ones that don't all look the same...&lt;br /&gt;&lt;br /&gt;Also, a new video from the October Open Lab:&lt;br /&gt;&lt;br /&gt;&lt;object type="application/x-shockwave-flash" width="400" height="300" data="http://www.vimeo.com/moogaloop.swf?clip_id=391788&amp;amp;server=www.vimeo.com&amp;amp;fullscreen=1&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA"&gt; &lt;param name="quality" value="best" /&gt; &lt;param name="allowfullscreen" value="true" /&gt; &lt;param name="scale" value="showAll" /&gt; &lt;param name="movie" value="http://www.vimeo.com/moogaloop.swf?clip_id=391788&amp;amp;server=www.vimeo.com&amp;amp;fullscreen=1&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA" /&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://www.vimeo.com/391788/l:embed_391788"&gt;Open Lab - October 2007&lt;/a&gt; from &lt;a href="http://www.vimeo.com/user168788/l:embed_391788"&gt;binarymillenium&lt;/a&gt; on &lt;a href="http://vimeo.com/l:embed_391788"&gt;Vimeo&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-1573560838268330242?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://dorkbot.org/dorkbotsea/events/pdstwe3/opening.html' title='Dorkbot - Opening Night Party'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/1573560838268330242/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=1573560838268330242' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/1573560838268330242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/1573560838268330242'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2007/11/dorkbot-opening-night-party.html' title='Dorkbot - Opening Night Party'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-2002098477893241283</id><published>2007-10-30T22:27:00.000-07:00</published><updated>2007-10-30T22:37:35.980-07:00</updated><title type='text'>Converting vob to avis</title><content type='html'>So I have a few vobs from a dvdrecorder that was recording a live set of video from an Open Lab.  The vobs must be a little screwy- any editing program I try to load them into thinks they're only 18 seconds long.  VLC knows how to play them in their entirety, but I really only want to get a few good moments out of it all.&lt;br /&gt;&lt;br /&gt;I think transcode is up to the task, with command like:&lt;br /&gt;transcode -i vts_01_1.vob -y dv -o openlab1.avi&lt;br /&gt;&lt;br /&gt;But the video comes out screwy (while the audio is fine).&lt;br /&gt;&lt;br /&gt;I google for the answer and got this gem of a thread as the first hit:&lt;br /&gt;http://linux.derkeiler.com/Newsgroups/comp.os.linux.misc/2004-02/2245.html&lt;br /&gt;where one poster repeatedly ask for details beyond 'go look on google' or 'read the manpage'.  I think anyone who responds with 'go look on google', when that thread then for some stupid reason uselessly becomes the number one search result on google, deserves to be summarily shot.  I'm only half kidding.  Anyway the original poster responds with queries for details (like a command line) but repeatedly gets the same useless answers, but more vehemently.  &lt;br /&gt;&lt;br /&gt;I haven't figured it out yet, but I'll post an actual command line when I do.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-2002098477893241283?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/2002098477893241283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=2002098477893241283' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/2002098477893241283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/2002098477893241283'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2007/10/converting-vob-to-avis.html' title='Converting vob to avis'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-6144792556695078338</id><published>2007-10-26T06:32:00.000-07:00</published><updated>2007-10-26T06:43:47.044-07:00</updated><title type='text'>Connecting to a Server in GWT</title><content type='html'>A while back I started playing with GWT and created a small game &lt;a href="http://code.google.com/p/binarymillenium/wiki/GWTTiles"&gt;GWTTiles&lt;/a&gt;.  Fine example but there's no client-server interaction, so I tried that out a few days ago.  The DynaTables example seemed way too complicated so I looked on the web, and got fairly far but couldn't get the server to work- but then finally a comment in a tutorial pointed out I needed to compile the java server myself, GWT wasn't going to compile it for me- though once placed in the proper directory it would happily run the .class file automatically.&lt;br /&gt;&lt;br /&gt;So I didn't even have the java jdk installed, that was necessary to get javac:&lt;br /&gt;&lt;br /&gt;javac  -cp "$APPDIR/bin:$APPDIR/src:/home/bm/other/gwt-linux-1.4.60/gwt-user.jar:/home/bm/other/gwt-linux-1.4.60/gwt-dev-linux.jar" src/com/binarymillenium/gwt/server/serviceImpl.java&lt;br /&gt;&lt;br /&gt;Then the class file had to be placed in bin/com/binarymillenium/gwt/server, and running the -shell script will properly execute it and my client app can get data from the server (just a text string for now, I need to figure out serializing next).&lt;br /&gt;&lt;br /&gt;This is the error I used to get:&lt;br /&gt;&lt;br /&gt;"com.google.gwt.user.client.rpc.InvocationException: Unable to find/load mapped servlet class 'com.binarymillenium.gwt.server.serviceImpl'"&lt;br /&gt;&lt;br /&gt;And in the development shell window:&lt;br /&gt;&lt;br /&gt;[ERROR] Unable to instantiate 'com.binarymillenium.gwt.server.serviceImpl'&lt;br /&gt;java.lang.ClassNotFoundException: com.binarymillenium.gwt.server.serviceImpl&lt;br /&gt;...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-6144792556695078338?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/6144792556695078338/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=6144792556695078338' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/6144792556695078338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/6144792556695078338'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2007/10/connecting-to-server-in-gwt.html' title='Connecting to a Server in GWT'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-4654958686845348465</id><published>2007-09-21T19:56:00.001-07:00</published><updated>2008-11-09T08:58:19.818-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gimp'/><title type='text'>The Kingdom</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_apbW4BHhLTg/RvSEqDdc8rI/AAAAAAAAAAk/5ksxWGeAvkQ/s1600-h/thekingdomposter5.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_apbW4BHhLTg/RvSEqDdc8rI/AAAAAAAAAAk/5ksxWGeAvkQ/s400/thekingdomposter5.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5112857334990566066" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-4654958686845348465?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/4654958686845348465/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=4654958686845348465' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/4654958686845348465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/4654958686845348465'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2007/09/kingdom.html' title='The Kingdom'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_apbW4BHhLTg/RvSEqDdc8rI/AAAAAAAAAAk/5ksxWGeAvkQ/s72-c/thekingdomposter5.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-4426723715274565005</id><published>2007-09-01T10:42:00.000-07:00</published><updated>2007-09-01T11:00:36.219-07:00</updated><title type='text'>Generating Video</title><content type='html'>There have been a lot of Arduino video generation projects covered by the Make blog recently, I did my own a couple of weeks ago:&lt;br /&gt;&lt;br /&gt;&lt;object type="application/x-shockwave-flash" width="480" height="320" data="http://vimeo.com/moogaloop.swf?clip_id=288344&amp;amp;server=vimeo.com&amp;amp;fullscreen=1&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=1&amp;amp;color=00ADEF"&gt; &lt;param name="quality" value="best" /&gt; &lt;param name="allowfullscreen" value="true" /&gt; &lt;param name="scale" value="showAll" /&gt; &lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=288344&amp;amp;server=vimeo.com&amp;amp;fullscreen=1&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=1&amp;amp;color=00ADEF" /&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/288344/l:embed_288344"&gt;Arduino Video - NTSC&lt;/a&gt; from &lt;a href="http://vimeo.com/user168788/l:embed_288344"&gt;binarymillenium&lt;/a&gt; and &lt;a href="http://vimeo.com/l:embed_288344"&gt;Vimeo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Since then I've experimented with upping the resolution by a lot, though memory becomes an issue quickly.  Ideally I could have a whole set of different visuals to generate with an arduino and few knobs and buttons to control them with for a cheap VJ device.&lt;br /&gt;&lt;br /&gt;Color is out of the question with an Arduino without hardware components to generate much higher frequencies than can be made in software with the standard 20MHz clock.&lt;br /&gt;&lt;br /&gt;So next I'm thinking of trying color video generation with an FPGA.  B&amp;W generation on an FPGA seems trivial compared to doing it in software, and many grades of gray could be generated with PWM rather than having to add more resistors and use more digital outputs.&lt;br /&gt;&lt;br /&gt;But can a 3.58MHz color signal be put on top of that successfully?  &lt;br /&gt;&lt;br /&gt;I have a Digilent Spartan 3 dev-kit that's a few years old, it has a 50 MHz oscillator.  I could generate 50/14 = 3.571 Mhz clock from that, each period would be 14 cycles long.  So that means only 13 different phase shifts from that would be possible, and I'm not sure if a full 360 of phase shifts is allowed- it might only be 1/2 or 1/4 of that.  And then there's the problem of PWMing those to produce different amplitudes- for one half period there are 7 cycles.  A normal one would have PWM like 1010101, then a 1100110 (or maybe 1100011), and then 1101101 or 1110111 or something else but it's not clear any filtering I would do or the tv input does would actually create a readable 3.571 MHz signal out of that.  It's worth a shot anyhow.&lt;br /&gt;&lt;br /&gt;There are a few color video FPGA projects out there, one on opencores, I'll look into those if my efforts aren't that successful.&lt;br /&gt;&lt;br /&gt;Once I can generate a test pattern, I'll want to synthesize a cpu and program it with a game or VJ stuff to generate interesting moving visuals.  I don't think I can make a microblaze with the free Xilinx Webpack tools, but maybe something like OpenFire or PicoBlaze?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-4426723715274565005?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/4426723715274565005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=4426723715274565005' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/4426723715274565005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/4426723715274565005'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2007/09/generating-video.html' title='Generating Video'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-3145212027460985122</id><published>2007-06-29T18:52:00.000-07:00</published><updated>2007-08-05T21:47:53.223-07:00</updated><title type='text'>WinTV USB with Ubuntu 6.04</title><content type='html'>I bought a usb TV tuner/s-video/rca input device for my laptop, so that I can get video from DV video cameras and any other DV source straight into Gephex.  Installation in Linux wasn't too hard:&lt;br /&gt;&lt;br /&gt;First get usbvision:&lt;br /&gt;&lt;br /&gt;cvs -z3 -d:pserver:anonymous@usbvision.cvs.sourceforge.net:/cvsroot/usbvision co -P usbvision&lt;br /&gt;&lt;br /&gt;make; sudo make install&lt;br /&gt;&lt;br /&gt;Tv time doesn't work, but zapping does:&lt;br /&gt;&lt;br /&gt;tvtime:&lt;br /&gt;"Your capture card driver, USBVision USB Video, is not providing&lt;br /&gt;    enough buffers for tvtime to process the video."&lt;br /&gt;&lt;br /&gt;zapping:&lt;br /&gt;works!&lt;br /&gt;&lt;br /&gt;Gephex doesn't know how to change the channels or settings, so the trick is to change things in zapping and then quit and the settings will persist in gephex.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-3145212027460985122?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.amazon.com/Hauppauge-602-WinTV-USB-Model/dp/B00006B76A' title='WinTV USB with Ubuntu 6.04'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/3145212027460985122/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=3145212027460985122' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/3145212027460985122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/3145212027460985122'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2007/06/wintv-usb-with-ubuntu-604.html' title='WinTV USB with Ubuntu 6.04'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-4641939061680080837</id><published>2007-06-14T19:25:00.000-07:00</published><updated>2007-06-16T18:53:33.125-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><title type='text'>Opticlash 2</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_apbW4BHhLTg/RnSQ_TeuBQI/AAAAAAAAAAU/Jz6ihaUc8Kk/s1600-h/opticlash2.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_apbW4BHhLTg/RnSQ_TeuBQI/AAAAAAAAAAU/Jz6ihaUc8Kk/s320/opticlash2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5076842097188668674" /&gt;&lt;/a&gt;&lt;br /&gt;This was an interesting event, I didn't go to the first one in 2005 and I had my doubts about the format going in- and I still have my doubts, but overall it was a success in terms of promoting VJing- and also  &lt;a href="http://vjscobot.com"&gt;VJ Scobot&lt;/a&gt; won, and I think he did do the best VJing there.  &lt;br /&gt;&lt;br /&gt;There were three sets of screens at the front of the room, the center had camera views of the two competing VJs and the outer ones had the video they were outputting.  This seemed less than ideal because of difficulty in viewing both simultaneously- you could either watch one or the other except from the most distant points or oblique angles.&lt;br /&gt;&lt;br /&gt;It's possible the VJs at some points were glimpsing what the other guy was doing and responded in some way, but I think mainly they were just concentrating on their own stuff- which is unfortunate, because the most crowd-pleasing aspect of a competition is any kind of interaction and drama that can be generated between the contestants.  It would be great to have one contestant go for a minute or two and the the other goes, trying to outdo the other, maybe playing a similar sort of clip, or mocking them somehow, or anything like that- and they would go back and forth a few times.&lt;br /&gt;&lt;br /&gt;&lt;embed src="http://www.vimeo.com/moogaloop.swf?clip_id=213588" quality="best" scale="exactfit" width="400" height="300" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;a href="http://www.vimeo.com/clip:213588"&gt;Opticlash 2&lt;/a&gt; from &lt;a href="http://www.vimeo.com/user:168788"&gt;binarymillenium&lt;/a&gt; on &lt;a href="http://www.vimeo.com/"&gt;Vimeo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I didn't actually see the last set, since the show was going on a bit longer than advertised- the 15 minute sets for the later rounds should have been at most 10 minutes on schedule or not.&lt;br /&gt;&lt;br /&gt;The judges didn't add a lot besides the rote rating judgements they offered, the MC initially wanted some kind of vocal rationale or &lt;i&gt;something&lt;/i&gt; out of the judges but they were microphone shy.  &lt;br /&gt;&lt;br /&gt;Here's a &lt;a href="http://lineout.thestranger.com/2007/06/opticlashed"&gt;writeup from one of the judges&lt;/a&gt;, and he posted some video (Pixelflip vs. ?) &lt;a href="http://www.dailymotion.com/tworedshoez/video/x2a1gy_opticlash-2-chac"&gt;on dailymotion&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-4641939061680080837?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://opticlash.com/about.html' title='Opticlash 2'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/4641939061680080837/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=4641939061680080837' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/4641939061680080837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/4641939061680080837'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2007/06/opticlash-2.html' title='Opticlash 2'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_apbW4BHhLTg/RnSQ_TeuBQI/AAAAAAAAAAU/Jz6ihaUc8Kk/s72-c/opticlash2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-3256573937373556679</id><published>2007-06-11T19:02:00.000-07:00</published><updated>2007-06-11T20:16:10.586-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><title type='text'>VJing Toorcon</title><content type='html'>Post-mortem thingy:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://flickr.com/photos/mattw/496519747/"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_apbW4BHhLTg/Rm4J6TeuBPI/AAAAAAAAAAM/ccJVLxuNlZw/s320/toorcon.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5075004727359309042" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;My setup was to use &lt;a href="http://gephex.org/"&gt;gephex&lt;/a&gt; on a Linux laptop and have a video camera and dvd player as video sources.  Switching between them would have been nicer with a switch box, I was just reconnecting cables while having a graph loaded on gephex that wasn't dependent on external video input. &lt;br /&gt;&lt;br /&gt;I had a couple of newly burned DVDs, one was lots of video game imagery.  Biohazard Battle on the Sega Genesis worked decently, but old Atari games with flatter coloring and graphics could have been more interesting.  Unfortunately my Atari 2600 didn't work after I pulled it out of storage.  One of those &lt;a href="http://www.amazon.com/Activision-10-in-1-TV/dp/B0001HYSG4/"&gt;$20 battery powered video game joysticks&lt;/a&gt; would work well for sourcing the imagery live, but I'd need someone else to play (I recall somebody brought one to Open Lab a few months ago but didn't try it out).&lt;br /&gt;&lt;br /&gt;The other dvd had videos of a computer animation contest, one where the executable creating the animation had to be less than 32K.  I had to run the dvd player output through a anything-to-anything box from Canopus with firewire in/out on it.&lt;br /&gt;&lt;br /&gt;Four projectors were going with cloned video, and I had an LCD monitor to see what I was doing.  None of the projection surfaces in the main room were that ideal but they worked.  The better surfaces were out in the hall but I couldn't see them.&lt;br /&gt;&lt;br /&gt;Gephex (or underlying Linux graphics software) is finicky about driving full-screen, sometimes there would be a sliver of the desktop underneath it.  Playing around with it usually got rid of it.  I spent a long time going through all my graphs and deleting ones that didn't work and adjusting output settings for ones to keep.  It would be nice if each individual graph didn't have it's own output settings.&lt;br /&gt;&lt;br /&gt;Kino plus my &lt;a href="http://code.google.com/p/binarymillenium/wiki/Frei0rGephexModules"&gt;screengrab frei0r module&lt;/a&gt; was my way of getting 1394 video into gephex.  I could probably write my own 1394 gephex/frei0r input module using source from Kino but I haven't gotten around to it yet. &lt;br /&gt;&lt;br /&gt;Ideally there would be a way to get video into linux so that it is seen as a webcam- a video-to-usb device sounds ideal- I could get video from a video camera or a dvd player without using firewire at all.  Supposedly there is one from X10 with linux drivers, and another from Hauppage, but neither is sold on Amazon or other sites that feel respectable enough to purchase from.&lt;br /&gt;&lt;br /&gt;&lt;embed src="http://www.vimeo.com/moogaloop.swf?clip_id=192461" quality="best" scale="exactfit" width="400" height="300" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.vimeo.com/clip:192461"&gt;Toorcon 2007 &lt;/a&gt; from &lt;a href="http://www.vimeo.com/user:168788"&gt;binarymillenium&lt;/a&gt; on &lt;a href="http://www.vimeo.com/"&gt;Vimeo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Another option would be to run Gephex on the windows side of my laptop, but unfortunately it came with Vista preinstalled, and gephex doesn't run so well there.&lt;br /&gt;&lt;br /&gt;I would have liked to be able to record the whole show or portions of it.  Another RGB-to-video plus another video camera with video input recording (like my old Canon DV camera) would have worked, but added a lot of wires.  Also I didn't have a spare VGA splitter output to drive it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-3256573937373556679?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://seattle.toorcon.org/' title='VJing Toorcon'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/3256573937373556679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=3256573937373556679' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/3256573937373556679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/3256573937373556679'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2007/06/vjing-toorcon.html' title='VJing Toorcon'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_apbW4BHhLTg/Rm4J6TeuBPI/AAAAAAAAAAM/ccJVLxuNlZw/s72-c/toorcon.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-8264758651496506412</id><published>2007-05-28T19:00:00.000-07:00</published><updated>2008-11-09T08:58:06.269-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gimp'/><title type='text'>Europe Has A Mission</title><content type='html'>&lt;a title="europe has a posse" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_apbW4BHhLTg/SLA1nNR7zDI/AAAAAAAAAdY/5oaQDOcX5wM/s1600-h/04090_europe_has_a_posse_122_401lo.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_apbW4BHhLTg/SLA1nNR7zDI/AAAAAAAAAdY/5oaQDOcX5wM/s400/04090_europe_has_a_posse_122_401lo.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5237745314327940146" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There was an add for this movie in The Stranger.  My first thought, naturally, was WTF?  Then I wondered if it was 'Command &amp; Conquer: Generals: The Movie', and then I looked it up on IMDB (it wasn't there) and then on google and found out why: it doesn't exist.  &lt;a href="http://0100101110101101.org/home/unitedwestand/intro.html"&gt;It's a joke/commentary/guerilla-art/etc&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-8264758651496506412?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://unitedwestandmovie.com/' title='Europe Has A Mission'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/8264758651496506412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=8264758651496506412' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/8264758651496506412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/8264758651496506412'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2007/05/europe-has-mission.html' title='Europe Has A Mission'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_apbW4BHhLTg/SLA1nNR7zDI/AAAAAAAAAdY/5oaQDOcX5wM/s72-c/04090_europe_has_a_posse_122_401lo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-794841816854512593</id><published>2007-05-01T07:21:00.000-07:00</published><updated>2007-05-01T07:50:45.749-07:00</updated><title type='text'>Amazon S3 for media backup</title><content type='html'>I've been concerned about backing up my videos and pictures for as long as I've been taking them, but until a week ago I never bothered to think much about a commercial service.  I would periodically burn DVDs, multiple DVDs of the same data- worried that the DVDs would degrade after a few years.  I'd also make hard drive backups and then store the hard drives and some of the dvds offsite. &lt;br /&gt;&lt;br /&gt;DVDs are poor for backup as soon as a platter is full of them- it takes a lot of time to find specific files later on.  Hard drives are better, but expensive.  Recently I had two hard drives fail in a row- they still sort of work, I can recover data off them, but they don't work as boot drives and were at times making clunking noises.&lt;br /&gt;&lt;br /&gt;Another feature I've been in need of is a way of transferring videos to people, or hosting high quality videos.  Youtube/vimeo/google-video/etc. is low quality and I don't necessarily want to give the videos to the entire world.&lt;br /&gt;&lt;br /&gt;I'd heard about Amazon's S3 service a while back, but it doesn't have a friendly user interface by default- and I wasn't sure about paying for third party software like jungledrive, and I didn't want to pay another service like that something-else-drive.  I've bought things from Amazon before, they have my credit card information already, and I like their pricing scheme.  Other services want you to pay an excess- $10 a month for 100 GB, great deal if you fill up that 100 GB immediately, but poor if you only use 10 GB at first.&lt;br /&gt;&lt;br /&gt;Then I found &lt;a href="http://www.rjonna.com/ext/s3fox.php"&gt;S3 firefox plugin&lt;/a&gt;.  I can't vouch for the security of this plugin, but it seems to work and the media I'm backing up isn't that security critical.  The plugin allows simple uploading and downloading and access control setting of files.&lt;br /&gt;&lt;br /&gt;Over a cable modem, it took me about 3-days of uploading to get 10 GB of pictures onto S3.  This is slow, but once they're uploaded the rate at which I take new pictures is much lower than backing up several years of pictures all at once. &lt;br /&gt;&lt;br /&gt;At they're current pricing this 10 GB will cost $1 .50 a month, and I anticipate they'll lower the price per GB as storage prices fall.  In the next week I'll probably have 20 GB up, so $3 a month or $36 a year.  If I was just storing pictures this would start to compare poorly with flickr or other photo sites, which charge a flat yearly rate for 'unlimited' storage- but I like the raw interface for uploading and the truly unlimited feeling of S3, and I also don't plan on having too many GB of just pictures.&lt;br /&gt;&lt;br /&gt;Video is the real hard-drive killer, and unfortunately S3 isn't going to be a good solution for raw off the camera DV or HDV or other kinds of video.  The files are too big: S3 file limit size is 5 GB also, though I can chop up some of the bigger video files, it takes too long to transfer, and it will cost too much.  I could easily have a terabyte of video pretty soon.  I suppose it's not all worth backing up, maybe if I keep my S3 total under 50 -100 GB I won't mind the cost too much.&lt;br /&gt;&lt;br /&gt;For now, I'm just backing up editing compressed video- wmv files under 100 MB.  I might progress to backing up less heavily compressed files later.   It's easy to share the files with others, set them to global read-only and email people the link- or if the third party has an Amazon account and gets Firefox + the S3 plugin going you can specifically allow them and only them to have read or even write access.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-794841816854512593?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/794841816854512593/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=794841816854512593' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/794841816854512593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/794841816854512593'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2007/05/amazon-s3-for-media-backup.html' title='Amazon S3 for media backup'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-1849558048218519881</id><published>2007-04-21T14:45:00.000-07:00</published><updated>2008-11-09T08:57:01.785-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><title type='text'>911 Media Open Lab - April 15</title><content type='html'>&lt;embed src="http://www.vimeo.com/moogaloop.swf?clip_id=174256" quality="best" scale="exactfit" width="400" height="300" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.vimeo.com/clip:174256"&gt;911 Media Arts Center Open Lab - 2007.04.15&lt;/a&gt; on &lt;a href="http://www.vimeo.com/"&gt;Vimeo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I bought a new laptop somewhat recently, and am currently dual-booting between Vista &amp; Ubuntu.  Most of my custom software was only set up to run in Ubuntu, but I forgot to figure out getting the S-Video output to work when I brought it to Open Lab- despite all the other ease-of-use advances of Ubuntu something as simple as configuring an external output is still a pain.  So instead I went back into Vista and just messed around with Wings3D, while others manipulated that source video with some hardware video mixers.&lt;br /&gt;&lt;br /&gt;The slower bits are edited out, and overall I like the most of the scenes in there- even if they don't match up to the (also live generated) music, I think there's a few underlying ideas that could be developed into more interesting clips:&lt;br /&gt;-Flying over alien landscapes, manipulating them, and a kind of 80s CG flat shading look&lt;br /&gt;-Simple shapes that generate fractals&lt;br /&gt;&lt;br /&gt;Wings isn't really meant for live performance.  With a little more work I could set up a lot more keyboard shortcuts so the context menus don't show up as much.  A more intensive effort would be to make models in Wings, export them to objs or something and a have a custom app running on the external monitor that can be triggered to load the model.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-1849558048218519881?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.911media.org/events/openlab.html' title='911 Media Open Lab - April 15'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/1849558048218519881/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=1849558048218519881' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/1849558048218519881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/1849558048218519881'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2007/04/911-media-open-lab-april-15.html' title='911 Media Open Lab - April 15'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-5458532484894549693</id><published>2007-04-09T19:26:00.000-07:00</published><updated>2008-11-09T08:57:45.090-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='openscenegraph'/><title type='text'>Bones Animation - Re-Acting</title><content type='html'>&lt;object width="400" height="300"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=167534&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=167534&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/167534"&gt;Bones - Re-Acting&lt;/a&gt; from &lt;a href="http://vimeo.com/user168788"&gt;binarymillenium&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I think I could have done a better job with this video, edited it a little more heavy, but I don't like to get to bogged down with it.  I sort of think as these as visual notes to myself, I can refer back to them and recreate the effect I captured in a bigger and more meaningful work. &lt;br /&gt;&lt;br /&gt;The main thing making editing more difficult was that I was using image sequences in Premiere- my computer isn't fastest enough to actual play back unrendered image sequences (and I was too lazy to render it), so it was hard to get the edits and feel right.&lt;br /&gt;&lt;br /&gt;The source imagery is from a code.google project called 'bones' &lt;a href="http://code.google.com/p/binarymillenium/wiki/Bones"&gt;http://code.google.com/p/binarymillenium/wiki/Bones&lt;/a&gt;.  It's a very simplistic bones animation implementation, using osg::nodes and with randomly generated hierarchy and animation.  Every vertex in the object loaded for a bone has a weight that mixes (using quaternion slerp) the positions of the parent osg::node and the child.  The weights are automatically generated based on the distance from the vertex from the root of the object where it joins with the parent.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-5458532484894549693?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/5458532484894549693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=5458532484894549693' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/5458532484894549693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/5458532484894549693'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2007/04/bones-animation-re-acting.html' title='Bones Animation - Re-Acting'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-3328171170725117560</id><published>2007-03-18T09:29:00.000-07:00</published><updated>2007-03-18T10:02:53.977-07:00</updated><title type='text'>VJ/Visualization Blogs</title><content type='html'>I was randomly searching for something the other day and came across a lot of interesting blogs:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://createdigitalmotion.com/"&gt;Create Digital Motion&lt;/a&gt;&lt;br /&gt;This one has a commercial look, and covers a lot of gear too expensive for the casual reader, and in general focuses on gear and other people's work.  But it show me &lt;a href="http://processing.org/"&gt;Processing&lt;/a&gt;.  Processing has a horrible name for googleability, which used to be addressed by calling it Proce55ing.  Idiotically they've assumed that because the google search for just processing by itself points to the proper website, they can stop using the distinctive 55 in the name.  But what happens when you try combined searches for processing and some other search term?  You get tons of site that use processing as a common English word.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flight404.com/blog/"&gt;flight404&lt;/a&gt;&lt;br /&gt;Personal blog covering projects by the author of the site.  He's done some really cool things with processing and also griffin powermate knobs.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.processingblogs.org/"&gt;Processing Blogs&lt;/a&gt;&lt;br /&gt;Haven't really read this that much, but it looks interesting.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://vloblive.wordpress.com/"&gt;VLOBLIVE&lt;/a&gt;&lt;br /&gt;It's a clunky word for 'Very Low Budget Live video for Events'.  It's not that applicable to much that I do, and their definition of 'very low budget' is still a lot of money to me.  They use the other terms like IMAG, for image magnification, which very mundanely just refers to show a big closeup of a performer on a stage on a big screen.  The blog is pretty practical, not about cool art but just has a lot of helpful stuff.&lt;br /&gt;&lt;br /&gt;There was another site linked to from Create Digital Motion but I don't have a link to it in front of me. &lt;br /&gt;&lt;br /&gt;I've been playing with Processing, and it is very fast and easy to use.  The support for microphone and video input doesn't seem as robust as in gephex, but the flexibility for making effects and taking data from other sources seems high.  It's wierd, because a lot of the stuff to do is the sort of thing I'd do already in C++ and OSG rather than Java here- but I can understand the appeal to people who don't want to spend hours compiling the latest OSG sources, and there's few button and mouse clicks saved by just typing in code and hitting run.  But I feel like I should learn it anyway even though its 3D capabilities are a step back from OSG, if nothing else because there's a higher likelihood of being able to collaborate with other people into processing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-3328171170725117560?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/3328171170725117560/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=3328171170725117560' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/3328171170725117560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/3328171170725117560'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2007/03/vjvisualization-blogs.html' title='VJ/Visualization Blogs'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-1403867430184527691</id><published>2007-03-17T13:07:00.000-07:00</published><updated>2007-03-17T13:33:27.492-07:00</updated><title type='text'>Vimeo</title><content type='html'>It's easy to spread yourself too thin by trying to maintain an online presence on a lot of similar community sites for hosting content.  They all have different designs and by virtue of their architecture or just the vibe the creators and the initial group of users create they seem to be good for different things.  But I'm trying out vimeo because of their focus on user created content- there's a lot of artists in there, and it sort of has a flickr feel to it- and the video quality is pretty good, the UI is nice that it disappears when not in use (though it obscures video when in use).  I'm just hosting files identical to ones I have on myspace, google video, and youtube, but whatever site feels the most productive I'll probably eventually use to the exclusion of the rest.  When someone starts a free 640x480 or HD hosting site I'll probably re-evaluate...&lt;br /&gt;&lt;br /&gt;Youtube is the most popular, but video quality is garbage and most of the content is garbage.  I imagine the user base is on the more youthful side. &lt;br /&gt;&lt;br /&gt;Google video is better quality, though has no real community feel- it's just a faceless generic place to host video.  Some day I might be interested in trying to make money off of uploaded video that I own entirely but for now that idea is mostly incompatible with my approach to this sort of thing (a tip jar feature with proceeds donated to a charity of my choosing would be nice though). &lt;br /&gt;&lt;br /&gt;Myspace is not primarily a video sharing site, but they have a decent video uploading feature.  If you have a myspace page and make video you might as well use their hosting instead of embedding someone else's.  It can feel a lot more personal even if your page is not your personal page because of the emphasis on friending.&lt;br /&gt;&lt;br /&gt;There's a ton of other hosting sites I won't bother with, mostly since their user base is marginal or they are just a dumping ground for copyrighted material, racier stuff if their content policy is more liberal than youtube or google's.  Others are completely based around making money for uploaded content, pay per view basically: get thousands of views and make $10 or so.  That sort of goal based emphasis probably marginalizes a lot of otherwise interesting content, encourages copy-cats and therefore homogeneity.  So does having a view-counter or ratings (read slashdot for a few months to see how their 'karma' promotes pointless regurgitation...), but money is a force-multiplier.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-1403867430184527691?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://vimeo.com/user:168788/clips' title='Vimeo'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/1403867430184527691/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=1403867430184527691' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/1403867430184527691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/1403867430184527691'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2007/03/vimeo.html' title='Vimeo'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-313451142274698605</id><published>2007-02-23T07:55:00.000-08:00</published><updated>2007-02-23T08:04:15.825-08:00</updated><title type='text'>Google project hosting</title><content type='html'>I was getting tired of waiting for shell service to come back to sourceforget so I searched for blogs talking about it, maybe they knew something I didn't- instead I found this entry http://icolor2.blogspot.com/2007/02/sourceforge-downtime.html which pointed me to &lt;a href="http://code.google.com/hosting/"&gt;google project hosting&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Almost immediately I created my own project http://code.google.com/p/binarymillenium/ and started uploading code.  Initially I thought there was no support for screenshots but I then realized screenshots could be uploaded to svn and linked to from the wiki, although it automatically creates image for 'jpg' extensions but not 'JPG'.&lt;br /&gt;&lt;br /&gt;I'm ready to quit sourceforge entirely, and leave all its frustrating user interface problems behind.  It's one of those facets of the internet where big sites start up and then become sort of fossilized in whatever web technology was the state of the art or popular at the time, and then a new generation will rise up and replace them with superior web stuff- google web toolkit is the current new thing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-313451142274698605?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://code.google.com/hosting/' title='Google project hosting'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/313451142274698605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=313451142274698605' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/313451142274698605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/313451142274698605'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2007/02/google-project-hosting.html' title='Google project hosting'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-8956381889228725081</id><published>2007-02-21T22:13:00.000-08:00</published><updated>2008-11-09T08:56:35.260-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='openscenegraph'/><title type='text'>Render-to-texture feedback with OSG</title><content type='html'>This actually doesn't use any of the screen capture code from the last post ( I'm still working out how to best use that) - it just does a good old fashioned glReadPixels to current the current opengl screen.&lt;br /&gt;&lt;br /&gt;&lt;object width="400" height="300"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=154994&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=154994&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/154994"&gt;OSG Feedback&lt;/a&gt; from &lt;a href="http://vimeo.com/user168788"&gt;binarymillenium&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-8956381889228725081?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://video.google.com/videoplay?docid=-4613378742254751736' title='Render-to-texture feedback with OSG'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/8956381889228725081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=8956381889228725081' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/8956381889228725081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/8956381889228725081'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2007/02/render-to-texture-feedback-with-osg.html' title='Render-to-texture feedback with OSG'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-2289830227368214904</id><published>2007-02-19T06:55:00.000-08:00</published><updated>2007-02-19T07:51:42.196-08:00</updated><title type='text'>Screen Capture with wxWindows</title><content type='html'>For reasons that will become clear when I post some more software and video, I need to have a general method of capturing any part of the screen and using it as a texture in custom applications.&lt;br /&gt;&lt;br /&gt;Google searches for 'screen capture' 'capture screen' or 'screen grab' turn up a lot of other peoples shareware screen grab stuff, and lots of mailing lists where screen captures are provided of one thing or another but it's hardly ever about the code that did the work.  How to find some usable code to do what I needed?  The answer turned out to be sourceforge, where I found sseditor:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sseditor.cvs.sourceforge.net/sseditor/src/win32/wxWin32ScreenShot.cpp?revision=1.1&amp;view=markup"&gt;wxWin32ScreenShot.cpp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I was hoping there would have been a platform independent method where you just ask the video card to give you all the pixels, but it turns out to be windowing platform specific.  This instance used Windows and wxWindows.  I compiled wxWindows 2.8.0 for Cygwin and saw that the examples work.  I then copied the screengrab code out of sseditor and put it in a wxWindows sample called 'drawing'.  That worked after a little tweaking.&lt;br /&gt;&lt;br /&gt;I then took the code and put it into a custom OSG application.  There were lots of problems, and I was worried the wxWindows libraries or just using wxWindows in OSG at all was causing instability.  I then ran into a problem where calling 'CreateCompatibleBitmap' failed after exactly 153 calls, but it turned out I needed to call DeleteObject on the HBITMAP before calling CreateCompatible repeatedly, I was using up graphics memory and not freeing it.&lt;br /&gt;&lt;br /&gt;Also, I had to call  wxInitialize() and wxUninitialize() at the beginning and end of my program.&lt;br /&gt;       &lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;void wxScreenCapture(wxDC&amp; dc)&lt;br /&gt;{&lt;br /&gt;    int sizeX = 0;&lt;br /&gt;    int sizeY = 0;&lt;br /&gt;    sizeX = tex_width; //GetSystemMetrics(SM_CXSCREEN);&lt;br /&gt;    sizeY = tex_height; //GetSystemMetrics(SM_CYSCREEN);&lt;br /&gt;&lt;br /&gt;    compat_counter++;&lt;br /&gt;  &lt;br /&gt;    bmp-&gt;SetHeight(sizeY);&lt;br /&gt;    bmp-&gt;SetWidth(sizeX);&lt;br /&gt;   &lt;br /&gt;    &lt;br /&gt;    HDC mainWinDC = GetDC(GetDesktopWindow());&lt;br /&gt;    HDC memDC = CreateCompatibleDC(mainWinDC);&lt;br /&gt;  &lt;br /&gt;    if (bitmap != NULL) DeleteObject(bitmap);&lt;br /&gt;&lt;br /&gt;    bitmap = CreateCompatibleBitmap(mainWinDC,tex_width,tex_height);&lt;br /&gt;&lt;br /&gt;    if (bitmap == NULL) {&lt;br /&gt;        std::cerr &lt;&lt; "CreateCompatibleBitmap failed at " &lt;&lt; &lt;br /&gt;                    compat_counter &lt;&lt; ", " &lt;&lt;&lt;br /&gt;                    mainWinDC &lt;&lt; " " &lt;&lt; tex_width &lt;&lt; " " &lt;&lt; &lt;br /&gt;                    tex_height &lt;&lt; std::endl;&lt;br /&gt;        exit(1);&lt;br /&gt;        return;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    HGDIOBJ hOld = SelectObject(memDC,bitmap);&lt;br /&gt;    BitBlt(memDC, 0, 0,sizeX,sizeY, mainWinDC, 20, 20, SRCCOPY);&lt;br /&gt;    SelectObject(memDC, hOld);&lt;br /&gt;    DeleteDC(memDC);&lt;br /&gt;    ReleaseDC(GetDesktopWindow(), mainWinDC);&lt;br /&gt;    bmp-&gt;SetHBITMAP((WXHBITMAP)bitmap);&lt;br /&gt;    if (bmp-&gt;Ok() ) {&lt;br /&gt;        //dc.DrawText( _T("BMP  ok"), 30, 20 );&lt;br /&gt;        &lt;br /&gt;    } else {&lt;br /&gt;        //dc.DrawText( _T("BMP not ok"), 30, 20 );&lt;br /&gt;        std::cerr &lt;&lt; "bmp not ok" &lt;&lt; std::endl;&lt;br /&gt;        return;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;    if (savewximage) {&lt;br /&gt;        bmp-&gt;SaveFile( wxT("/cygdrive/b/text.bmp"), wxBITMAP_TYPE_BMP);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;My other problem was that I didn't know how to translate between the wxBitmap format of wxWindows and the texture format of the osg::Image.  The first way I made it work was by writing the bitmap to disk using a wxWindows function then loading that bmp to a texturing in OSG- this worked but was hard on the disk drive for high rate screen capturing, but &lt;a href="http://www.codeguru.com/cpp/w-p/system/devicedriverdevelopment/article.php/c5789/"&gt;writing to a ramdisk&lt;/a&gt; can fix that.&lt;br /&gt;&lt;br /&gt;But the seeming right way to do it:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;/// get image from desktop in wxBitmap format, &lt;br /&gt;// convert it to osg::Image format&lt;br /&gt;wxAlphaPixelData rawbmp(*bmp, wxPoint(0,0), &lt;br /&gt;                         wxSize(tex_width, tex_height)); &lt;br /&gt;wxAlphaPixelData::Iterator p(rawbmp);               &lt;br /&gt;&lt;br /&gt;image-&gt;allocateImage(tex_width, tex_height, &lt;br /&gt;                     1, GL_RGBA, GL_FLOAT);&lt;br /&gt;&lt;br /&gt;/// image is an osg::Image&lt;br /&gt;float* img_data = (float*)image-&gt;data();&lt;br /&gt;for (unsigned i = 0; (i &lt; tex_height); i++) {&lt;br /&gt;for (unsigned j = 0; (j &lt; tex_width); j++) {&lt;br /&gt;&lt;br /&gt;    int ind = i*tex_width + j;&lt;br /&gt;&lt;br /&gt;    bool flip = ((i &gt; tex_height/4-1) &amp;&amp; (i &lt; 3*tex_height/4) &lt;br /&gt;                &amp;&amp; (j &gt; tex_width/4-1)  &amp;&amp; (j &lt; 3*tex_width/4));&lt;br /&gt;&lt;br /&gt;    img_data[ind*4]   = flip ? 1.0 - p.Red()/255.0 : p.Red()/255.0;&lt;br /&gt;&lt;br /&gt;    img_data[ind*4+1] = flip ? 1.0 - p.Green()/255.0 : p.Green()/255.0;&lt;br /&gt;&lt;br /&gt;    img_data[ind*4+2] = flip ? 1.0 - p.Blue()/255.0 : p.Blue()/255.0;&lt;br /&gt;&lt;br /&gt;    img_data[ind*4+3] = 1.0;&lt;br /&gt;&lt;br /&gt;    p.MoveTo(rawbmp, j, tex_height-1-i);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The flip code seems really wierd, but it was necessary.&lt;br /&gt;&lt;br /&gt;Anyway, after all that I felt pretty proud of myself for hacking a working screencap together over a couple of days, not knowing anything about windowing toolkits before that (I've always known enough about them to try and avoid them like the plague, there's no uglier code than window gui widget code).&lt;br /&gt;&lt;br /&gt;The only libraries needed for wxWindows are -lwx_base-2.8 and -lwx_msw_core-2.8, though there will be warnings about other wx libs getting auto imported.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-2289830227368214904?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/2289830227368214904/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=2289830227368214904' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/2289830227368214904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/2289830227368214904'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2007/02/screen-capture-with-wxwindows.html' title='Screen Capture with wxWindows'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-5783792811902517048</id><published>2007-01-24T08:03:00.000-08:00</published><updated>2007-01-24T08:08:42.367-08:00</updated><title type='text'>VJ Night</title><content type='html'>There might have been about 20 people there to watch the show. Around 8 &lt;a href="http://www.scobot.com/"&gt;VJ Scobot&lt;/a&gt; started out with his opening set, which was mostly fast edits between a few dozen clips. Some of the clips were recognizable, like from Bad Boys or Team America, others from anime sources, and some footage from marginal productions of decades ago. Something from early incarnations of 'The Rocketeer'? Scobot later explained that his software allows keying of clips to keys (and presumably effects and transitions also?).&lt;br /&gt;&lt;br /&gt;After 20-30 minutes of that the music wound down and Scobot introduced DJ Deeb, the guest &lt;a href="http://www.myspace.com/spysciencefilm"&gt;VJ Spyscience&lt;/a&gt;, and what VJ Night is all about. An interview with Spyscience followed, video taped by one from the 911 crew (though it's not clear whether the interview will ever be put on the internet or anywhere else, it's just for the archive). Spyscience used some software I forget the name of, which is also clip oriented but drag and drop along with an external USB device with sliders and knobs is used. Most of the clips where provided with the software, one he had made himself. His computer locked up a few of times and Scobot had to take control of the video for a while during rebooting.&lt;br /&gt;&lt;br /&gt;After that a Q&amp;A sessions followed, and the event was over by about 10.&lt;br /&gt;&lt;br /&gt;Overall the event was interesting, though even as Scobot admitted the traditional role of VJ work is to make a side-show, not to be shown in a theater to an audience focused directly on it. I thought the format works but that VJ sets should be a little shorter, since they can get repetitious. Another nice thing might be to have continuous split-screen, one view showing the VJ output and the other focusing on the VJ and what they're doing, although the layout of the space allows the audience to effectively look over the shoulder of the working VJ.&lt;br /&gt;&lt;br /&gt;I found my personal preference is for visuals that are the opposite of recognizable clips from tv or movies, but purely abstract instead. I'd like to see someone do a set with more live-generated visuals (rather than live-editing-plus-effects on a lot of clips).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-5783792811902517048?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.911media.org/events/vj-night.html' title='VJ Night'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/5783792811902517048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=5783792811902517048' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/5783792811902517048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/5783792811902517048'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2007/01/vj-night.html' title='VJ Night'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-50812302239064622</id><published>2007-01-10T07:38:00.000-08:00</published><updated>2008-11-09T08:55:51.068-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='gephex'/><title type='text'>Gephex</title><content type='html'>&lt;br/&gt;I created a couple of custom gephex modules (for 0.4.3):&lt;br/&gt;&lt;br/&gt;&lt;a href="http://bmillenium.sourceforge.net/average.zip"&gt;Average&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Find the average color or brightness of a framebuffer.  (maybe add HSV next)&lt;br/&gt;&lt;br/&gt;&lt;a href="http://bmillenium.sourceforge.net/zslomo.zip"&gt;Slow motion&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Play back snippets of framebuffer input in slow motion.  The music is from ccmixter, William Berry's Time To Take Out The Trash.&lt;br/&gt;&lt;br/&gt;The source code (GPLed of course) and windows dlls are provided in those zip files.  &lt;br /&gt;More custom effects are on the way. &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;New video showing off basic gephex effects:&lt;br/&gt;  &lt;br/&gt;&lt;embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=-227057027413508870&amp;hl=en" flashvars=""&gt; &lt;/embed&gt;&lt;br /&gt;&lt;br/&gt;&lt;br/&gt;...but none of those I just created.  Maybe next time.&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-50812302239064622?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.gephex.org/' title='Gephex'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/50812302239064622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=50812302239064622' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/50812302239064622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/50812302239064622'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2007/01/gephex.html' title='Gephex'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-2950823657430101236</id><published>2006-12-23T17:45:00.000-08:00</published><updated>2008-11-09T08:54:43.900-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='openscenegraph'/><title type='text'>Phoeeb Deform</title><content type='html'>Brand new video, made almost from scratch (a stock photograph from deviantart was used as a referenced and applied as a texture).&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="400" height="267"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=154893&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=154893&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="267"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/154893"&gt;Phoeeb Deform&lt;/a&gt; from &lt;a href="http://vimeo.com/user168788"&gt;binarymillenium&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;br/&gt;&lt;br/&gt;The music is from ccMixter (&lt;a href="http://ccmixter.org/media/files/vincent_vega11/6966"&gt;http://ccmixter.org/media/files/vincent_vega11/6966&lt;/a&gt;), which has supplied me with several good soundtracks for recent videos, although it can be difficult to browse the music- where's the sort by rating button?  I recall another CC music site less focused on remixing and more on original works that had more movie like soundtracks I'd like to use in the future but I forget the site.&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-2950823657430101236?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://video.google.com/videoplay?docid=8560921339420543916&amp;hl=en' title='Phoeeb Deform'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/2950823657430101236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=2950823657430101236' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/2950823657430101236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/2950823657430101236'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2006/12/phoeeb-deform.html' title='Phoeeb Deform'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-5323349115750695171</id><published>2006-11-29T13:19:00.000-08:00</published><updated>2006-12-30T21:20:40.217-08:00</updated><title type='text'>Deriving The Rocket Equation</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger2/3020/3429/1600/924079/rocket_equation.png"&gt;&lt;br /&gt;&lt;/a&gt;This is probably a job interview question somewhere. I was just thinking about it&lt;br /&gt;and decided to try it out myself, with no regard to convention beyond what is already intuitive for me.&lt;br /&gt;&lt;br /&gt;The question is, you have rocket with a certain amount of mass, some of which is fuel. The rocket consumes fuel at a constant rate in order to produce a constant thrust. If the rocket starts at time zero, how fast is it going and what is its displacement at some later time?&lt;br /&gt;&lt;br /&gt;So the lets say the fuel consumption rate is a positive number k, in units of kg/sec.&lt;br /&gt;The fueled mass of the rocket is Mo.&lt;br /&gt;Therefore the mass at a later time t is&lt;br /&gt;M(t) = Mo - kt&lt;br /&gt;&lt;br /&gt;From physics it is known that F=MA. Our F is constant, we'll just call it F, its units are kg*m/s^2. Acceleration is the thing that will change, intuitively acceleration should increase as the mass goes down as fuel is consume.&lt;br /&gt;&lt;br /&gt;A= F/M = F/M(t) = F/(Mo - kt)&lt;br /&gt;&lt;br /&gt;Looking at that equation makes sense- the denominator gets smaller therefore A goes up as time increases.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger2/3020/3429/1600/924079/rocket_equation.png"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img alt="" src="http://photos1.blogger.com/x/blogger2/3020/3429/400/583699/rocket_equation.png" border="0" /&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;So the trick to finding velocity is integrating that curve and position is found by integrating again. Easy numerically, but of course we want a nice analytical answer.&lt;br /&gt;&lt;br /&gt;I've forgotten a lot of the little tricks of calculus, which is just as well since I want to solve this as intuitively as possible anyway. The most I did lookup to remind myself was to find that the integral of 1/x is ln(x) and that ln(x/y) = ln(x) - ln(y), and that to have definite integral over a specified interval (time 0 to time t1 here) you can subtract the indefinite integral of the lower bound from the indefinite integral of the higher bound.&lt;br /&gt;&lt;br /&gt;We don't have a 1/x equation, at first glance, we have a 1/(constant- x) equation- so how do you integrate that? The trick is to make our equation into the form of 1/x.&lt;br /&gt;&lt;br /&gt;1/x backwards to our acceleration graph:&lt;br /&gt;&lt;br /&gt;So we need to reverse our graph to make it look like that and then we'll have the integral. Instead integrating with respect to time, we'll integrate with respect to (Mo-kt) and do it from the lower bound Mo-ktf (tf is the final t) to Mo (Mo - k to, to is zero so it's just Mo).&lt;br /&gt;&lt;br /&gt;So we end up with&lt;br /&gt;&lt;br /&gt;Integral of F/(Mo-kt) d(Mo-kt) = F * Integral of 1/(Mo-kt) dkt&lt;br /&gt;(since Mo does not change the interval d(Mo-kt), it drops out). Unfortunately the units of this integral is going to be kg*m/s^2 * 1/kg * kg/s * s (the units of the F times the units of the 1/ mass times the units of the k times the units of the t) = kg*m /s^2 - we want velocity not force! In order to cancel out the k in dkt inside the integral we divide F by k outside of the integral.&lt;br /&gt;&lt;br /&gt;f/k units is m/s - a velocity which we should return to later.&lt;br /&gt;&lt;br /&gt;f/k * ( ln(Mo) - ln (Mo - ktf) ) = f/k * ( ln (Mo/(Mo - ktf)) )&lt;br /&gt;&lt;br /&gt;Or if we say Mf = Mo - ktf, then v(t) = f/k * ln(Mo/M(t)).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Exhaust Velocity&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Going slight further in, we should look at what is happening in order to accelerate the rocket. Rockets operate by throwing mass out the back end at a high velocity- throwing out a little bit of mass a high velocity adds a little velocity to your rocket with a big mass- and there's an equation of momentum to show&lt;br /&gt;how those four things are related:&lt;br /&gt;&lt;br /&gt;m1 * deltaV1 = m2 * deltaV2&lt;br /&gt;&lt;br /&gt;We know we're burning m1 = k amount of fuel every second, and that since we're not doing any nuclear reactions the k amount of fuel is still there in mass form- it's just moving out the back end at high velocity. We know the mass of the rocket Mo or M(t) and its acceleration (delta-v) for that moment is a(t). So we have three of the four quantities, the delta-v of the exhaust fuel is what we want. Since the exhaust velocity doesn' t change we can just use Mo = M(0) and a(0)*1 second = F/Mo*1second (to simplify we assume that acceleration doesn't change much over 1 second).&lt;br /&gt;&lt;br /&gt;m2*deltaV2 / m1 = deltaV1&lt;br /&gt;Mo*F/Mo* 1sec / ( k * 1sec ) = deltaV1&lt;br /&gt;exhaust velocity deltaV1 = F/k - the same f/k in the above rocket equation. So instead of saying f/k we can say 'exhaust velocity'.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-5323349115750695171?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/5323349115750695171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=5323349115750695171' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/5323349115750695171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/5323349115750695171'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2006/11/deriving-rocket-equation.html' title='Deriving The Rocket Equation'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-4748958997249414249</id><published>2006-11-15T11:36:00.000-08:00</published><updated>2006-11-15T11:43:31.407-08:00</updated><title type='text'>2006 Fremont Solstice Parade Video</title><content type='html'>&lt;embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=5713436609680175087&amp;amp;hl=en" flashvars=""&gt; &lt;/embed&gt;&lt;br/&gt;&lt;br/&gt;2006 Fremont Solstice Parade highlights, held in Seattle. &lt;br/&gt;&lt;br/&gt;Gira Sol, &lt;a href="http://vamola.org/"&gt;Vamola&lt;/a&gt;, the &lt;a href="http://www.visionarydance.com/TheSolsticeParade2006.html"&gt;Billion Belly March&lt;/a&gt;, and many other groups I haven't  identified are featured in the video. (What is the group in the pyramid, or the people in the furry green outfits with drums?) &lt;br/&gt;&lt;br/&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-4748958997249414249?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://video.google.com/videoplay?docid=5713436609680175087' title='2006 Fremont Solstice Parade Video'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/4748958997249414249/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=4748958997249414249' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/4748958997249414249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/4748958997249414249'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2006/11/2006-fremont-solstice-parade-video.html' title='2006 Fremont Solstice Parade Video'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-116274593041138325</id><published>2006-11-05T08:56:00.000-08:00</published><updated>2008-11-09T08:55:12.698-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='openscenegraph'/><title type='text'>Gravity</title><content type='html'>&lt;object width="400" height="267"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=154883&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=154883&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="267"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/154883"&gt;Gravity&lt;/a&gt; from &lt;a href="http://vimeo.com/user168788"&gt;binarymillenium&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-116274593041138325?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://video.google.com/videoplay?docid=8974179347962032277' title='Gravity'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/116274593041138325/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=116274593041138325' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/116274593041138325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/116274593041138325'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2006/11/gravity.html' title='Gravity'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-116015383050183916</id><published>2006-10-06T09:55:00.000-07:00</published><updated>2006-11-15T11:36:15.986-08:00</updated><title type='text'>Googlepages Test</title><content type='html'>I'd like the columns to take up more than the current width, but I don't think it's possible.&lt;br /&gt;&lt;br /&gt;Embedding video is a little funky, when I went to three columns it had problems putting in the video in anything but the center 'main content column'.  If I can fatten up the single main column I can use the edit html to make my own columns- ideally there would be videos in a grid 3 videos wide, or at least two wide.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-116015383050183916?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://binarymillenium.googlepages.com/' title='Googlepages Test'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/116015383050183916/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=116015383050183916' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/116015383050183916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/116015383050183916'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2006/10/googlepages-test.html' title='Googlepages Test'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-115491696162659010</id><published>2006-08-06T19:13:00.000-07:00</published><updated>2006-11-15T11:36:15.851-08:00</updated><title type='text'>Jason Webley - Fremont Solstice Pageant</title><content type='html'>After the parade, there's the pageant at Gasworks park.  Jason Webley played a set:&lt;br /&gt;&lt;br /&gt;&lt;embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=-5708797236282574520&amp;hl=en"&gt; &lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-115491696162659010?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/115491696162659010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=115491696162659010' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/115491696162659010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/115491696162659010'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2006/08/jason-webley-fremont-solstice-pageant.html' title='Jason Webley - Fremont Solstice Pageant'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-115414134002585410</id><published>2006-07-28T19:32:00.000-07:00</published><updated>2006-11-15T11:36:15.753-08:00</updated><title type='text'>VamoLá band warmup</title><content type='html'>At the staging area of the Fremont Solstice Parade.&lt;br /&gt;&lt;br /&gt;&lt;embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=-617120603810378689&amp;hl=en"&gt; &lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://vamola.org/"&gt;VamoLá Drum &amp; Dance Ensemble&lt;/a&gt;&lt;br /&gt;        &lt;br /&gt;The quality of this one isn't so great because there are many people and details and wider angles in each shot.  A solitary subject against a plain background works much better on google video.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-115414134002585410?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://video.google.com/videoplay?docid=-617120603810378689&amp;hl=en' title='VamoLá band warmup'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/115414134002585410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=115414134002585410' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/115414134002585410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/115414134002585410'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2006/07/vamol-band-warmup.html' title='VamoLá band warmup'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-115242348799546247</id><published>2006-07-08T22:36:00.000-07:00</published><updated>2007-05-01T08:28:34.756-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><title type='text'>parse error at end of input</title><content type='html'>I got that error out of gcc 3.3.4 when I forgot a parentheses:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;    for (unsigned i = 0; i &lt; troops.size(); i++) {&lt;br /&gt;        if (troops[i]-&gt;active) { troops[i]-&gt;update(timestep); &lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;It gives the last line in the file as the line number, so it's not an easy one to track down.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-115242348799546247?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/115242348799546247/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=115242348799546247' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/115242348799546247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/115242348799546247'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2006/07/parse-error-at-end-of-input.html' title='parse error at end of input'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-115211170329441140</id><published>2006-07-05T07:48:00.000-07:00</published><updated>2007-05-01T08:28:11.653-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><title type='text'>DVD Chapter markers in FCP + iDVD</title><content type='html'>I finally learned how to create dvd chapters in Final Cut Pro and iDVD (at least the 2006 version).  Pressing the 'm' key, or the '`' key, or going up to the marker menu will add a mark, but you also have to make sure it adds a &lt;CHAPTER&gt; designation (anyway to do that by default?)- the easiest thing to do is press the '`' key and then the dialog that has a 'add chapter' button is right there, otherwise it takes additional steps.  &lt;br /&gt;&lt;br /&gt;iDVD, upon importing the exported video (and I think it can be exported as nearly anything in the quicktime export option and the proper markers will survive) will create a 'play movie' and also have a button for selecting chapters from a auto-generated screen full of chapters.  You can then change what picture or clip of video is shown for that submenu, but it's not frame-accurate- trying to scroll with the mouse (especially for a longer video) or pressing the left and right arrow keys usually jumps many frames forward or back.&lt;br /&gt;&lt;br /&gt;There's also the 'best quality' vs. 'best performance' option, I couldn't fit a 70 minute video with 'best performance' enabled so I had to change it from that default.  I probably wanted 'best quality' all along anyway but I didn't know about it until it complained about the length of the video under the old option.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;DVD Studio Pro&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I have tried making a video with DVD studio pro, mainly to be able to create chapters before I knew the above steps, and also because an earlier version of iDVD was not exporting the 16:9 video correctly- it would look normal widescreen for five minutes and then it squeezed the video a little so there would be black vertical bars on each side.  Strange...&lt;br /&gt;&lt;br /&gt;DVDSP isn't that hard to use, but it has a major failing for me: it can only use HD video if a HD dvd is being made.  iDVD will automatically recode most any video thrown at it, but here an additional very time consuming step is added, one has to export the video from FCP in a SD format ( I chose DV50), the 16:9 aspect ratio won't survive the export but in DVDSP there's an option to force the video back to 16:9.  But it's a huge pain to have to do that extra export.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-115211170329441140?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/115211170329441140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=115211170329441140' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/115211170329441140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/115211170329441140'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2006/07/dvd-chapter-markers-in-fcp-idvd.html' title='DVD Chapter markers in FCP + iDVD'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-115145995521423794</id><published>2006-06-27T18:56:00.000-07:00</published><updated>2007-05-01T08:27:51.381-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><title type='text'>BPDC at Folklife Video</title><content type='html'>&lt;embed style="width:400px; height:326px;" id="VideoPlayback" align="middle" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=2041767232612386026" allowScriptAccess="sameDomain" quality="best" bgcolor="#ffffff" scale="noScale" salign="TL"  FlashVars="playerMode=embedded"&gt; &lt;/embed&gt;&lt;br /&gt;        &lt;br /&gt;Breaking Point Dance Company at Seattle's 2006 Folklife.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bpdc.net/Boombox06.php"&gt;Event Flyer&lt;/a&gt; for 'Boombox' show on Friday 6/30.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-115145995521423794?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://video.google.com/videoplay?docid=2041767232612386026' title='BPDC at Folklife Video'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/115145995521423794/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=115145995521423794' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/115145995521423794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/115145995521423794'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2006/06/bpdc-at-folklife-video.html' title='BPDC at Folklife Video'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-115069532996703174</id><published>2006-06-18T21:47:00.000-07:00</published><updated>2007-05-01T08:27:37.065-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><title type='text'>Fremont Solstice Parade</title><content type='html'>I just uploaded some of my shots of the pre-parade setup area, more will be forthcoming as I find the time- I've got a few of parts of the parade and the pageant at Gasworks.  If someone were to &lt;a href="http://www.flickr.com/people/binarymillenium/"&gt;sponsor me and buy me a pro account&lt;/a&gt; that might speed things up...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/binarymillenium/170119212/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/49/170119212_93eb51b2fc.jpg" width="500" height="281" alt="dsc00033" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;On the evening of the 17th there were already hundreds of pictures uploaded to flickr of an event that occurred at noon the same day, and probably plenty more elsewhere on the net.  As digital cameras get more inexpensive and the parade become more popular the numbers of pictures made will go up in proportion.  Though if you look at the number of people with cameras, the number of them that do upload are a very small proportion- perhaps a couple of orders of magnitude difference or more- but it doesn't matter because there are so many people with cameras.  &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/binarymillenium/170119210/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/65/170119210_b2ee0ccc2d.jpg" width="394" height="500" alt="pict3156" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Is there a point where it becomes completely redundant to upload pictures, or take them at all, because if you want a picture of something you can just go online a day later and find someone else's?  And if they have a better camera, a better lens, a better eye for composition- and you feel like an ass because not only are you taking a picture but also everyone next to you also has a camera raised, what's the point, what room for uniqueness and creativity?  Of course, there's an infinity of small moments and angles and compositions, there's bound to be someone out there who values your creative effort despite the abundance of similar images available from others.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/binarymillenium/170107861/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/78/170107861_232a5ee454_m.jpg" width="180" height="240" alt="pict2996" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/binarymillenium/170116523/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/55/170116523_4dde14ba04_m.jpg" width="180" height="240" alt="pict3139_smile" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I also took video of the parade and pageant, which will make it onto google video eventually, but that takes a lot longer to do that upload a few pictures.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-115069532996703174?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/115069532996703174/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=115069532996703174' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/115069532996703174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/115069532996703174'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2006/06/fremont-solstice-parade.html' title='Fremont Solstice Parade'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-114992054541333824</id><published>2006-06-09T23:20:00.000-07:00</published><updated>2007-05-01T08:27:25.311-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><title type='text'>Short breakdancing video from Folklife</title><content type='html'>These kids were just messing around, there wasn't even any music playing.&lt;br /&gt;&lt;br /&gt;&lt;embed style="width:400px; height:326px;" id="VideoPlayback" align="middle" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=3151748688029730095" allowScriptAccess="sameDomain" quality="best" bgcolor="#ffffff" scale="noScale" wmode="window" salign="TL"  FlashVars="playerMode=embedded"&gt; &lt;/embed&gt;&lt;br /&gt;        &lt;br /&gt;Still working on getting something together from the BPDC show...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-114992054541333824?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://video.google.com/videoplay?docid=3151748688029730095' title='Short breakdancing video from Folklife'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/114992054541333824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=114992054541333824' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/114992054541333824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/114992054541333824'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2006/06/short-breakdancing-video-from-folklife.html' title='Short breakdancing video from Folklife'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-114982348079509095</id><published>2006-06-08T20:19:00.000-07:00</published><updated>2007-05-01T08:27:09.334-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><title type='text'>Mestre Curisco Capoeira Workshop</title><content type='html'>This was at the Seattle Center, Folklife 2006.  There was a probably much more impressive capoeira show later on this same evening but I was taping the Breaking Point Dance Company at a conflicting time.&lt;br /&gt;&lt;br /&gt;&lt;embed style="width: 400px; height: 326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=-1065437187267231014" allowscriptaccess="sameDomain" quality="best" bgcolor="#ffffff" scale="noScale" wmode="window" salign="TL" flashvars="playerMode=embedded" align="middle"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;The polished wood floor looks great, though most of the effect is lost due to the compression. &lt;br /&gt;&lt;br /&gt;Later on this year hopefully I'll get in touch with a local capoeira group and make something much more involved than this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-114982348079509095?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://video.google.com/videoplay?docid=-1065437187267231014' title='Mestre Curisco Capoeira Workshop'/><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/114982348079509095/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=114982348079509095' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/114982348079509095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/114982348079509095'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2006/06/mestre-curisco-capoeira-workshop.html' title='Mestre Curisco Capoeira Workshop'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-114977552805667607</id><published>2006-06-08T06:59:00.000-07:00</published><updated>2006-11-15T11:36:14.708-08:00</updated><title type='text'>osgClouds</title><content type='html'>Modified osgforest example to produce this simple cloud layer in osg:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://img23.imagevenue.com/img.php?loc=loc65&amp;image=75155_osgclouds.jpg" target=_blank&gt;&lt;img src="http://img23.imagevenue.com/loc65/th_75155_osgclouds.jpg" border="0" alt="image hosting by imagevenue.com"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;With this code (provided here under the GPL):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;void ForestTechniqueManager::createTreeList(osg::Node* terrain,const osg::Vec3&amp; origin, const osg::Vec3&amp; size,unsigned int numTreesToCreate,TreeList&amp; trees)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    float max_TreeHeight = 15*sqrtf(size.length2()/(float)numTreesToCreate);&lt;br /&gt;    float max_TreeWidth = max_TreeHeight;&lt;br /&gt;    &lt;br /&gt;    float min_TreeHeight = max_TreeHeight*0.3f;&lt;br /&gt;    float min_TreeWidth = min_TreeHeight;&lt;br /&gt;&lt;br /&gt;    trees.reserve(trees.size()+numTreesToCreate);&lt;br /&gt;&lt;br /&gt;float ceil = origin.z()+900.0f;&lt;br /&gt;float floor = origin.z()+300.0f;&lt;br /&gt;&lt;br /&gt;    for(unsigned int i=0;i&lt;numTreesToCreate;++i)&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;        Tree* tree = new Tree;&lt;br /&gt;        tree-&gt;_position.set(&lt;br /&gt;random(origin.x(),origin.x()+size.x()),&lt;br /&gt;random(origin.y(),origin.y()+size.y()),&lt;br /&gt;random(floor,ceil)&lt;br /&gt;);&lt;br /&gt;        &lt;br /&gt;float colorFactor =  (tree-&gt;_position.z()-floor)/(ceil-floor);&lt;br /&gt;colorFactor = 0.3 + colorFactor*(1.0-0.3);&lt;br /&gt;int color = (int) ((1.0 - (1.0-colorFactor)*(1.0-colorFactor) ) *255.0);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;tree-&gt;_color.set(&lt;br /&gt;color, color, color,&lt;br /&gt;255&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        tree-&gt;_width = random(min_TreeWidth,max_TreeWidth*(1.3f-colorFactor) );&lt;br /&gt;        tree-&gt;_height = random(min_TreeHeight,max_TreeHeight*(1.3f-colorFactor) );&lt;br /&gt;        tree-&gt;_type = 0;&lt;br /&gt;        &lt;br /&gt;        //if (terrain)&lt;br /&gt;        if (0)&lt;br /&gt;        {&lt;br /&gt;            osgUtil::IntersectVisitor iv;&lt;br /&gt;            osg::ref_ptr&lt;osg::LineSegment&gt; segDown = new osg::LineSegment;&lt;br /&gt;&lt;br /&gt;            segDown-&gt;set(tree-&gt;_position,tree-&gt;_position+osg::Vec3(0.0f,0.0f,size.z()));&lt;br /&gt;            iv.addLineSegment(segDown.get());&lt;br /&gt;            &lt;br /&gt;            terrain-&gt;accept(iv);&lt;br /&gt;&lt;br /&gt;            if (iv.hits())&lt;br /&gt;            {&lt;br /&gt;                osgUtil::IntersectVisitor::HitList&amp; hitList = iv.getHitList(segDown.get());&lt;br /&gt;                if (!hitList.empty())&lt;br /&gt;                {&lt;br /&gt;                    osg::Vec3 ip = hitList.front().getWorldIntersectPoint();&lt;br /&gt;                    osg::Vec3 np = hitList.front().getWorldIntersectNormal();&lt;br /&gt;                    tree-&gt;_position = ip;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        trees.push_back(tree);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-114977552805667607?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/114977552805667607/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=114977552805667607' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/114977552805667607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/114977552805667607'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2006/06/osgclouds.html' title='osgClouds'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28093388.post-114883291923643014</id><published>2006-06-04T09:08:00.000-07:00</published><updated>2006-11-15T11:36:14.557-08:00</updated><title type='text'>HDV to DVD</title><content type='html'>Exporting 1080i video from FCP is not a good idea if the video is going to going to iDVD.  iDVD doesn't deinterlace it itself even though it converts it down to standard definition.  &lt;br /&gt;&lt;br /&gt;I'm not sure about this, but I think it's best to make the sequence settings set to the resolution desired as well as selecting the right compression when exporting- this will ensure that the aspect ratios are correct and what you see in the output window is mostly correct.&lt;br /&gt;&lt;br /&gt;Of course, exporting to HDV 1080i when the source is HDV 1080i is relatively fast, any conversion is not going to be speedy.  While editing, it's best to have the timeline in the same settings as the source clips, otherwise FCP will try to convert it on the fly and give a poor quality RT preview or simply say 'unrendered'.&lt;br /&gt;&lt;br /&gt;I've ran into a few glitches with this process:  On one project, dropping the HDV 720p files into iDVD (from iLife '05) results in the proper anamorphic 16:9 'enhance for wide-screen tvs' type video.  Previewing the video in iDVD and everything looks right- the video fills the entire 16:9 preview box.  But after burning it, only the first 10 minutes or so is the proper format- although the video is still in 16:9 anamorphic, for some reason the video is squeezed horizontally by about 10%, leaving black bars on the side.  This didn't happen on an edit or transition between different timelines, just right in the middle of a continuous shot.  WTF?&lt;br /&gt;&lt;br /&gt;Another problem, perhaps related to above, is that some text I thought would be on the bottom of the screen got chopped off- this I think is because the conversion from 1080i to 720p chopped some off, or that the glitch above not only squeezes the video horizontally but also stretches it vertically and then cuts off the botton.&lt;br /&gt;&lt;br /&gt;So currently I'm googling for better processes to replace all this, one semi-promising one advises to export to DV50 at some point.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28093388-114883291923643014?l=binarymillenium.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binarymillenium.com/feeds/114883291923643014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28093388&amp;postID=114883291923643014' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/114883291923643014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28093388/posts/default/114883291923643014'/><link rel='alternate' type='text/html' href='http://binarymillenium.com/2006/06/hdv-to-dvd.html' title='HDV to DVD'/><author><name>binarymillenium</name><uri>http://www.blogger.com/profile/17419830604356775608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_apbW4BHhLTg/SMfVx8r_MJI/AAAAAAAAApY/v-xNoIbt1AA/S220/portrait-3846331.jpg'/></author><thr:total>0</thr:total></entry></feed>
