<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Chris Cowdery</title>
	<atom:link href="http://www.chriscowdery.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.chriscowdery.com</link>
	<description>Coding, Design and all things Tech</description>
	<lastBuildDate>Sat, 04 Feb 2012 01:15:30 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>CG2 Raytracer: Assignment 5</title>
		<link>http://www.chriscowdery.com/2012/02/cg2-raytracer-assignment-5/</link>
		<comments>http://www.chriscowdery.com/2012/02/cg2-raytracer-assignment-5/#comments</comments>
		<pubDate>Sat, 04 Feb 2012 01:15:30 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Computer Graphics]]></category>

		<guid isPermaLink="false">http://www.chriscowdery.com/?p=280</guid>
		<description><![CDATA[Alas, here it is! Reflections!
Good news is that I have reflections working the way I want, bad news is that I&#8217;ve incurred a lot of technical debt in the process so I&#8217;ll be working some refactoring this weekend. Truth be told, I&#8217;ve been working on it for a while (another completely codebase), but I haven&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_281" class="wp-caption aligncenter" style="width: 600px"><a rel="attachment wp-att-281" href="http://www.chriscowdery.com/2012/02/cg2-raytracer-assignment-5/week6/"><img class="size-full wp-image-281" title="Assignment 5" src="http://www.chriscowdery.com/wp-content/uploads/2012/02/week6.png" alt="" width="590" height="395" /></a><p class="wp-caption-text">Assignment 5</p></div>
<p>Alas, here it is! Reflections!</p>
<p>Good news is that I have reflections working the way I want, bad news is that I&#8217;ve incurred a lot of <a href="http://www.martinfowler.com/bliki/TechnicalDebt.html">technical debt</a> in the process so I&#8217;ll be working some refactoring this weekend. Truth be told, I&#8217;ve been working on it for a while (another completely codebase), but I haven&#8217;t had the time to devote to polish yet. I have some extra time this weekend, so I&#8217;m planning on going to town and getting the other codebase back up to speed. More to come on that soon <img src='http://www.chriscowdery.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.chriscowdery.com/2012/02/cg2-raytracer-assignment-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CG2 Raytracer Updates</title>
		<link>http://www.chriscowdery.com/2012/02/cg2-raytracer-updates/</link>
		<comments>http://www.chriscowdery.com/2012/02/cg2-raytracer-updates/#comments</comments>
		<pubDate>Sat, 04 Feb 2012 00:28:26 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.chriscowdery.com/?p=273</guid>
		<description><![CDATA[Now that the blog is back, here are some of the images I from previous milestones:


]]></description>
			<content:encoded><![CDATA[<p>Now that the blog is back, here are some of the images I from previous milestones:</p>
<div id="attachment_275" class="wp-caption aligncenter" style="width: 600px"><a rel="attachment wp-att-275" href="http://www.chriscowdery.com/2012/02/cg2-raytracer-updates/week4-2/"><img class="size-full wp-image-275" title="Week 4" src="http://www.chriscowdery.com/wp-content/uploads/2012/02/week41.png" alt="" width="590" height="395" /></a><p class="wp-caption-text">Week 4</p></div>
<p style="text-align: center;">
<p style="text-align: center;">
<div id="attachment_276" class="wp-caption aligncenter" style="width: 600px"><a rel="attachment wp-att-276" href="http://www.chriscowdery.com/2012/02/cg2-raytracer-updates/week5/"><img class="size-full wp-image-276" title="Week 5" src="http://www.chriscowdery.com/wp-content/uploads/2012/02/week5.png" alt="" width="590" height="395" /></a><p class="wp-caption-text">Week 5</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.chriscowdery.com/2012/02/cg2-raytracer-updates/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A few Updates!</title>
		<link>http://www.chriscowdery.com/2012/02/a-few-updates/</link>
		<comments>http://www.chriscowdery.com/2012/02/a-few-updates/#comments</comments>
		<pubDate>Sat, 04 Feb 2012 00:25:16 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.chriscowdery.com/?p=271</guid>
		<description><![CDATA[Hey folks!
I was encountering an issue earlier where Wordpress wasn&#8217;t letting me post updates, but alas, that&#8217;s all fixed and the site is back up and running. Whoo hoo!
In other news, I just got an apartment in Pittsburgh this past weekend, so that&#8217;s really awesome! I&#8217;ll be a mile away from Apple Pittsburgh, and it&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>Hey folks!</p>
<p>I was encountering an issue earlier where Wordpress wasn&#8217;t letting me post updates, but alas, that&#8217;s all fixed and the site is back up and running. Whoo hoo!</p>
<p>In other news, I just got an apartment in Pittsburgh this past weekend, so that&#8217;s really awesome! I&#8217;ll be a mile away from Apple Pittsburgh, and it&#8217;s in a great area of town. Here are some photos of the place (although the photos contain the current residents&#8217; things <img src='http://www.chriscowdery.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ): <a href="http://www.facebook.com/media/set/?set=a.10150496899807541.364551.505467540&amp;type=1&amp;l=9e0ef01420 ">http://www.facebook.com/media/set/?set=a.10150496899807541.364551.505467540&amp;type=1&amp;l=9e0ef01420</a></p>
<p>Also, I was named GCCIS College Delegate recently too, so I&#8217;ll be speaking at commencement! I&#8217;m really excited about this and it&#8217;s really huge. I can&#8217;t wait!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chriscowdery.com/2012/02/a-few-updates/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CG2 Raytracer – Checkpoint 2 &#8220;Not What You Expected&#8221;</title>
		<link>http://www.chriscowdery.com/2011/12/cg2-raytracer-checkpoint-2/</link>
		<comments>http://www.chriscowdery.com/2011/12/cg2-raytracer-checkpoint-2/#comments</comments>
		<pubDate>Fri, 16 Dec 2011 10:23:16 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Computer Graphics]]></category>

		<guid isPermaLink="false">http://www.chriscowdery.com/?p=260</guid>
		<description><![CDATA[Checkpoint #2 &#8211; Release Name: &#8220;Not What You Expected&#8221; (http://dl.dropbox.com/u/113994/silly/gifs/J5kTJ.gif)
Remember how last week&#8217;s ray tracer was in OpenGL and GLUT? Boy, that was a mistake. Although I got the end result I was hoping for, I really shot myself in the foot for future increments. The primary reason for this was that I was attacking [...]]]></description>
			<content:encoded><![CDATA[<p>Checkpoint #2 &#8211; Release Name: <strong>&#8220;Not What You Expected&#8221; </strong>(<a href="http://dl.dropbox.com/u/113994/silly/gifs/J5kTJ.gif" target="_blank">http://dl.dropbox.com/u/113994/silly/gifs/J5kTJ.gif</a>)</p>
<p>Remember how last week&#8217;s ray tracer was in OpenGL and GLUT? Boy, that was a mistake. Although I got the end result I was hoping for, I really shot myself in the foot for future increments. The primary reason for this was that I was attacking the problem the wrong way. Although I was able to rasterize an end result that looked visually correct, it relied on the OpenGL and GLUT calls to rasterize the end result, and I found myself having to write some janky and nefarious workarounds to make it work with GLUT that just (for lack of a better phrase) made me feel dirty.</p>
<p>So, on Tuesday night I decided something had to go and scrapped <strong>everything</strong> and began anew. This time, I&#8217;m taking the high road and writing everything from scratch in C++. This release has its own geometry classes (CGRay, CG3DPoint, CG3DVector, CGNormal, CGMatrix, etc.) and all that business is happening in an O-O way.</p>
<p>I’m happy with how it’s coming together now, and the design I’m very satisfied with. Moreover, the extra push I had to get this release working The Right Way™ will help grease the skids in the future.</p>
<p>Here’s a couple other improvements which I feel will help me in the future:</p>
<ul>
<li>The scene is now centered at the camera at 0,0,0. Now everything can be positioned relative to the camera in absolute space, which gives me some cleaner numbers to work with when manipulating objects.</li>
<li>Ability to do supersampling.</li>
</ul>
<p>Here’s the default output image:</p>
<p><a rel="attachment wp-att-261" href="http://www.chriscowdery.com/2011/12/cg2-raytracer-checkpoint-2/noss/"><img class="aligncenter size-medium wp-image-261" title="noss" src="http://www.chriscowdery.com/wp-content/uploads/2011/12/noss-590x395.png" alt="" width="590" height="395" /></a></p>
<p>Here’s a supersampled image, notice that it looks a little bit crisper (look closely):</p>
<p><a rel="attachment wp-att-262" href="http://www.chriscowdery.com/2011/12/cg2-raytracer-checkpoint-2/ss/"><img class="aligncenter size-medium wp-image-262" title="ss" src="http://www.chriscowdery.com/wp-content/uploads/2011/12/ss-590x395.png" alt="" width="590" height="395" /></a></p>
<p>I did not have time to add an extra object type for this release due to time constraints, but I’ll be working on that in the future, perhaps in terms of an .obj or .dae loader.</p>
<p>I’m also looking into deferring some of the processing to the GPU (CUDA) to increase rendering performance, and I plan to look at that over the break. I’ve installed the SDK and I’m dabbling with that now, and I hope to have some elements of GPU-accelerated rendering for the next release.</p>
<p>At any rate, there&#8217;s lots of cool stuff happening under the hood! Take a look:</p>
<p><a rel="attachment wp-att-268" href="http://www.chriscowdery.com/2011/12/cg2-raytracer-checkpoint-2/class-diagram2/"><img class="aligncenter size-medium wp-image-268" title="Class Diagram2" src="http://www.chriscowdery.com/wp-content/uploads/2011/12/Class-Diagram2-590x506.jpg" alt="" width="590" height="506" /></a></p>
<p><em>For simplification purposes, a CGShape is an abstract class that (at this point) is either a CGSphere or CGRect.</em></p>
<p>There&#8217;s lots left to do though, so I&#8217;m going to capitalize on the break to get some extra polish done on the ray tracer. So far this scene rendered in 0.5 seconds. Not too bad, but I think I can do better!</p>
<p>PS: Every release I have for personal software projects is accompanied by a tagline and a silly image. This release was called “Not What You Expected” because my previous release ultimately had to be thrown out &#8211; something I most certainly didn&#8217;t expect <img src='http://www.chriscowdery.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.chriscowdery.com/2011/12/cg2-raytracer-checkpoint-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CG2 Raytracer &#8211; Checkpoint 1</title>
		<link>http://www.chriscowdery.com/2011/12/cg2-raytracer-checkpoint-1/</link>
		<comments>http://www.chriscowdery.com/2011/12/cg2-raytracer-checkpoint-1/#comments</comments>
		<pubDate>Tue, 06 Dec 2011 10:41:46 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Computer Graphics]]></category>

		<guid isPermaLink="false">http://www.chriscowdery.com/?p=226</guid>
		<description><![CDATA[In the following weeks to come I&#8217;ll be posting my progress in RIT&#8217;s Computer Graphics II class with Professor Bailey. It&#8217;s required to blog about our work as it evolves, and this seemed like an excellent venue! So, without further ado:

Setting up the Scene
In this assignment I began my recreation of Turner Whitted&#8217;s famous ray [...]]]></description>
			<content:encoded><![CDATA[<p>In the following weeks to come I&#8217;ll be posting my progress in RIT&#8217;s Computer Graphics II class with Professor Bailey. It&#8217;s required to blog about our work as it evolves, and this seemed like an excellent venue! So, without further ado:</p>
<p><a rel="attachment wp-att-236" href="http://www.chriscowdery.com/2011/12/cg2-raytracer-checkpoint-1/screen-shot-2011-12-07-at-5-37-18-am/"><img class="aligncenter size-medium wp-image-236" title="Screen Shot 2011-12-07 at 5.37.18 AM" src="http://www.chriscowdery.com/wp-content/uploads/2011/12/Screen-Shot-2011-12-07-at-5.37.18-AM-590x395.png" alt="" width="590" height="395" /></a></p>
<h1>Setting up the Scene</h1>
<p>In this assignment I began my recreation of Turner Whitted&#8217;s famous ray tracer published in his 1980 paper. The assignment was relatively straightforward, but the majority of my time was spent getting the objects to appear as they did in Whitted&#8217;s paper. The image I am trying to replicate looks like this:</p>
<p><a rel="attachment wp-att-228" href="http://www.chriscowdery.com/2011/12/cg2-raytracer-checkpoint-1/whitted-scene/"><img class="aligncenter size-full wp-image-228" title="whitted-scene" src="http://www.chriscowdery.com/wp-content/uploads/2011/12/whitted-scene.jpg" alt="" width="380" height="227" /></a></p>
<p>So, as far as the objects are concerned and the position of the objects&#8230; not too bad! Here are the parameters I used to generate the scene:</p>
<ul>
<li><strong><em>Size and location of two spheres: </em></strong>
<ul>
<li><strong>Big Sphere (foreground)</strong>
<ul>
<li>X: -1.83</li>
<li>Y: 1.1</li>
<li>Z: 8.3</li>
<li>Size: 1.0</li>
</ul>
</li>
<li><strong>Small Sphere (background)</strong>
<ul>
<li>X: -0.83</li>
<li>Y: 0.35</li>
<li>Z: 7.55</li>
<li>Size: 1.0</li>
</ul>
</li>
</ul>
</li>
<li><strong><em>The size and location of the floor (conveyed by locations of vertices): </em></strong>
<ul>
<li><strong>Vertex1 </strong>
<ul>
<li>X: -3.0</li>
<li>Y: 0.0</li>
<li>Z: 10.0</li>
</ul>
</li>
<li><strong>Vertex2 </strong>
<ul>
<li>X: 3.0</li>
<li>Y: 0.0</li>
<li>Z: 10.0</li>
</ul>
</li>
<li><strong>Vertex3 </strong>
<ul>
<li>X: 3.0</li>
<li>Y: 0.0</li>
<li>Z: 0.0</li>
</ul>
</li>
<li><strong>Vertex4 </strong>
<ul>
<li>X: -3.0</li>
<li>Y: 0.0</li>
<li>Z: 0.0</li>
</ul>
</li>
</ul>
</li>
<li><strong><em>The location and parameters of your light source: </em></strong>
<ul>
<li>X: -1.5</li>
<li>Y: 9.0</li>
<li>Z: -10.0</li>
</ul>
</li>
<li><strong><em>The location and &#8220;lookat&#8221; of your camera: </em></strong>
<ul>
<li><strong>Eye </strong>
<ul>
<li>X:  -1.65</li>
<li>Y: 0.9</li>
<li>Z: 11.2</li>
</ul>
</li>
<li><strong>Center </strong>
<ul>
<li>X: -1.675</li>
<li>Y: -0.005</li>
<li>Z: 0.65</li>
</ul>
</li>
<li><strong>Up </strong>
<ul>
<li>X: 0.0</li>
<li>Y: 1.0</li>
<li>Z: 0.0</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.chriscowdery.com/2011/12/cg2-raytracer-checkpoint-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fun with CV</title>
		<link>http://www.chriscowdery.com/2011/04/fun-with-cv/</link>
		<comments>http://www.chriscowdery.com/2011/04/fun-with-cv/#comments</comments>
		<pubDate>Sun, 10 Apr 2011 15:21:26 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Computer Vision]]></category>
		<category><![CDATA[Talks]]></category>

		<guid isPermaLink="false">http://www.chriscowdery.com/?p=217</guid>
		<description><![CDATA[In keeping with my recent computer vision kick, I thought it would be good fun to have an SSE Tech Talk on the basics of computer vision and how you can use it in projects.
The talk went over very well and afterwards we all made a bacon detector, and had some fun with optical flow.

The [...]]]></description>
			<content:encoded><![CDATA[<p>In keeping with my recent computer vision kick, I thought it would be good fun to have an <a href="http://sse.se.rit.edu/programs/tech-talks/?searchterm=tech%20talks" target="_blank">SSE Tech Talk</a> on the basics of computer vision and how you can use it in projects.</p>
<p>The talk went over very well and afterwards we all made a bacon detector, and had some fun with optical flow.</p>
<p style="text-align: center;"><img class=" aligncenter" title="Bacon Detector" src="http://chriscowdery.com/assets/img/bacon-detector.png" alt="" width="499" height="255" /></p>
<p>The slide deck is available <a href="http://chriscowdery.com/talks/cv/fun-with-cv.pdf" target="_blank">here</a> [PDF] if you&#8217;d like to see it. Thanks to everyone who came!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chriscowdery.com/2011/04/fun-with-cv/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>APHOG: Computer Vision Research</title>
		<link>http://www.chriscowdery.com/2011/04/aphog-computer-vision-research/</link>
		<comments>http://www.chriscowdery.com/2011/04/aphog-computer-vision-research/#comments</comments>
		<pubDate>Fri, 08 Apr 2011 20:22:43 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Computer Vision]]></category>

		<guid isPermaLink="false">http://www.chriscowdery.com/?p=211</guid>
		<description><![CDATA[This winter I was very busy doing some research on pedestrian detection for my Advanced Computer Vision course at RIT. During this course my teammates and I created a really nifty way of doing complex object detection &#8211; by combining both holistic and parts-based paradigms into a single paradigm: APHOG or Assisted Pyramid Histogram of [...]]]></description>
			<content:encoded><![CDATA[<p>This winter I was very busy doing some research on pedestrian detection for my <a href="http://www.cs.rit.edu/~rsg/AdvancedComputerVision2010_2.html" target="_blank">Advanced Computer Vision</a> course at RIT. During this course my teammates and I created a really nifty way of doing complex object detection &#8211; by combining both holistic and parts-based paradigms into a single paradigm: APHOG or <strong>A</strong>ssisted <strong>P</strong>yramid <strong>H</strong>istogram of <strong>O</strong>riented <strong>G</strong>radients.</p>
<p>The primary notion behind APHOG is that it first does a coarse-grained parts-based detection to suggest possible areas of interest. In this case, we were searching for hands, torsos, faces, etc.</p>
<p>Once the algorithm finds an area that had these features, the algorithm knew (approximately) where a body would be in relation to the feature found. For example, if a head was found, the body likely be below the detected head.</p>
<div class="wp-caption aligncenter" style="width: 553px"><img title="APHOG" src="http://chriscowdery.com/docs/aphog.png" alt="" width="543" height="361" /><p class="wp-caption-text">APHOG detecting the possible features of pedestrians (red bounding boxes) and suggesting possible areas of pedestrians (blue bounding boxes)</p></div>
<p>This allows the the algorithm to perform a full holistic detection (using a series of <a href="http://en.wikipedia.org/wiki/Histogram_of_oriented_gradients" target="_blank">Histogram of Oriented Gradients</a> &#8211; referred to as the &#8220;pyramid&#8221;) in designated areas of interest &#8211; which is a huge performance (and accuracy) win. We feel that it is an improvement over conventional holistic algorithms that scan the entire frame at many zoom levels and parts-based detections that have to run complex logic to determine if the geometry of detected features are connected in such a way that could be a human shape.</p>
<p>If you&#8217;re curious to see more how it works and the gory details (and see it in action), please see the links below!</p>
<ul>
<li><a href="http://chriscowdery.com/docs/cv-finalpres.key.pdf" target="_blank">Final Presentation</a> [PDF]</li>
<li><a href="http://chriscowdery.com/docs/cv-paper.pdf">Research Paper</a> [PDF]</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.chriscowdery.com/2011/04/aphog-computer-vision-research/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iOS Tech Talk</title>
		<link>http://www.chriscowdery.com/2010/10/ios-tech-talk/</link>
		<comments>http://www.chriscowdery.com/2010/10/ios-tech-talk/#comments</comments>
		<pubDate>Sat, 16 Oct 2010 06:09:28 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://www.chriscowdery.com/?p=195</guid>
		<description><![CDATA[
The iOS Tech Talk this past Thursday was a smash hit! Not only did the lab overflow with people, we covered a lot of ground with Objective-C, Xcode, Interface Builder, Cocoa Touch and parts of the iOS SDK.
Bittersweet news is that the room was so packed we couldn&#8217;t squeeze a video camera in there. So [...]]]></description>
			<content:encoded><![CDATA[<div>
<p>The iOS Tech Talk this past Thursday was a smash hit! Not only did the lab overflow with people, we covered a <strong>lot</strong> of ground with Objective-C, Xcode, Interface Builder, Cocoa Touch and parts of the iOS SDK.</p>
<p>Bittersweet news is that the room was <em>so packed</em> we couldn&#8217;t squeeze a video camera in there. So the best I can offer everyone is the slide deck as well as the sample code we wrote together. I have both an annotated version of the slides with my speaker notes, as well as a pure image form. Links for these items are at the bottom of this post.</p>
<p>However, since there was so much interest, I plan to host a series of <a href="http://sse.se.rit.edu/programs/crash-courses" target="_blank">Crash Courses</a> on advanced topics in iOS as well as OS X programming such as <a href="http://www.apple.com/macosx/technology/#grandcentral" target="_blank">Grand Central Dispatch</a>, multitouch gestures, <a href="http://www.khronos.org/opengles/" target="_blank">OpenGL ES</a>, consuming network services and <strong>many</strong> more. More to come on this development soon, but if you&#8217;re interested in taking a Crash Course, please indicate what you&#8217;re interested in at the <a href="https://spreadsheets.google.com/viewform?formkey=dDBmOG5LQnZmNzFBOFllTjlkTkhvOWc6MQ" target="_blank">form located here</a>.</p>
<p>Also, as promised, for those of you looking for more information</p>
<div id="_mcePaste">
<ul>
<li><strong>Pages</strong>
<ul>
<li><a href="http://developer.apple.com/library/ios/navigation/index.html?section=Resource+Types&amp;topic=Getting+Started" target="_blank">iOS Getting Started</a></li>
<li><a href="http://developer.apple.com/library/ios/navigation/index.html" target="_blank">iOS Reference Library</a> (useful when you want to learn more about one particular thing)</li>
<li><a href="http://cocoadevcentral.com/" target="_blank">Cocoa Dev Central</a></li>
</ul>
</li>
</ul>
</div>
<div id="_mcePaste">
<ul>
<li><strong>Books</strong>
<ul>
<li><a href="http://www.amazon.com/Cocoa-Programming-Mac-OS-3rd/dp/0321503619" target="_blank">Cocoa Programming for Mac OS X</a></li>
<li><a href="http://www.amazon.com/iPhone-Developers-Cookbook-Building-Applications/dp/0321659570/ref=sr_1_1?ie=UTF8&amp;qid=1287151732&amp;sr=8-1" target="_blank">iPhone Developers Cookbook</a></li>
</ul>
</li>
</ul>
</div>
<p>And as always, if you have any questions or feedback, please don&#8217;t hesitate to let me know. Thanks for everyone who came and made the night a great success!</p>
<h4>Downloads</h4>
<p><a href="http://chriscowdery.com/talks/ios/goodies/The%20Freaking%20Weather.zip">Source Code</a><br />
<a href="http://chriscowdery.com/talks/ios/goodies/iOS%20Zero%20to%20Sixty%20with%20Notes.pdf">Slides with Notes</a><br />
<a href="http://chriscowdery.com/talks/ios/goodies/iOS%20Zero%20to%20Sixty.pdf">Plain Slides</a></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.chriscowdery.com/2010/10/ios-tech-talk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fun with Computer Vision</title>
		<link>http://www.chriscowdery.com/2010/06/fun-with-computer-vision/</link>
		<comments>http://www.chriscowdery.com/2010/06/fun-with-computer-vision/#comments</comments>
		<pubDate>Sun, 27 Jun 2010 22:35:06 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Computer Vision]]></category>

		<guid isPermaLink="false">http://www.chriscowdery.com/?p=179</guid>
		<description><![CDATA[One of my early projects in Computer Vision was a simple Optical Character Recognition (OCR) program. Although this is by no means anything new, it&#8217;s still fun to learn how it works, and I&#8217;m going to share with you a little demo of OCR that you can create yourself!
Your mission, should you choose to accept it: Detect [...]]]></description>
			<content:encoded><![CDATA[<p>One of my early projects in Computer Vision was a simple <a href="http://en.wikipedia.org/wiki/Optical_character_recognition" target="_blank">Optical Character Recognition</a> (OCR) program. Although this is by no means anything new, it&#8217;s still fun to learn how it works, and I&#8217;m going to share with you a little demo of OCR that you can create yourself!</p>
<p>Your mission, should you choose to accept it: <strong>Detect all the letter i&#8217;s on a document!</strong></p>
<p>Couple of things to note:</p>
<ul>
<li>Not all of the letter i&#8217;s will look the same (there will be some blotches of ink that make the letters look a little different)</li>
<li>You won&#8217;t have knowledge of what every single letter i looks like (or ever will look like) in the universe</li>
<li>You won&#8217;t have to recognize handwriting (that&#8217;s another party in and of itself)</li>
</ul>
<p>So let&#8217;s get started! We&#8217;ll be using the following document for our character detection:</p>
<p><a rel="attachment wp-att-180" href="http://www.chriscowdery.com/posts/179/textimage"><img class="aligncenter size-medium wp-image-180" title="TextImage" src="http://www.chriscowdery.com/wp-content/uploads/2010/06/TextImage-590x514.png" alt="" width="590" height="514" /></a></p>
<p>First, we can break the problem down into a bunch of subtasks, namely:</p>
<div id="_mcePaste">
<ol>
<li>Manipulating the data to make a solution easier for the program to visualize.</li>
<li>Cropping the image to the area of interest (getting rid of the image and handwriting above).</li>
<li>Finding and extracting ‘templates’, regions of the image which contain the ‘i’s we’re looking for.</li>
<li>Determining the locations of each row of text.</li>
<li>Correlating the template of the i character with each possible character.</li>
<li>Determining thresholds for each of the templates (the &#8216;bouncer&#8217; which determines if a character is really an i or not).</li>
<li>Displaying the results with the rectangles around each i.</li>
</ol>
</div>
<p>So let&#8217;s get started! I&#8217;ll be using <a href="http://www.mathworks.com/products/matlab/" target="_blank">MATLAB</a> and the <a href="http://www.mathworks.com/products/image/" target="_blank">Image Processing Toolbox</a> for my implementation in this post, but I&#8217;ll also attach a script which accomplishes the same results using Python.</p>
<h2>Manipulating the Data</h2>
<p>First things first, we need to read in our image. We&#8217;ll do that as follows:</p>
<blockquote><p>im = imread(&#8216;TextImage.tif&#8217;);<br />
im = im2double(im);</p></blockquote>
<p>This reads in the TextImage.tif image as a grayscale image,  and assigns each pixel to an intensity between 0 and 1 inclusive. However, we&#8217;re not quite done yet. By convention, data of interest is represented as white (all 1&#8217;s), and data which isn&#8217;t of interest being black (all 0&#8217;s) &#8211; so we&#8217;ll want to invert our image to show that the black text we just read in is of interest (e.g. white) we&#8217;ll do that as follows:</p>
<blockquote><p>im = imadjust(im, [0 1],[1 0]);</p></blockquote>
<div>This effectively says &#8220;Hey, what&#8217;s black is white, and what&#8217;s white is black!&#8221;. Pretty concise and nifty.</div>
<div>But wait! We&#8217;re not quite done yet. We need to do some <strong>thresholding</strong> of the data which we have so far. This process defines a &#8216;cut off&#8217; in that anything that is above (or equal to) the value we specify is scaled automatically to its maximum value, and anything below it is scaled automatically to its minimum value. In this case, our pixels will either go to 1 or 0 (as this is the range of our data). We&#8217;re doing this step to eliminate the paper grain, noise, and other image artifacts that aren&#8217;t of interest.</div>
<div>Thresholding values are usually determined after some experimentation and some number fiddling, but I found a good threshold for this document was <strong>0.05</strong>. We can apply it like so:</div>
<blockquote>
<div>THRESHOLD = 0.05;</div>
<div>im = im &gt; THRESHOLD;</div>
</blockquote>
<h2>Cropping the Image</h2>
<p>Although this is not an essential step, and the algorithm which we&#8217;ll be implementing soon will function fine without it, we&#8217;re going to restrict the area which we&#8217;ll be looking at. This helps for visualization in the end, and can be accomplished pretty quickly.</p>
<blockquote><p>im = im(400:end,:);</p></blockquote>
<p>This line of code cuts off everything above 400px, and leaves the rest of our image intact (end MATLAB knows means &#8220;go to the end of the image&#8221;, it&#8217;s not a variable we set earlier).</p>
<h2>Finding Templates</h2>
<p>The next goal we&#8217;ll have is to extract i&#8217;s from the image above that are of interest to us (computer vision junkies call these &#8216;templates&#8217;). I usually open up Adobe Photoshop and manually select areas which are of interest, and copy and paste the pixel coordinates. It&#8217;s important to note that we&#8217;re &#8216;cheating&#8217; on some level as we have a priori knowledge of what our document already looks like &#8211; a luxury which many commercial OCR software systems don&#8217;t often have <img src='http://www.chriscowdery.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Alas, I&#8217;ve taken some of the dirty work out for you, and found some i&#8217;s which are indicative of i&#8217;s across the entire document. Here&#8217;s my findings:</p>
<blockquote><p>templateOne = im(510:542, 532:551);<br />
templateOne = im2double(templateOne);</p>
<p>templateTwo = im(68:100, 390:409);<br />
templateTwo = im2double(templateTwo);</p>
<p>templateThree = im(266:298, 899:918);<br />
templateThree = im2double(templateThree);</p>
<p>templateFour = im(67:99, 144:163);<br />
templateFour = im2double(templateFour);</p>
<p>templateFive = im(168:200, 875:894);<br />
templateFive = im2double(templateFive);</p></blockquote>
<p>So we now have five templates (patches of the letter i in the image), each template is 19 pixels wide and 32 pixels tall. Now we&#8217;re going to combine all of them into an array for easy access later.</p>
<blockquote><p>templates(:,:,1) = templateOne;<br />
templates(:,:,2) = templateTwo;<br />
templates(:,:,3) = templateThree;<br />
templates(:,:,4) = templateFour;<br />
templates(:,:,5) = templateFive;</p></blockquote>
<p>This creates a three dimensional array. In the first two dimensions, we store the grayscale intensity (again from 0 to 1 inclusive) of the templates we found. Each index in the third dimension represents another template (The colon (:) operator in MATLAB is shorthand for &#8220;include everything&#8221;). So imagine a cardboard box stacked with a bunch of sheets of paper of the letter i on them, roughly speaking.</p>
<h2>Finding the rows of text</h2>
<p>Here&#8217;s some fun debauchery. We need to detect where each row of text  begins so that we know where we can match our templates to, and this can be accomplished fairly quickly.</p>
<p>First, what we need to do is rotate the image 90 degrees (put it on its side), and add up the pixel values in each <em>column. </em>Note that now that the image is rotated 90 degrees, what used to be <em>rows are now columns</em>. We&#8217;re rotating the image 90 degrees as it plays nicer with MATLAB&#8217;s sum function (only adds up columns). We&#8217;ll then be storing this in an array called spaces.</p>
<blockquote><p>spaces = sum(im&#8217;);</p></blockquote>
<p>Next, we need to determine (another) threshold, the intensity of what each row of text should be when summed up. If the sum of each row doesn&#8217;t match a threshold, there probably isn&#8217;t text there, so it&#8217;s not the beginning of a row. We can threshold the row sums by doing the following:</p>
<blockquote><p>ROW_SPACE_THRESHOLD = 10;<br />
spaces = spaces &gt; (ROW_SPACE_THRESHOLD);</p></blockquote>
<p>Now let&#8217;s detect <em>where</em> changes occur by taking the derivative of spaces. This highlights where values changed from 0 to 1 and vice versa. Begins stores where each row begins (derivative is 1), and ends stores where each row ends (derivative is -1).</p>
<blockquote><p>spaceDerivative = diff(spaces);<br />
begins = find(spaceDerivative == 1);<br />
ends = find(spaceDerivative == -1);</p></blockquote>
<h2>Correlating the template</h2>
<p>Before we sink our teeth into the meat of the OCR, we first need to define thresholds for each character template we found. Roughly speaking, this is the amount of &#8217;slack&#8217; we&#8217;ll give to each character we find. If it&#8217;s within this &#8217;slack&#8217; region, the program will think the character we found is an i, otherwise it won&#8217;t be. This is useful as we&#8217;ll never know what every single i looks like (and even if we did, that algorithm would be extremely inefficient), so this defines a level of tolerance in how much a character we are analyzing can deviate from our templates of the letter i to actually be considered the letter i. We&#8217;ll be definining these using integer constants determined by experimentation.</p>
<blockquote><p>MAX_FILTERED_I_VALUES = [ 145, 147, 147, 170, 150 ];</p></blockquote>
<p>Each index of the MAX_FILTERED_I_VALUES corresponds to the tolerance for each template (e.g. the first number corresponds to the first template, and so on). The meaning and purpose of these templates will be explored in greater detail very soon.</p>
<p>Now! This is where the fun starts. First we&#8217;re going to want to iterate through each row we found. We can do that like so:</p>
<blockquote><p>for i = 1 : (min([length(begins) length(ends)])),</p></blockquote>
<p>Next we&#8217;re going to want to extract each row, and then shortly thereafter each character from each row.  We can get the current row this way:</p>
<blockquote><p>currentRow = im(begins(i):ends(i),:);</p></blockquote>
<p>This says, &#8220;hey for this particular row number (index), we only care about pixels from whatever you found from the beginning to the end&#8221;. Now we need to find the spaces in between the characters:</p>
<blockquote><p>row_spaces = sum(currentRow);<br />
row_spaces = row_spaces &gt; 0.8;<br />
row_diff = diff(row_spaces);</p>
<p>charBegin = find(row_diff == 1);<br />
charEnd = find(row_diff == -1);</p></blockquote>
<p>This is a similar approach to what we did before, in that we&#8217;re taking this row of text we found, checking to see if it matches a threshold (which I found by experimentation for you) in each column to see if there&#8217;s actually text there, and then taking the derivative of that threshold to see where each character begins and ends.</p>
<p>Now let&#8217;s loop through each character we found:</p>
<blockquote><p>for j = 1 : min([length(charEnd) length(charBegin)]),</p></blockquote>
<p>Let&#8217;s get things set up for processing:</p>
<blockquote><p>currentChar = currentRow(:,charBegin(j):charEnd(j));<br />
currentChar = im2double(currentChar);</p>
<p>possibleMach = 0;</p></blockquote>
<p>In the above code, we&#8217;re segmenting the character from the image and converting its intensity to a double (why we&#8217;re doing this will be explained soon). We&#8217;re also creating a flag called possibleMatch to determine if we&#8217;ve actually found something that is likely to be an i.</p>
<p>Now for each character we found, iterate through the templates we extracted earlier to see if there&#8217;s a match. Enjoy your <a href="http://en.wikipedia.org/wiki/Big_O_notation" target="_blank">O(n^3) efficiency</a> <img src='http://www.chriscowdery.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . We can iterate through each template this way (again, this is MATLAB shorthand for: every item in templates, take whatever&#8217;s in the third dimension &#8211; which is where we stored the index of our templates).</p>
<blockquote><p>for k = 1 : length(templates(1,1,:)),</p></blockquote>
<p>And we can correlate our above character with the template this way:</p>
<blockquote><p>filtered = abs(imfilter(currentChar,templates(:,:,k),&#8217;corr&#8217;));<br />
possibleMach = max(filtered(:)) &gt; MAX_FILTERED_I_VALUES(k);</p></blockquote>
<p>This is where the magic happens! Let&#8217;s break apart what we&#8217;re doing here:</p>
<p>In the first lone of code, we do something called a correlation (specified by the &#8216;corr&#8217; string to MATLAB). The correlation operation multiplies each pixel in the neighborhood by the corresponding pixel in the template. The output values (in a Cartesian x,y plane) are a sum of the results. The output value will be the highest at points where the template closely matches. If the value is determined to be a possible match by matching a constant threshold (MAX_FILTERED_I_VALUES), then we have a match.</p>
<p>In other words, the  correlation number returned from the imfilter function is (roughly speaking) a score of how closely the character we just found matches a possible template, and if the correlation value we found is greater than the threshold which we set earlier in MAX_FILTERED_I_VALUES, we&#8217;ve got a match!</p>
<h2>Displaying the Results</h2>
<p>The party is over, and now it&#8217;s time to clean up.  So if we&#8217;ve found a possible match, draw a red rectangle around it:</p>
<blockquote><p>if (possibleMach)</p>
<p>% Draw a red box around each character matching</p>
<p>finalRGB(begins(i):ends(i),charBegin(j),1) = 1.0;<br />
finalRGB(begins(i):ends(i),charBegin(j),2) = 0.0;<br />
finalRGB(begins(i):ends(i),charBegin(j),3) = 0.0;</p>
<p>finalRGB(begins(i):ends(i),charEnd(j),1) = 1.0;<br />
finalRGB(begins(i):ends(i),charEnd(j),2) = 0.0;<br />
finalRGB(begins(i):ends(i),charEnd(j),3) = 0.0;</p>
<p>finalRGB(begins(i),charBegin(j):charEnd(j),1) = 1.0;<br />
finalRGB(begins(i),charBegin(j):charEnd(j),2) = 0.0;<br />
finalRGB(begins(i),charBegin(j):charEnd(j),3) = 0.0;</p>
<p>finalRGB(ends(i),charBegin(j):charEnd(j),1) = 1.0;<br />
finalRGB(ends(i),charBegin(j):charEnd(j),2) = 0.0;<br />
finalRGB(ends(i),charBegin(j):charEnd(j),3) = 0.0;</p>
<p>break;<br />
end</p></blockquote>
<p>We draw a red rectangle by setting the red intensity (By MATLAB, 1st index in the third dimension of the image) to be 1 (all the way) and setting green and blue to be zero.</p>
<p><strong>We&#8217;re done! </strong>Our final product now looks like this:</p>
<p><a rel="attachment wp-att-181" href="http://www.chriscowdery.com/posts/179/screen-shot-2010-04-14-at-7-54-49-pm"><img class="aligncenter size-medium wp-image-181" title="Screen shot 2010-04-14 at 7.54.49 PM" src="http://www.chriscowdery.com/wp-content/uploads/2010/06/Screen-shot-2010-04-14-at-7.54.49-PM-590x316.png" alt="" width="590" height="316" /></a></p>
<p><strong>If you&#8217;d like to download the example source code, it can be found here:<br />
<a href="http://chriscowdery.com/download/blog/ocr-fun.zip">http://chriscowdery.com/download/blog/ocr-fun.zip</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.chriscowdery.com/2010/06/fun-with-computer-vision/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Seekqr</title>
		<link>http://www.chriscowdery.com/2010/06/seekqr/</link>
		<comments>http://www.chriscowdery.com/2010/06/seekqr/#comments</comments>
		<pubDate>Sun, 27 Jun 2010 08:22:26 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.chriscowdery.com/?p=173</guid>
		<description><![CDATA[Seekqr is a year-long project I started with Sean Madden, Sherman Lee and Brian Murphy for an entry into the Student Contest in Software Engineering (SCORE) 2011 competition (specifically the &#8220;QR Marks the Spot&#8221; project division). The project was initially started to showcase usability principles in cross-platform mobile application for the Engineering Methods of Software [...]]]></description>
			<content:encoded><![CDATA[<p>Seekqr is a year-long project I started with Sean Madden, Sherman Lee and Brian Murphy for an entry into the <a href="http://score-contest.org/2011/">Student Contest in Software Engineering (SCORE)</a> 2011 competition (specifically the <a href="http://score-contest.org/2011/Projects.php#cavrakorlic">&#8220;QR Marks the Spot&#8221; project division</a>). The project was initially started to showcase usability principles in cross-platform mobile application for the Engineering Methods of Software Usability (SE444) course, but has been extended to the competition.</p>
<p>Two months ago we had our first milestone release, and so far we&#8217;re really pleased with how the project has come together so far. We&#8217;ve got a lot up our sleeves, so stay tuned!</p>
<p><strong>
<p>If you&#8217;re interested, here&#8217;s an excerpt from our initial blog post:</p>
<p></strong></p>
<p><strong>Hey and welcome to the dev blog of </strong><a href="http://xkcd.com/327/" target="_blank"><span style="color: #000000;"><strong>&#8216;</strong></span></a><strong>; DROP TABLE Students; &#8211;!</strong></p>
<p>Here you&#8217;ll be able to find posts relevant to our discoveries, hardships, findings and more as we carry forward with the development of our QR Code Game Framework for the <a href="http://score-contest.org/2011/" target="_blank"><span style="color: #000000;">2011 SCORE Contest</span></a>; spewe&#8217;ll be working on the <a href="http://score-contest.org/2011/Projects.php#cavrakorlic" target="_blank"><span style="color: #000000;">QR Marks the Spot</span></a> challenge.</p>
<p>This past few week we&#8217;ve been mostly keeping our heads down with configuration management, requirements and design for the project. The scope and design of the project has undergone some exciting transformations this week, and it&#8217;s really nice to see everything gaining momentum. To begin with, I&#8217;d like to share some of my findings from this week:</p>
<h2>Workflow<a href="http://www.seekqr.com/wordpress/wp-content/uploads/2010/03/screen-shot-2010-03-19-at-2-25-49-am.png"><img class="size-medium wp-image-8 alignright" title="Screen shot 2010-03-19 at 2.25.49 AM" src="http://www.seekqr.com/wordpress/wp-content/uploads/2010/03/screen-shot-2010-03-19-at-2-25-49-am.png?w=300" alt="" width="200" height="196" /></a></h2>
<p>A lot of exciting things have happened this week for our workflow, both internally and externally.</p>
<ul>
<li><strong>We&#8217;re the proud new parents of an <a href="http://www.activecollab.com/" target="_blank">ActiveCollab</a> instance</strong>, which is proving to be excellent for keeping the team on track. Not only does it tie in directly with our repository, it also gives us great metrics like burndown, schedule of deliverables, ticket tracking, and plenty of communication options. <em>We highly recommend ActiveCollab for small to mid-sized software development teams for these reasons.</em> Check it out!</li>
<li><strong>We&#8217;re trying <em>really</em> hard to be hip. </strong>We&#8217;ve got a <a href="www.twitter.com/seusability" target="_blank">Twitter</a> account which we&#8217;ll be posting some of the spur-of-the-moment updates on the project, so be sure to follow us if you&#8217;re interested in some of the finer grained details.</li>
<li><strong>A classy new WordPress blog!</strong> Not only do we have a classy new theme, we&#8217;re also going to try and put some stellar content here (could happen!) as the project progresses. Glad you found us!</li>
<li><strong>We&#8217;re hopping on the <a href="http://git-scm.com/" target="_blank">Git</a> bandwagon.</strong> We have a lot of <a href="http://subversion.tigris.org/" target="_blank">Subversion</a> and <a href="http://mercurial.selenic.com/" target="_blank">Mercurial</a> vetrans on the team, but we&#8217;d like to take this opportunity to learn something new &#8211; so we&#8217;re diving <em>head first</em> into Git, and so far so good!</li>
</ul>
<h2>Platform<a href="http://www.seekqr.com/wordpress/wp-content/uploads/2010/03/screen-shot-2010-03-19-at-2-55-17-am.png"><img class="size-medium wp-image-12 alignright" title="Screen shot 2010-03-19 at 2.55.17 AM" src="http://www.seekqr.com/wordpress/wp-content/uploads/2010/03/screen-shot-2010-03-19-at-2-55-17-am.png?w=300" alt="" width="200" height="126" /></a></h2>
<p>One of the requirements for our project was that it <em>must be able to run on a mobile device</em>; however some (polite) holy wars arose when trying to pick a specific platform to implement the project in. After some research and talking with friends, we&#8217;re currently pursuing <strong><a href="http://www.appcelerator.com/" target="_blank">Titanium</a></strong>.</p>
<p>Titanium has a very interesting approach to the multi-platform dilemma &#8211; it enables developers to create a rich web application using Javascript w<em>hich later compiles into a native app</em> for your device of choice. What sets Titanium apart however is that its API provides an abstract way of interfacing with platform-specific APIs; a simple call to Titanium&#8217;s API for the device&#8217;s camera (for example) will invoke different code for the Apple iPhone than it will for Google Android devices.</p>
<p>Is this a <strong>silver bullet</strong> for application development? <em>Perhaps.</em> It&#8217;s exceedingly difficult to replicate the entire breadth of functionality that a native API has to offer &#8211; but Titanium exceeded our initial expectations. With this framework, we&#8217;ll be able to rapidly prototype UI designs building off of existing Javascript libraries like <a href="http://mootools.net/" target="_blank">MooTools</a> and <a href="http://jquery.com/" target="_blank">JQuery</a>. This also let&#8217;s us do heavy data crunching on the client <em>and</em> the server when the time comes. Very cool.</p>
<p>That more or less sums up the activity this week for the team. Please don&#8217;t hesitate to leave any of your thoughts in comments. Stay tuned!</p>
<p><strong>Next week </strong>we&#8217;ll be getting our hands dirty with:</p>
<ul>
<li>Diving more into Titanium</li>
<li>Developing a <a href="http://en.wikipedia.org/wiki/Work_breakdown_structure" target="_blank">WBS</a></li>
<li>Creating wireframes for UI</li>
<li>Brainstorming for some swanky names for our project</li>
</ul>
<p>&nbsp;</p>
<p><strong>
<p>If you&#8217;re interested in the development of Seekqr, swing by the team blog at <a href="http://blog.seekqr.com/">http://blog.seekqr.com/</a>.</p>
<p></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.chriscowdery.com/2010/06/seekqr/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

