<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-2847927331851767771</atom:id><lastBuildDate>Sun, 22 Jan 2012 23:21:56 +0000</lastBuildDate><category>Website Traffic Estimator</category><category>Linux Robotics</category><category>Sharp GP2Y0A21YK</category><category>TTL</category><category>Wireless communication</category><category>Face Recognition</category><category>Skin Recognition</category><category>Regular Expressions</category><category>Quadrature encoders</category><category>ATMega328</category><category>cvCalcOpticalFlowPyrLK</category><category>Tinkering</category><category>PICAXE</category><category>David Barnes</category><category>Mecanum Wheel</category><category>I2C</category><category>C# Computer Vision</category><category>Overclocking baud rates</category><category>Linear Actuators</category><category>Sony Handycam</category><category>FT232R</category><category>Overclocking PIC</category><category>Pneumatic Actuators</category><category>RoboRealm</category><category>Keyword Traffic Estimator</category><category>Dynamic Balancing</category><category>transistor</category><category>cvFindCornerSubPix</category><category>Air Cylinders</category><category>Google API</category><category>Parallax</category><category>pulsout</category><category>NES Controller</category><category>RF Link</category><category>Atari</category><category>RF</category><category>Basic Stamp 2</category><category>Encoder Divider Board</category><category>Hydraulic</category><category>Haar Detection</category><category>iDuino</category><category>UART</category><category>Search Marketing</category><category>Optical Flow</category><category>SIRC</category><category>Search using .net</category><category>DC Motors</category><category>PVC Air Tank</category><category>pulse width modulation</category><category>Segway Robot</category><category>Replace HTML Elements</category><category>adwords traffic estimator</category><category>SpeechLib.SpSharedRecoContext</category><category>Haar Training</category><category>Hobby Robotics</category><category>USB</category><category>Remote Control</category><category>Robot Parts</category><category>Infrared Proximity Sensor</category><category>C# RegEx</category><category>Ubuntu Linux</category><category>setfreq 16m</category><category>Compass Module</category><category>AVR</category><category>Robot Assembly</category><category>Imaging Source</category><category>Fundamental Logic</category><category>portc</category><category>C# Robotics</category><category>RS-232</category><category>SpeechLib</category><category>Command Line Video Capture</category><category>PICAXE-40X1</category><category>Robot Prototyping</category><category>PICAXE-08M</category><category>RoboRealm API</category><category>C# Face Detection</category><category>C# Check system processes</category><category>Robots</category><category>ETL</category><category>SERIN</category><category>mobile robot</category><category>RetroZone</category><category>RB100</category><category>OpenCV</category><category>Vision Algorithms</category><category>Hydraulic Robot</category><category>iTunes remove duplicates</category><category>Thumb Joystick</category><category>RoBoard</category><category>Nintendo Advantage Hack</category><category>Robotics</category><category>parts of robots</category><category>Revolution Education</category><category>Artificial Intelligence</category><category>picaxe infra-red</category><category>ispeechrecocontextevents_recognitioneventhandler</category><category>Pneumatic Locomotion</category><category>Anthony</category><category>Sony LANC</category><category>Sabertooth 2x5 motor control</category><category>Arduino</category><category>picaxe projects</category><category>Chicago</category><category>Game Cube Controller Hack</category><category>Micro Controller</category><category>Emgu CV</category><category>Robot Controllers</category><category>MHC6352</category><category>Optics</category><category>Command Line Encoding</category><category>readadc pot</category><category>VBS</category><category>encoder calibration</category><category>Machine Vision</category><category>Drunk Robotics</category><category>BiPed Robot</category><category>Joystick</category><category>BS2</category><category>setfreq 8m</category><category>RetroKit</category><category>HaarCascade</category><category>Human Computer Interaction</category><category>Walking Robot</category><category>Bimba</category><category>Speech Activation</category><category>Debian Linux</category><category>Parallax 433 MHZ receiver</category><category>CodeBlocks</category><category>RegEx</category><category>analogWrite</category><category>Rev-Ed</category><category>Search</category><category>Arduino Clone</category><category>Compass</category><category>Computer Vision</category><category>C#</category><category>Robotic Locomotion</category><category>Embedded Linux</category><category>BaneBots</category><category>Arduino Diecimila</category><category>.net speechlib recognition</category><category>David J Barnes</category><category>Air Muscles</category><category>PICAXE-28X1</category><category>Sony Control-L</category><category>H-Bridge</category><category>C# Web Crawler</category><category>Open CV</category><category>Robot Communication</category><category>C# Serial Communication</category><category>Robot compass</category><category>Toy Robots</category><category>Mechanical Robotics</category><category>Data Warehousing</category><category>IR</category><category>Omni Wheels</category><category>Get Process Properties</category><category>Vex</category><category>SparkFun</category><category>cvGoodFeaturesToTrack</category><category>PICAXE-14M</category><category>Screen Scraping</category><category>SEROUT</category><category>RM3</category><title>Quotient Robotics | Hobby Robotics, Biped Robots &amp; C# Robotics</title><description>This blog focuses on hobby robotics, mechanical concepts, PICAXE micro controllers, machine vision, artificial intelligence and C# robotics</description><link>http://www.quotientrobotics.com/</link><managingEditor>noreply@blogger.com (David J Barnes)</managingEditor><generator>Blogger</generator><openSearch:totalResults>94</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/QuotientRoboticsHobbyRoboticsArtificialIntelligence" /><feedburner:info uri="quotientroboticshobbyroboticsartificialintelligence" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:browserFriendly></feedburner:browserFriendly><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2847927331851767771.post-5621889189297866209</guid><pubDate>Fri, 09 Apr 2010 13:10:00 +0000</pubDate><atom:updated>2010-04-09T09:36:36.799-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Computer Vision</category><category domain="http://www.blogger.com/atom/ns#">Haar Training</category><category domain="http://www.blogger.com/atom/ns#">C# Computer Vision</category><category domain="http://www.blogger.com/atom/ns#">Machine Vision</category><category domain="http://www.blogger.com/atom/ns#">HaarCascade</category><category domain="http://www.blogger.com/atom/ns#">OpenCV</category><title>OpenCV HaarTraining - Object Detection with a Cascade of Boosted Classifiers Based on Haar-like Features - Part II</title><description>Steps 1 and 2 (asset preparation and generating a .vec using createsamples.exe) of this overview were covered in part I, &lt;a href="http://www.quotientrobotics.com/2010/04/opencv-haartraining-object-detection.html"&gt;OpenCV HaarTraining - Object Detection with a Cascade of Boosted Classifiers Based on Haar-like Features - Part I&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Thus far we have prepared our assets and created a .vec file. In doing so, we have created a directory that contains an images folder. It has three child folder; Negatives, Positives, and TestPostives. In the root we have our index files that list all positive and negative images. The .vec file has been verified using:&lt;br /&gt;&lt;br /&gt;C:\HaarTraining\createsamples.exe -vec C:\HaarTraining\PositivesMany.vec&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ZrKBb68KqHo/S78olJ3jtRI/AAAAAAAABJU/CIaCctAm300/s1600/OpenCV_HaarTraining.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 220px; height: 109px;" src="http://1.bp.blogspot.com/_ZrKBb68KqHo/S78olJ3jtRI/AAAAAAAABJU/CIaCctAm300/s320/OpenCV_HaarTraining.jpg" alt="" id="BLOGGER_PHOTO_ID_5458125892165547282" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;3) Train the Classifier using haartraining.exe&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Haartraining.exe is provided by OpenCV and can be found in: C:\Program Files\OpenCV\bin. For convenience, both haartraining.exe and createsamples.exe were moved to my "working" directory's root.&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;Similar to createsamples.exe, we pass the necessary parameters to haartraining.exe via command line. For convenience a .bat file is created. We name it: 2_HaarTraining.bat. It's contents are:&lt;br /&gt;&lt;br /&gt;haartraining.exe -data HaarCascade_Horse5 -vec PositivesMany.vec -bg Negatives.txt -nstages 20 -nsplits 2 -minhitrate 0.998 -maxfalsealarm 0.5 -npos 1191 -nneg 3985 -w 24 -h 24 -nonsym -mem 1024 -mode ALL&lt;br /&gt;&lt;br /&gt;PAUSE&lt;br /&gt;&lt;br /&gt;Depending on the number of negatives and positives collected, this process commonly takes many hours. The parameter -mem 1024 allocates memory to the systems process. To leverage a multi-core processor, additional advanced configuration is necessary. A screenshot of haartraining.exe running is displayed above. Once complete, a "completion" prompt will be displayed and an xml file will be generated. In this example a cascade named HaarCascade_Horse5.xml is placed in the working root.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4) Testing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Once training is complete and a cascade of classifiers has been generated, it is suggested that you benchmark performance using  performance.exe. Run performance.exe from a command line for usage.&lt;br /&gt;&lt;br /&gt;The results of training a classifier with fewer than 2000 positive images and less than 3000 negatives is promising. A video containing frames that were not present in either the positives or negatives is displayed below. The results are acceptable and performance can easily be boosted by providing additional images; both positive and negative.&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/DLSQebBrKsc&amp;amp;hl=en_US&amp;amp;fs=1&amp;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/DLSQebBrKsc&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2847927331851767771-5621889189297866209?l=www.quotientrobotics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.quotientrobotics.com/2010/04/opencv-haartraining-object-detection_09.html</link><author>noreply@blogger.com (David J Barnes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_ZrKBb68KqHo/S78olJ3jtRI/AAAAAAAABJU/CIaCctAm300/s72-c/OpenCV_HaarTraining.jpg" height="72" width="72" /><thr:total>4</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2847927331851767771.post-1409589726174500981</guid><pubDate>Thu, 08 Apr 2010 15:28:00 +0000</pubDate><atom:updated>2011-10-20T13:00:00.985-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Computer Vision</category><category domain="http://www.blogger.com/atom/ns#">Haar Training</category><category domain="http://www.blogger.com/atom/ns#">C# Computer Vision</category><category domain="http://www.blogger.com/atom/ns#">Machine Vision</category><category domain="http://www.blogger.com/atom/ns#">HaarCascade</category><category domain="http://www.blogger.com/atom/ns#">OpenCV</category><title>OpenCV HaarTraining - Object Detection with a Cascade of Boosted Classifiers Based on Haar-like Features - Part I</title><description>OpenCV provides a way to train and create your own classifiers using Haar-like features in HaarTraining. The result of training is an xml file that contains the definitions of your classifier. Note that this experiment was produced with the following: WindowsXP Pro, 3GB RAM, OpenCV 1.0 pre, CodeBlocks, Visual Studio 2005, OpenCVSharp, OpenCV root path: C:\Program Files\OpenCV, and tons of coffee and nicotine.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_ZrKBb68KqHo/S738AE9kaAI/AAAAAAAABIo/dbDvwl3JiYE/s1600/HaarTraining-Directory-Structure.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 220px; height: 167px;" src="http://4.bp.blogspot.com/_ZrKBb68KqHo/S738AE9kaAI/AAAAAAAABIo/dbDvwl3JiYE/s320/HaarTraining-Directory-Structure.jpg" alt="" id="BLOGGER_PHOTO_ID_5457795401705089026" border="0" /&gt;&lt;/a&gt;Much of the work for training a classifier is "busy work." We break the process of creating a classifier into four logical steps; 1) asset preparation (acquire images/videos, tons of them), 2) create sample images and generate a .vec (using createsamples.exe) 3) train the classifier (using haartraining.exe) 4) test.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;A working directory is created. This example uses C:\HaarTraining\. The directory is organized as such. Within the Images directory 3 additional folders exist: Positives, Negatives, and PositivesTest. Positives contain our positives, negatives our negatives, and PositivesTest contain positive images that were not used in the training process. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;1) Asset Preparation&lt;/b&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;This phase of the process involves acquiring images or videos which contain the object to classify. We refer to these images as "positive" images. It also involves the collection of "negative" images; images that do not contain the target object. Since an abundance of video footage was readily accessible for this project, images were extracted frame by frame to produce positives.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_ZrKBb68KqHo/S74ZlK4WV7I/AAAAAAAABI8/lkhXlF4J34U/s1600/Positives-Builder-HaarTraining-Tool.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 220px; height: 131px;" src="http://3.bp.blogspot.com/_ZrKBb68KqHo/S74ZlK4WV7I/AAAAAAAABI8/lkhXlF4J34U/s320/Positives-Builder-HaarTraining-Tool.jpg" alt="" id="BLOGGER_PHOTO_ID_5457827924786173874" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;While this is ordinarily a painful process, the aid of a simple C# Windows app (Positives Builder, ironically produces negatives too) greatly reduced the amount of time spent doing this (interns are often exceptionally great at this type of work too, think about it). Version 1 can be downloaded for free from Google Code: &lt;a href="http://code.google.com/p/opencv-haar-cascade-positive-image-builder/downloads/list"&gt;http://code.google.com/p/opencv-haar-cascade-positive-image-builder/downloads/list&lt;/a&gt;. If you'd like the source code, please &lt;a href="mailto:Hello@DavidJBarnes.com"&gt;contact me&lt;/a&gt;. According to Kuranov et. al. [1] 5000 positives is a suitable number to train with. As a proof of concept, we took 1191 positives and 2000 negatives to begin with. The results of this test reflect the relationship of the number of positive and negative images in proportion to the confidence of the object found via HaarDetection.&lt;br /&gt;&lt;br /&gt;Positives Builder will output a text file (modified in the app.config) that contains a list of images and the objects coordinates. A samples Positives.txt files is structured like so:&lt;br /&gt;&lt;br /&gt;C:\HaarTraining\Images\Positives\Horse_0.jpg 1 288 167 111 100&lt;br /&gt;&lt;br /&gt;Where C:\HaarTraining\Images\Positives\Horse_0.jpg is a positive image, 1 indicates a single instance of a positve object in the image, 288 is the x position, 167 is the y position, and 111 and 100 are the respective width and height of the objects bounding area.&lt;br /&gt;&lt;br /&gt;The Negatives.txt file is structured like so:&lt;br /&gt;&lt;br /&gt;C:\HaarTraining\Images\Negatives\neg-0003.jpg&lt;br /&gt;&lt;br /&gt;And so on. The use of a directory contents reader can help build a file in a snap.&lt;br /&gt;&lt;br /&gt;Step 1 is complete once all assets are acquired, "cropped", and placed in their respective directories.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight: bold;"&gt;2) Create Sample Images and Generate a .vec&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;After all positives and negatives are segregated into their proper directories we use createsamples.exe to generate our .vec file. This is a straight-forward process that converts all positives. No work is done with negatives in step 2.&lt;br /&gt;&lt;br /&gt;A .bat file containing the following is used:&lt;br /&gt;&lt;br /&gt;createsamples.exe -info Positives.txt -vec PositivesMany.vec -num 1191 -w 24 -h 24&lt;br /&gt;PAUSE&lt;br /&gt;&lt;br /&gt;Where the -info parameter Positives.txt is used from step 1, -vec indicates the name of the .vec file to be produced, -num is the number of positive images to processed, and -w and -h are the width and height. We find that this is a quick process and should resolve in under a few seconds for ~1200 positives. The output of the above is PositivesMany.vec.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_ZrKBb68KqHo/S74dasx0N7I/AAAAAAAABJI/qN7_FQ3s8ac/s1600/OpenCV-HaarTraining-CreateSamples.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 220px; height: 109px;" src="http://3.bp.blogspot.com/_ZrKBb68KqHo/S74dasx0N7I/AAAAAAAABJI/qN7_FQ3s8ac/s320/OpenCV-HaarTraining-CreateSamples.jpg" alt="" id="BLOGGER_PHOTO_ID_5457832142953527218" border="0" /&gt;&lt;/a&gt;To verify that all images were properly processed by createsamples, we run:&lt;br /&gt;&lt;br /&gt;C:\HaarTraining\createsamples.exe -vec C:\HaarTraining\PositivesMany.vec&lt;br /&gt;PAUSE&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Step 2 is short and sweet and is complete once a .vec file is compiled and validated.&lt;br /&gt;&lt;br /&gt;-----------------------&lt;br /&gt;&lt;br /&gt;[1] Alexander Kuranov, Rainer Lienhart, and Vadim Pisarevsky. An Empirical Analysis of Boosting Algorithms for Rapid Objects With an Extended Set of Haar-like Features. Intel Technical Report MRL-TR-July02-01, 2002.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2847927331851767771-1409589726174500981?l=www.quotientrobotics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.quotientrobotics.com/2010/04/opencv-haartraining-object-detection.html</link><author>noreply@blogger.com (David J Barnes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_ZrKBb68KqHo/S738AE9kaAI/AAAAAAAABIo/dbDvwl3JiYE/s72-c/HaarTraining-Directory-Structure.jpg" height="72" width="72" /><thr:total>45</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2847927331851767771.post-837645498583448647</guid><pubDate>Wed, 31 Mar 2010 23:57:00 +0000</pubDate><atom:updated>2010-03-31T19:24:04.563-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Drunk Robotics</category><category domain="http://www.blogger.com/atom/ns#">mobile robot</category><category domain="http://www.blogger.com/atom/ns#">Anthony</category><title>Robot Social Experiment - How Humans and Canines Respond to Robots</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ZrKBb68KqHo/S7PiFlK5y1I/AAAAAAAABIU/uyq4vjWRf1A/s1600/Robot-Meets-Dog-In-Experiment.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 220px; height: 294px;" src="http://1.bp.blogspot.com/_ZrKBb68KqHo/S7PiFlK5y1I/AAAAAAAABIU/uyq4vjWRf1A/s320/Robot-Meets-Dog-In-Experiment.jpg" alt="" id="BLOGGER_PHOTO_ID_5454952159180868434" border="0" /&gt;&lt;/a&gt;Seldom do Chicagoans get to experience a 76 degree day in March. Given the perfect weather, I thought it was an excellent opportunity to introduce Anthony to the outdoors. With beer, cigarette, and emergency remote in hand, &lt;a href="http://www.quotientrobotics.com/search/label/Anthony"&gt;Anthony &lt;/a&gt;navigated his way through the lobby door. Like a house cat that has never seen the pavement of city streets, he crept eerily alongside the condo flowerbeds. This site was something I had been waiting many cold wintery months to see.&lt;br /&gt;&lt;br /&gt;People from a near by pub gathered at the edge of their fenced-in patio to see what was approaching. One gentleman walked backwards down the sidewalk in an attempt to maximize his time spent viewing such an odd thing. Lady walking a stroller felt threatened enough to cross the street in the middle of traffic; only to cross back once she cleared Anthony. As I was sitting on the flowerbed watching Anthony run circles, another lady asked (in a condescending tone) if I lived here; eying Anthony. Implying that if I did not, I'd best move along. She was surprised to find out that I knew she was my neighbor.&lt;br /&gt;&lt;br /&gt;By no means did I set out today to experiment with robot-human or robot-dog interaction, I'll save that for another day. But, I was more than surprised at the reactions I was getting. Cross the street, really? Are people ready for robots in their every day lives?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2847927331851767771-837645498583448647?l=www.quotientrobotics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.quotientrobotics.com/2010/03/robot-social-experiment-how-humans-and.html</link><author>noreply@blogger.com (David J Barnes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_ZrKBb68KqHo/S7PiFlK5y1I/AAAAAAAABIU/uyq4vjWRf1A/s72-c/Robot-Meets-Dog-In-Experiment.jpg" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2847927331851767771.post-944494243049513933</guid><pubDate>Fri, 26 Mar 2010 16:29:00 +0000</pubDate><atom:updated>2010-03-26T11:33:05.424-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Computer Vision</category><category domain="http://www.blogger.com/atom/ns#">cvFindCornerSubPix</category><category domain="http://www.blogger.com/atom/ns#">Optical Flow</category><category domain="http://www.blogger.com/atom/ns#">cvGoodFeaturesToTrack</category><category domain="http://www.blogger.com/atom/ns#">OpenCV</category><category domain="http://www.blogger.com/atom/ns#">cvCalcOpticalFlowPyrLK</category><title>Optical Flow in OpenCV used to Track Objects in Motion</title><description>&lt;span&gt;Optical flow is a very important concept in image processing. It is the pattern of motion of objects, surfaces, edges, etc. OpenCV has embedded many methods that utilize the &lt;a href="http://en.wikipedia.org/wiki/Lucas%E2%80%93Kanade_Optical_Flow_Method"&gt;Lucas-kanade algorithm&lt;/a&gt;. They are cvGoodFeaturesToTrack (used to find meaningful features to track), cvFindCornerSubPix (refines a set of features), and cvCalcOpticalFlowPyrLK (does the actual optical flow calculations). This application demonstrates the fundamentals of optical flow by using cvCalcOpticalFlowPyrLK to track points defined by an end users mouse click.&lt;br /&gt;&lt;br /&gt;David Stavens at the Stanford AI Lab gives a more comprehensive overview of optical flow algorithms in OpenCV on the &lt;a href="http://robots.stanford.edu/cs223b05/notes/CS%20223-B%20T1%20stavens_opencv_optical_flow.pdf"&gt;Stanford AI web site&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/WS3naWwfToI&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/WS3naWwfToI&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2847927331851767771-944494243049513933?l=www.quotientrobotics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.quotientrobotics.com/2010/03/optical-flow-in-opencv-used-to-track.html</link><author>noreply@blogger.com (David J Barnes)</author><thr:total>4</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2847927331851767771.post-533013299868740223</guid><pubDate>Thu, 25 Mar 2010 19:48:00 +0000</pubDate><atom:updated>2010-03-25T15:30:29.283-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Open CV</category><category domain="http://www.blogger.com/atom/ns#">Computer Vision</category><category domain="http://www.blogger.com/atom/ns#">CodeBlocks</category><category domain="http://www.blogger.com/atom/ns#">Machine Vision</category><category domain="http://www.blogger.com/atom/ns#">OpenCV</category><title>CodeBlocks &amp; OpenCV - Configure the Compiler and Linker</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ZrKBb68KqHo/S6vD7wRG5xI/AAAAAAAABII/8XXYgYI4jYU/s1600/System+Variables+Configure+Path.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 220px; height: 205px;" src="http://3.bp.blogspot.com/_ZrKBb68KqHo/S6vD7wRG5xI/AAAAAAAABII/8XXYgYI4jYU/s320/System+Variables+Configure+Path.jpg" alt="" id="BLOGGER_PHOTO_ID_5452667205198472978" border="0" /&gt;&lt;/a&gt;Configuring your compiler and linker settings for OpenCV in CodeBlocks is as straight forward as it gets. There are only three basic steps involved. Configure the global variables path, set the compiler settings, and set the linker settings.&lt;br /&gt;&lt;br /&gt;Since many struggling to find the right settings will only read the first few lines of a post that instructs them how to do so, I will flip-flop the order of these steps and start with what I consider to be the most crucial yet most often skipped step.&lt;br /&gt;&lt;br /&gt;Enter your My Computer properties, select Advanced tab, Environment Variables. Select the Path variable from the system variables list. I like to copy this string into Notepad so I can search through it. Look for an OpenCV entry. If it is not present, add a semicolon to the end and add "C:\Program Files\OpenCV" Of course omit quotes.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ZrKBb68KqHo/S6vBVggSsnI/AAAAAAAABHY/N22uoURH4pI/s1600/CodeBlocks+Start+Here.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 220px; height: 169px;" src="http://2.bp.blogspot.com/_ZrKBb68KqHo/S6vBVggSsnI/AAAAAAAABHY/N22uoURH4pI/s320/CodeBlocks+Start+Here.jpg" alt="" id="BLOGGER_PHOTO_ID_5452664349108908658" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ZrKBb68KqHo/S6vBdgSZxQI/AAAAAAAABHo/CcpJC3lPP9Q/s1600/CodeBlocks+-+Search+Directory+Compiler+Settings.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 220px; height: 169px;" src="http://1.bp.blogspot.com/_ZrKBb68KqHo/S6vBdgSZxQI/AAAAAAAABHo/CcpJC3lPP9Q/s320/CodeBlocks+-+Search+Directory+Compiler+Settings.jpg" alt="" id="BLOGGER_PHOTO_ID_5452664486489605378" border="0" /&gt;&lt;/a&gt;Next launch CodeBlocks. It is worth mentioning I am currently running version 8.02. From the CodeBlocks start here screen, select the Settings menu, then Compiler and debugger.&lt;br /&gt;&lt;br /&gt;Be sure the Global compiler settings icon to the left is selected. Navigate to the Linker settings tab and make the following entries into the Link libraries textbox:&lt;br /&gt;&lt;br /&gt;C:\Program Files\OpenCV\lib\cv.lib&lt;br /&gt;C:\Program Files\OpenCV\lib\cvaux.lib&lt;br /&gt;C:\Program Files\OpenCV\lib\cxcore.lib&lt;br /&gt;C:\Program Files\OpenCV\lib\highgui.lib&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZrKBb68KqHo/S6vBgaapA4I/AAAAAAAABHw/05FxEqK6fZk/s1600/CodeBlocks+-+OpenCV+Linker+Settings.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 220px; height: 169px;" src="http://4.bp.blogspot.com/_ZrKBb68KqHo/S6vBgaapA4I/AAAAAAAABHw/05FxEqK6fZk/s320/CodeBlocks+-+OpenCV+Linker+Settings.jpg" alt="" id="BLOGGER_PHOTO_ID_5452664536453153666" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZrKBb68KqHo/S6vCGSdJTqI/AAAAAAAABIA/RAI1daK5uQM/s1600/CodeBlocks+-+Compile+OpenCV.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 220px; height: 169px;" src="http://4.bp.blogspot.com/_ZrKBb68KqHo/S6vCGSdJTqI/AAAAAAAABIA/RAI1daK5uQM/s320/CodeBlocks+-+Compile+OpenCV.jpg" alt="" id="BLOGGER_PHOTO_ID_5452665187151204002" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Navigate to the Search directories tab and select the Compiler sub-tab. Enter the following:&lt;br /&gt;&lt;br /&gt;C:\Program Files\OpenCV\cv\include&lt;br /&gt;C:\Program Files\OpenCV\cxcore\include&lt;br /&gt;C:\Program Files\OpenCV\otherlibs\highgui&lt;br /&gt;C:\Program Files\OpenCV\cvaux\include&lt;br /&gt;&lt;br /&gt;Ok your way out of the global settings and create a new C console application. Test that you linked OpenCV correctly by including the appropriate libraries:&lt;br /&gt;&lt;br /&gt;#include "cv.h"&lt;br /&gt;#include "highgui.h"&lt;br /&gt;#include &lt;stdio.&gt;&lt;br /&gt;#include &lt;ctype.&gt;&lt;/ctype.&gt;&lt;/stdio.&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2847927331851767771-533013299868740223?l=www.quotientrobotics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.quotientrobotics.com/2010/03/codeblocks-opencv-configure-compiler.html</link><author>noreply@blogger.com (David J Barnes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_ZrKBb68KqHo/S6vD7wRG5xI/AAAAAAAABII/8XXYgYI4jYU/s72-c/System+Variables+Configure+Path.jpg" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2847927331851767771.post-6854304733396637692</guid><pubDate>Sun, 21 Mar 2010 15:41:00 +0000</pubDate><atom:updated>2010-03-21T11:35:08.879-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Linux Robotics</category><category domain="http://www.blogger.com/atom/ns#">Ubuntu Linux</category><category domain="http://www.blogger.com/atom/ns#">RB100</category><category domain="http://www.blogger.com/atom/ns#">Embedded Linux</category><category domain="http://www.blogger.com/atom/ns#">RoBoard</category><title>RoBoard Running Ubuntu Linux on MicroSDHC</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ZrKBb68KqHo/S6Y-v8Pyp6I/AAAAAAAABGc/W5hnh7xRGsU/s1600-h/RoBoard+-+Ubuntu+MicroSDHC+Install+006.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 180px; height: 135px;" src="http://2.bp.blogspot.com/_ZrKBb68KqHo/S6Y-v8Pyp6I/AAAAAAAABGc/W5hnh7xRGsU/s320/RoBoard+-+Ubuntu+MicroSDHC+Install+006.jpg" alt="" id="BLOGGER_PHOTO_ID_5451113392325699490" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ZrKBb68KqHo/S6Y-9GIKVQI/AAAAAAAABGk/r4jYKIRXEdo/s1600-h/RoBoard+-+Ubuntu+MicroSDHC+Install+001.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 180px; height: 135px;" src="http://3.bp.blogspot.com/_ZrKBb68KqHo/S6Y-9GIKVQI/AAAAAAAABGk/r4jYKIRXEdo/s320/RoBoard+-+Ubuntu+MicroSDHC+Install+001.jpg" alt="" id="BLOGGER_PHOTO_ID_5451113618316350722" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ZrKBb68KqHo/S6Y_V-UqVWI/AAAAAAAABGs/f8SorIlr6eg/s1600-h/RoBoard+-+Ubuntu+MicroSDHC+Install+002.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 180px; height: 135px;" src="http://2.bp.blogspot.com/_ZrKBb68KqHo/S6Y_V-UqVWI/AAAAAAAABGs/f8SorIlr6eg/s320/RoBoard+-+Ubuntu+MicroSDHC+Install+002.jpg" alt="" id="BLOGGER_PHOTO_ID_5451114045718025570" border="0" /&gt;&lt;/a&gt;A different, faster approach to getting Linux Ubuntu onto a RoBoard is to install the OS directly to your MicroSDHC card from another machine. VMWear is another viable option. I used an old Asus EeePC laptop which has a card reader built in. For this installation I used a 4G micro SDHC card from Gigaware. File copy took about an hour and after the initial reboot, everything was in order.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZrKBb68KqHo/S6ZAMxfojFI/AAAAAAAABHM/W5qKL0qCIBc/s1600-h/RoBoard+-+Ubuntu+MicroSDHC+Install+007.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 180px; height: 135px;" src="http://4.bp.blogspot.com/_ZrKBb68KqHo/S6ZAMxfojFI/AAAAAAAABHM/W5qKL0qCIBc/s320/RoBoard+-+Ubuntu+MicroSDHC+Install+007.jpg" alt="" id="BLOGGER_PHOTO_ID_5451114987167190098" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ZrKBb68KqHo/S6Y_6-2WgoI/AAAAAAAABHE/E1pI3WjZxPA/s1600-h/RoBoard+-+Ubuntu+MicroSDHC+Install+004.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 180px; height: 135px;" src="http://2.bp.blogspot.com/_ZrKBb68KqHo/S6Y_6-2WgoI/AAAAAAAABHE/E1pI3WjZxPA/s320/RoBoard+-+Ubuntu+MicroSDHC+Install+004.jpg" alt="" id="BLOGGER_PHOTO_ID_5451114681514492546" border="0" /&gt;&lt;/a&gt;After ensuring that your internet connection is in order, run all suggested Ubuntu updates. Since the default Ubuntu kernel installed is an i686, you'll need to load a kernel compatible with the RoBoard, something a 486 could handle. To do so, issue "&lt;span style="font-weight: bold;"&gt;sudo apt-get -y install linux-386&lt;/span&gt;" at a terminal prompt. Next set the new kernel as the default. You can enter the boot menu by "&lt;span style="font-weight: bold;"&gt;sudo nano -w /boot/grub/menu.lst&lt;/span&gt;." One of the top entries in the boot menu is default. This value corresponds with the list of system kernels listed below (note that the index value is base zero). Once the default is adjusted, a minor tweak needs to be done to the 386 kernel flag. Replace splash with "&lt;span style="font-weight: bold;"&gt;pnpbios=off acpi=off noreplace-paravirt noapic nolapic&lt;/span&gt;."&lt;br /&gt;&lt;br /&gt;Keep in mind we are still &lt;span style="font-style: italic;"&gt;not &lt;/span&gt;working on the RoBoard. Once the above is complete, verify your current kernel by "&lt;span style="font-weight: bold;"&gt;uname -r&lt;/span&gt;." Reboot. Your 386 kernel should have been selected if you set the default flag correctly. Check your current kernel again to verify 386 booted.&lt;br /&gt;&lt;br /&gt;Assuming the 386 kernel was verified, its time to swap in he micro SDHC into the RoBoard; the moment of truth. One other tweak needed when running the 386 kernel is to install the Ndiswrapper (&lt;a href="https://help.ubuntu.com/community/WifiDocs/Driver/Ndiswrapper"&gt;https://help.ubuntu.com/community/WifiDocs/Driver/Ndiswrapper&lt;/a&gt;). This allows you to use many Windows wifi device drivers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2847927331851767771-6854304733396637692?l=www.quotientrobotics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.quotientrobotics.com/2010/03/roboard-running-ubuntu-linux-on.html</link><author>noreply@blogger.com (David J Barnes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_ZrKBb68KqHo/S6Y-v8Pyp6I/AAAAAAAABGc/W5hnh7xRGsU/s72-c/RoBoard+-+Ubuntu+MicroSDHC+Install+006.jpg" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2847927331851767771.post-4894118915864954364</guid><pubDate>Sat, 13 Mar 2010 00:28:00 +0000</pubDate><atom:updated>2010-03-15T10:09:41.223-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Open CV</category><category domain="http://www.blogger.com/atom/ns#">Robot Controllers</category><category domain="http://www.blogger.com/atom/ns#">RB100</category><category domain="http://www.blogger.com/atom/ns#">Embedded Linux</category><category domain="http://www.blogger.com/atom/ns#">Debian Linux</category><category domain="http://www.blogger.com/atom/ns#">RoBoard</category><category domain="http://www.blogger.com/atom/ns#">OpenCV</category><title>Embedded Linux (Debian) RoBoard USB Flash Drive Installation</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ZrKBb68KqHo/S5rce-NNTCI/AAAAAAAABGQ/lwOiObLujWU/s1600-h/RoBoard+-+Debian+Install+on+USB+003.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 167px; height: 127px;" src="http://1.bp.blogspot.com/_ZrKBb68KqHo/S5rce-NNTCI/AAAAAAAABGQ/lwOiObLujWU/s320/RoBoard+-+Debian+Install+on+USB+003.jpg" alt="" id="BLOGGER_PHOTO_ID_5447909123910618146" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ZrKBb68KqHo/S5rcaRXDJRI/AAAAAAAABGI/1qwetq6fy5Y/s1600-h/RoBoard+-+Debian+Install+on+USB+002.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 170px; height: 127px;" src="http://1.bp.blogspot.com/_ZrKBb68KqHo/S5rcaRXDJRI/AAAAAAAABGI/1qwetq6fy5Y/s320/RoBoard+-+Debian+Install+on+USB+002.jpg" alt="" id="BLOGGER_PHOTO_ID_5447909043152823570" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ZrKBb68KqHo/S5rcWJwIcGI/AAAAAAAABGA/S8kTKOyiOhg/s1600-h/RoBoard+-+Debian+Install+on+USB+001.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 170px; height: 128px;" src="http://1.bp.blogspot.com/_ZrKBb68KqHo/S5rcWJwIcGI/AAAAAAAABGA/S8kTKOyiOhg/s320/RoBoard+-+Debian+Install+on+USB+001.jpg" alt="" id="BLOGGER_PHOTO_ID_5447908972391067746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Though single-board computers are not a new concept but the idea of marrying an SBC with MCU functionality is; &lt;a href="http://www.dmp.com.tw/"&gt;DMP Electronics&lt;/a&gt; is leading the way with their new &lt;a href="http://www.roboard.com/"&gt;RoBoard&lt;/a&gt;. The RoBoard offers tons of GPIO, PWM, I2C, USB, and tons of robotic-esque features via a rich C++ based library. When I saw this, I of course had to have it. $289 from &lt;a href="http://www.trossenrobotics.com/roboard.aspx"&gt;Trossen Robotics&lt;/a&gt; gets you everything you need to get started.&lt;br /&gt;&lt;br /&gt;The RoBoard has the ability to run a wide variety of operating systems. I chose to begin with &lt;a href="http://www.debian.org/"&gt;Debian &lt;/a&gt;given it's tiny footprint, open source GNU-ness, and well, because Linux rocks for embedded systems. The plan is to slowly integrate the RoBoard into Anthony, unlocking the functionality of OpenCV while removing abstraction between a traditional micro-controller and a PC.&lt;br /&gt;&lt;br /&gt;I will certainly share my experiences as I install OpenCV, the RoBoard C++libraries, and unlock the RoBoard's robust feature set.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2847927331851767771-4894118915864954364?l=www.quotientrobotics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.quotientrobotics.com/2010/03/embedded-linux-debian-roboard-usb-flash.html</link><author>noreply@blogger.com (David J Barnes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_ZrKBb68KqHo/S5rce-NNTCI/AAAAAAAABGQ/lwOiObLujWU/s72-c/RoBoard+-+Debian+Install+on+USB+003.jpg" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2847927331851767771.post-3627882874084463112</guid><pubDate>Wed, 10 Mar 2010 04:54:00 +0000</pubDate><atom:updated>2010-03-09T23:00:01.657-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Computer Vision</category><category domain="http://www.blogger.com/atom/ns#">Robotics</category><category domain="http://www.blogger.com/atom/ns#">IR</category><category domain="http://www.blogger.com/atom/ns#">Machine Vision</category><category domain="http://www.blogger.com/atom/ns#">Robots</category><category domain="http://www.blogger.com/atom/ns#">Infrared Proximity Sensor</category><category domain="http://www.blogger.com/atom/ns#">picaxe infra-red</category><category domain="http://www.blogger.com/atom/ns#">Anthony</category><title>Proportional Turning and Path Planning for Autonomous Robot with Infrared Sensors</title><description>This brief video shows the two basic changes to Anthony's control algorithm. When objects are present (Left, Left Mid, Right, and Right Mid sensors), the turning radius is now proportional to the distance from the object. A new method for deciding optimal direction was also added. Instead of arbitrary path planning, based upon the outputs of all sensors, the path of least resistance is selected. Variable speed control is still being tested. As readings indicate objects becoming closer rather than further away, speed will be reduced to eliminate a lack of response time.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/QcyvjCCeCDE&amp;amp;hl=en_US&amp;amp;fs=1&amp;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/QcyvjCCeCDE&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2847927331851767771-3627882874084463112?l=www.quotientrobotics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.quotientrobotics.com/2010/03/proportional-turning-and-path-planning.html</link><author>noreply@blogger.com (David J Barnes)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2847927331851767771.post-7945297106240935772</guid><pubDate>Wed, 24 Feb 2010 04:15:00 +0000</pubDate><atom:updated>2010-02-23T22:16:32.125-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Computer Vision</category><category domain="http://www.blogger.com/atom/ns#">C# Robotics</category><category domain="http://www.blogger.com/atom/ns#">C# Computer Vision</category><category domain="http://www.blogger.com/atom/ns#">Machine Vision</category><category domain="http://www.blogger.com/atom/ns#">Emgu CV</category><title>OpenCV Image Processing Execution Pipeline in C#</title><description>A brief overview of building an image processing execution pipeline application in C# that uses the OpenCV library (OpenCvSharp). This demonstration shows how to stack various filters such as Canny, FloodFill, and Dilate in an execution pipeline. MatchImage is also used to match the cameras current view with a pre-selected image template; in this case a camera tripod stand.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/bap17zSjmsg&amp;amp;hl=en_US&amp;amp;fs=1&amp;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/bap17zSjmsg&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2847927331851767771-7945297106240935772?l=www.quotientrobotics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.quotientrobotics.com/2010/02/opencv-image-processing-execution.html</link><author>noreply@blogger.com (David J Barnes)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2847927331851767771.post-3594046071069253144</guid><pubDate>Tue, 23 Feb 2010 03:51:00 +0000</pubDate><atom:updated>2010-02-22T22:09:01.653-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Computer Vision</category><category domain="http://www.blogger.com/atom/ns#">Human Computer Interaction</category><category domain="http://www.blogger.com/atom/ns#">Robotic Locomotion</category><category domain="http://www.blogger.com/atom/ns#">IR</category><category domain="http://www.blogger.com/atom/ns#">Machine Vision</category><category domain="http://www.blogger.com/atom/ns#">Infrared Proximity Sensor</category><category domain="http://www.blogger.com/atom/ns#">Hobby Robotics</category><category domain="http://www.blogger.com/atom/ns#">Anthony</category><title>Autonomous Robot Navigation using Infrared Sensors</title><description>&lt;span&gt;I mounted 4 of the 6 new Sony IR sensors on Anthony tonight. This gives him much broader range of sensing and allows for much more precise autonomous control (in the future). While he is still rather clumsy, the application code still needs quite a bit more tweaking. Also, IR is meant to supplement the vision system and act only as local detection; it is not his primary means of navigation. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/ldnYXy37G0s&amp;amp;hl=en_US&amp;amp;fs=1&amp;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/ldnYXy37G0s&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2847927331851767771-3594046071069253144?l=www.quotientrobotics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.quotientrobotics.com/2010/02/autonomous-robot-navigation-using_22.html</link><author>noreply@blogger.com (David J Barnes)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2847927331851767771.post-1838701702005753197</guid><pubDate>Sun, 21 Feb 2010 22:53:00 +0000</pubDate><atom:updated>2010-02-21T17:22:38.351-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Computer Vision</category><category domain="http://www.blogger.com/atom/ns#">C# Computer Vision</category><category domain="http://www.blogger.com/atom/ns#">Machine Vision</category><category domain="http://www.blogger.com/atom/ns#">OpenCV</category><category domain="http://www.blogger.com/atom/ns#">Anthony</category><title>Object Detection and Tracking using OpenCV CvMatchTemplate</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ZrKBb68KqHo/S4G5wm7P7ZI/AAAAAAAABFA/ycT3IPwCYkE/s1600-h/OpenCV-CvMatchTemplate-Image-Mathing.PNG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 280px; height: 175px;" src="http://1.bp.blogspot.com/_ZrKBb68KqHo/S4G5wm7P7ZI/AAAAAAAABFA/ycT3IPwCYkE/s320/OpenCV-CvMatchTemplate-Image-Mathing.PNG" alt="" id="BLOGGER_PHOTO_ID_5440834069574184338" border="0" /&gt;&lt;/a&gt;On my way to Florida this past weekend, I finally got a substantial chunk of free-time to dive deep into &lt;a href="http://oreilly.com/catalog/9780596516130"&gt;O'Reilly's Learning OpenCV&lt;/a&gt; (ISBN 0-596-51613-4). As a side note, if you are working with OpenCV or have a desire to learn basic image processing terms and concepts, this is a spectacular read; well worth the $50 USD.&lt;br /&gt;&lt;br /&gt;OpenCV provides a highly robust means of image matching; CvMatchTemplate. The method takes 4 parameters with no overrides. We call it like so:&lt;br /&gt;&lt;br /&gt;Cv.MatchTemplate(R_Source, R_Template, Results, MatchTemplateMethod.CCoeffNormed);&lt;br /&gt;&lt;br /&gt;R_Source represents the source image to be scanned. Note that it must be a single channel image. R_Template is the image that will be scanned across the source image. Again, this image must be single channel. Results, as the name suggests, contains the results of the image scan. I declare all three IplImages as such:&lt;br /&gt;&lt;br /&gt;IplImage R_Source = Cv.CreateImage(Cv.GetSize(SrcFrame), BitDepth.U8, 1);&lt;br /&gt;IplImage R_Template = Cv.CreateImage(Cv.GetSize(Template), BitDepth.U8, 1);&lt;br /&gt;IplImage Results = Cv.CreateImage(Cv.Size(SrcFrame.Width - Template.Width + 1, SrcFrame.Height - Template.Height + 1), BitDepth.F32, 1);&lt;br /&gt;&lt;br /&gt;Then the cvSplit method is used to select out a single channel from the source and the template.&lt;br /&gt;&lt;br /&gt;Cv.Split(SrcFrame, R_Source, null, null, null);&lt;br /&gt;Cv.Split(Template, R_Template, null, null, null);&lt;br /&gt;&lt;br /&gt;Once the channels have been split, we run cvMatchTemplate: Cv.MatchTemplate(R_Source, R_Template, Results, MatchTemplateMethod.CCoeffNormed); In this case the coefficient normalized algorithm is used. Finally cvMinMaxLoc is used to return match coordinates and a confidence interval; based on MatchTemplateMethod.CCoeffNormed.&lt;br /&gt;&lt;br /&gt;Cv.MinMaxLoc(Results, out MinVal, out MaxVal, out MinLoc, out  MaxLoc, null);&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ZrKBb68KqHo/S4G_yfP8CRI/AAAAAAAABFM/xuv9BwebSzQ/s1600-h/Template.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 149px; height: 104px;" src="http://1.bp.blogspot.com/_ZrKBb68KqHo/S4G_yfP8CRI/AAAAAAAABFM/xuv9BwebSzQ/s320/Template.jpg" alt="" id="BLOGGER_PHOTO_ID_5440840698942982418" border="0" /&gt;&lt;/a&gt;The above is a screen shot of the revised application running Image Match. A thumbnail image (to the left) was taken of the tripod handle. Next, that thumbnail was loaded into the application as the template. cvMatchTemplate() runs on each frame of the web cam returning back a positive match with a confidence interval of .61. Normalizing and making additional modifications to the image before matching is one way to increase confidence.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2847927331851767771-1838701702005753197?l=www.quotientrobotics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.quotientrobotics.com/2010/02/object-detection-and-tracking-using.html</link><author>noreply@blogger.com (David J Barnes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_ZrKBb68KqHo/S4G5wm7P7ZI/AAAAAAAABFA/ycT3IPwCYkE/s72-c/OpenCV-CvMatchTemplate-Image-Mathing.PNG" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2847927331851767771.post-2638916328049983582</guid><pubDate>Tue, 16 Feb 2010 03:46:00 +0000</pubDate><atom:updated>2010-02-15T22:00:31.294-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">DC Motors</category><category domain="http://www.blogger.com/atom/ns#">Computer Vision</category><category domain="http://www.blogger.com/atom/ns#">Robotic Locomotion</category><category domain="http://www.blogger.com/atom/ns#">Robotics</category><category domain="http://www.blogger.com/atom/ns#">mobile robot</category><category domain="http://www.blogger.com/atom/ns#">Machine Vision</category><category domain="http://www.blogger.com/atom/ns#">Vision Algorithms</category><category domain="http://www.blogger.com/atom/ns#">Hobby Robotics</category><category domain="http://www.blogger.com/atom/ns#">Anthony</category><title>Autonomous Robot Test using Sony IR, A Supplement to Vision</title><description>&lt;span&gt;This is a crude, crude autonomous test and is the very beginning to supplementing the primary vision system with tactical IR sensors. The test reveals that more sensors are clearly needed. The robot has a limited sense of its surroundings but is able to adapt and move quickly due to its tri-cycle locomotion. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;After additional sensors are attached and a mounting scheme is selected, I will begin working on the feedback control of the tactical sensors into the vision platform. In addition, the current method for turning will be modified. A linear and exponential method will be used. Servo steering adjustments will be calculated as:&lt;br /&gt;&lt;br /&gt;PctgOfDist = SensorLeft1Val / 128&lt;br /&gt;TurnVal = 150 - (PctgOfDist * 50)&lt;br /&gt;&lt;br /&gt;Where 128 is the value received by the sensor when no object is present; 150 is the center point of the servo, 50 is the width from servo center to servo full left. The result is a linear servo adjustment proportional to how close the object is to that particular sensor.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/y2H9iBTAA4c&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/y2H9iBTAA4c&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2847927331851767771-2638916328049983582?l=www.quotientrobotics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.quotientrobotics.com/2010/02/autonomous-robot-test-using-sony-ir.html</link><author>noreply@blogger.com (David J Barnes)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2847927331851767771.post-7950150871636951904</guid><pubDate>Thu, 11 Feb 2010 04:03:00 +0000</pubDate><atom:updated>2010-02-10T22:25:32.497-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Open CV</category><category domain="http://www.blogger.com/atom/ns#">Computer Vision</category><category domain="http://www.blogger.com/atom/ns#">C# Robotics</category><category domain="http://www.blogger.com/atom/ns#">C# Computer Vision</category><category domain="http://www.blogger.com/atom/ns#">Machine Vision</category><category domain="http://www.blogger.com/atom/ns#">Vision Algorithms</category><title>OpenCV &amp; EmguCV using cvFloodFill and Canny Edge Detection</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZrKBb68KqHo/S3OCRWJBbLI/AAAAAAAABDo/SomkwT9n7C0/s1600-h/NoFloodFill.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 220px; height: 165px;" src="http://4.bp.blogspot.com/_ZrKBb68KqHo/S3OCRWJBbLI/AAAAAAAABDo/SomkwT9n7C0/s320/NoFloodFill.JPG" alt="" id="BLOGGER_PHOTO_ID_5436832409679129778" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZrKBb68KqHo/S3OCUzCDOJI/AAAAAAAABDw/_z9QF7beh_4/s1600-h/FloodFill.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 220px; height: 165px;" src="http://4.bp.blogspot.com/_ZrKBb68KqHo/S3OCUzCDOJI/AAAAAAAABDw/_z9QF7beh_4/s320/FloodFill.JPG" alt="" id="BLOGGER_PHOTO_ID_5436832468974123154" border="0" /&gt;&lt;/a&gt;The &lt;a href="http://en.wikipedia.org/wiki/Flood_fill"&gt;FloodFill&lt;/a&gt; algorithm is an excellent way to fill in an object with a replacement color. While this sounds trivial, this is a very meaningful step in vision-based path planning. In this example I focus the camera on a small lamp head (~6m away). Using a Canny edge detector (&lt;a href="http://www.quotientrobotics.com/2010/02/autonomous-robot-navigation-using.html"&gt;prior example&lt;/a&gt;) method, I pass in a threshold and threshold linking value. This creates rough outlines of the objects in the cameras line of sight. Next, the cvFloodFill method is used to fill in neighboring pixels with an updated value. The cvFloodFill code is as follows:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;Image&lt;gray,&gt; mask = new Image&lt;gray,&gt;(ImageColor.Width + 2, ImageColor.Height + 2);&lt;/gray,&gt;&lt;/gray,&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;MCvConnectedComp comp = new MCvConnectedComp();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;CvInvoke.cvFloodFill(ImageColor.Ptr, new System.Drawing.Point(Convert.ToInt32(this.FrmFillPointX.Value), Convert.ToInt32(this.FrmFillPointY.Value)), new MCvScalar(Convert.ToDouble(this.FrmFillNewVal.Value)), new MCvScalar(Convert.ToDouble(this.FrmFillLowDiff.Value)), new MCvScalar(Convert.ToDouble(this.FrmFillUpDiff.Value)), out comp, Emgu.CV.CvEnum.CONNECTIVITY.FOUR_CONNECTED, Emgu.CV.CvEnum.FLOODFILL_FLAG.DEFAULT, mask);&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;The interface shown is &lt;a href="http://www.quotientrobotics.com/2009/11/computer-vision-in-c-using-opencv-emgu.html"&gt;an application I am working on&lt;/a&gt; that arranges various methods and algorithms into an execution pipeline. Doing so decreases the learning curve when tampering with various arrangements and provides immediate visual feedback. Each filter is applied one on top of the other resulting in a combination of outcomes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2847927331851767771-7950150871636951904?l=www.quotientrobotics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.quotientrobotics.com/2010/02/opencv-emgucv-using-cvfloodfill-and.html</link><author>noreply@blogger.com (David J Barnes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_ZrKBb68KqHo/S3OCRWJBbLI/AAAAAAAABDo/SomkwT9n7C0/s72-c/NoFloodFill.JPG" height="72" width="72" /><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2847927331851767771.post-4486105238905583903</guid><pubDate>Fri, 05 Feb 2010 04:10:00 +0000</pubDate><atom:updated>2010-02-04T22:52:31.337-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Computer Vision</category><category domain="http://www.blogger.com/atom/ns#">RoboRealm API</category><category domain="http://www.blogger.com/atom/ns#">C# Robotics</category><category domain="http://www.blogger.com/atom/ns#">C# Computer Vision</category><category domain="http://www.blogger.com/atom/ns#">Machine Vision</category><category domain="http://www.blogger.com/atom/ns#">Vision Algorithms</category><category domain="http://www.blogger.com/atom/ns#">RoboRealm</category><category domain="http://www.blogger.com/atom/ns#">Anthony</category><title>Autonomous Robot Navigation using Vision Algorithms</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZrKBb68KqHo/S2uahliIpgI/AAAAAAAABC4/7yPovHQ1ErY/s1600-h/Floor+Plain.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 220px; height: 165px;" src="http://4.bp.blogspot.com/_ZrKBb68KqHo/S2uahliIpgI/AAAAAAAABC4/7yPovHQ1ErY/s320/Floor+Plain.jpg" alt="" id="BLOGGER_PHOTO_ID_5434607277154280962" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZrKBb68KqHo/S2uanawVpQI/AAAAAAAABDA/9isi1OisZqg/s1600-h/Floor+Canny.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 220px; height: 165px;" src="http://4.bp.blogspot.com/_ZrKBb68KqHo/S2uanawVpQI/AAAAAAAABDA/9isi1OisZqg/s320/Floor+Canny.jpg" alt="" id="BLOGGER_PHOTO_ID_5434607377340278018" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ZrKBb68KqHo/S2uaxv-H9XI/AAAAAAAABDI/PnHtECZ4dLY/s1600-h/Floor+Side+Fill.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 220px; height: 165px;" src="http://3.bp.blogspot.com/_ZrKBb68KqHo/S2uaxv-H9XI/AAAAAAAABDI/PnHtECZ4dLY/s320/Floor+Side+Fill.jpg" alt="" id="BLOGGER_PHOTO_ID_5434607554833937778" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ZrKBb68KqHo/S2ubJuUfv_I/AAAAAAAABDY/VdPJRFghqV0/s1600-h/Floor+Erode.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 220px; height: 165px;" src="http://3.bp.blogspot.com/_ZrKBb68KqHo/S2ubJuUfv_I/AAAAAAAABDY/VdPJRFghqV0/s320/Floor+Erode.jpg" alt="" id="BLOGGER_PHOTO_ID_5434607966707761138" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I will be using a hybrid sensor approach to empower &lt;a href="http://www.quotientrobotics.com/search/label/Anthony"&gt;Anthony's&lt;/a&gt; autonomous nature. Binocular vision feedback will serve as the overarching path planning while RF and IR will provide local object detection yet have higher priority placed on its findings than that of the vision system. The purpose of this post is not to fully describe the hybrid approach nor to discuss the multiple tiers of processing. This is a quick overview of one method for using vision filters and algorithms to autonomously navigate a robot.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ZrKBb68KqHo/S2ubOtfyZmI/AAAAAAAABDg/nn7BUi4Wsic/s1600-h/Floor+Smooth+Hull.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 220px; height: 165px;" src="http://2.bp.blogspot.com/_ZrKBb68KqHo/S2ubOtfyZmI/AAAAAAAABDg/nn7BUi4Wsic/s320/Floor+Smooth+Hull.jpg" alt="" id="BLOGGER_PHOTO_ID_5434608052386031202" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ZrKBb68KqHo/S2ubC4KiY3I/AAAAAAAABDQ/DOKgHciEnsA/s1600-h/Floor+Masked.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 220px; height: 165px;" src="http://3.bp.blogspot.com/_ZrKBb68KqHo/S2ubC4KiY3I/AAAAAAAABDQ/DOKgHciEnsA/s320/Floor+Masked.jpg" alt="" id="BLOGGER_PHOTO_ID_5434607849091261298" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Each image was take from the robot's point of view. I have enlisted a series of 5 steps to defining an object free path. First apply a &lt;a href="http://en.wikipedia.org/wiki/Canny_edge_detector"&gt;canny edge detector&lt;/a&gt;. A &lt;a href="http://en.wikipedia.org/wiki/Gaussian_blur"&gt;Gaussian blur&lt;/a&gt; will help eliminate any extensive noise in the image.&lt;br /&gt;&lt;br /&gt;Next, isolate and mask in the area nearest the bottom of the image and mask in pixel by pixel until you hit an edge line. RoboRealm has a lovely SideFill filter for this allowing filling from anyone of the 4 primary angles.&lt;br /&gt;&lt;br /&gt;Erode your result to blow out any hanging pixels or eliminate noise. Objects that have a low level of connectivity will likely disappear all together depending on the intensity applied. In addition, apply a smooth hull filter to smooth blob shapes. A 100% weight replaces the original outline with the averaged one.&lt;br /&gt;&lt;br /&gt;Finally, use point location, X and Y variables, to visually represent the highest, most center white space of the image. This x,y pair represents the robots destination and is overwritten in the image as a pink dot.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ZrKBb68KqHo/S2uaxv-H9XI/AAAAAAAABDI/PnHtECZ4dLY/s1600-h/Floor+Side+Fill.jpg"&gt;&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2847927331851767771-4486105238905583903?l=www.quotientrobotics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.quotientrobotics.com/2010/02/autonomous-robot-navigation-using.html</link><author>noreply@blogger.com (David J Barnes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_ZrKBb68KqHo/S2uahliIpgI/AAAAAAAABC4/7yPovHQ1ErY/s72-c/Floor+Plain.jpg" height="72" width="72" /><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2847927331851767771.post-1038771619451536044</guid><pubDate>Tue, 02 Feb 2010 03:29:00 +0000</pubDate><atom:updated>2010-02-01T21:48:13.490-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Computer Vision</category><category domain="http://www.blogger.com/atom/ns#">Robotic Locomotion</category><category domain="http://www.blogger.com/atom/ns#">mobile robot</category><category domain="http://www.blogger.com/atom/ns#">C# Robotics</category><category domain="http://www.blogger.com/atom/ns#">C# Computer Vision</category><category domain="http://www.blogger.com/atom/ns#">Artificial Intelligence</category><category domain="http://www.blogger.com/atom/ns#">Machine Vision</category><category domain="http://www.blogger.com/atom/ns#">Mechanical Robotics</category><category domain="http://www.blogger.com/atom/ns#">BaneBots</category><category domain="http://www.blogger.com/atom/ns#">Anthony</category><title>Autonomous Robot Anthony - Quick Overview &amp; Test Drive</title><description>A brief Anthony update component by component ending with a quick test drive. The two batteries are not sourced together. They are 12 vdc @ 12a. The system uses a total of 6 1/2" bearing blocks from Burden Supply, 1/8" mild steel for support, 1-1/4" aluminum square tube, epvc as a platform, 2 PICAXE micro controllers, 8 12" threaded rods, 1 Banebot gearbox motor, and 1 ServoCity gearbox. The Asus laptop is running RoboRealm but is not yet integrated into the system.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/8110OVg9xk0&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/8110OVg9xk0&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2847927331851767771-1038771619451536044?l=www.quotientrobotics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.quotientrobotics.com/2010/02/autonomous-robot-anthony-quick-overview.html</link><author>noreply@blogger.com (David J Barnes)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2847927331851767771.post-5424842390223287580</guid><pubDate>Sat, 23 Jan 2010 02:52:00 +0000</pubDate><atom:updated>2010-01-25T15:08:45.575-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Robot Prototyping</category><category domain="http://www.blogger.com/atom/ns#">Robotic Locomotion</category><category domain="http://www.blogger.com/atom/ns#">Mechanical Robotics</category><category domain="http://www.blogger.com/atom/ns#">Anthony</category><title>Autonomous Robot Anthony's Mechanical Structure</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ZrKBb68KqHo/S1plaI1wvkI/AAAAAAAABCY/Z5q83mtNPg0/s1600-h/Anthony+V2+007.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 150px; height: 200px;" src="http://1.bp.blogspot.com/_ZrKBb68KqHo/S1plaI1wvkI/AAAAAAAABCY/Z5q83mtNPg0/s320/Anthony+V2+007.jpg" alt="" id="BLOGGER_PHOTO_ID_5429763800472534594" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZrKBb68KqHo/S1pqoxQ8NmI/AAAAAAAABCw/qA3XCQPLkO8/s1600-h/Anthony+V2+002.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 150px; height: 200px;" src="http://4.bp.blogspot.com/_ZrKBb68KqHo/S1pqoxQ8NmI/AAAAAAAABCw/qA3XCQPLkO8/s320/Anthony+V2+002.jpg" alt="" id="BLOGGER_PHOTO_ID_5429769549400258146" border="0" /&gt;&lt;/a&gt;Deciding to change the drive train structure of &lt;a href="http://www.quotientrobotics.com/search/label/Anthony"&gt;Anthony&lt;/a&gt; resulted in a full-blown rebuild keeping nothing from the original machine except a single motor, a few bearing blocks, and an otherwise meaningless name. If I were ignorant to the danger of welding in a downtown Chicago residential condo, this would have been an ideal job for a TIG or MIG. As a backup to welding, I decided to work with what I consider adult Tinker Toys; a slew of 1/2" threaded rod, aluminum square tube, and epvc. One of the very nice benefits of working with these materials is the adjust-ability. Meaning chain tension, for instance, can easily be adjusted with a wrench just by modifying the height of its mounting plate. This goes for many aspects of the project. This also proved helpful when trying to perfectly position the servo's control arms with the rear wheel.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ZrKBb68KqHo/S1plg3qSWGI/AAAAAAAABCg/uSqTJKk9534/s1600-h/Anthony+V2+008.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 150px; height: 199px;" src="http://2.bp.blogspot.com/_ZrKBb68KqHo/S1plg3qSWGI/AAAAAAAABCg/uSqTJKk9534/s320/Anthony+V2+008.jpg" alt="" id="BLOGGER_PHOTO_ID_5429763916120086626" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ZrKBb68KqHo/S1plqZTlLFI/AAAAAAAABCo/gy1pn0O1iwI/s1600-h/Anthony+V2+006.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 150px; height: 200px;" src="http://3.bp.blogspot.com/_ZrKBb68KqHo/S1plqZTlLFI/AAAAAAAABCo/gy1pn0O1iwI/s320/Anthony+V2+006.jpg" alt="" id="BLOGGER_PHOTO_ID_5429764079770479698" border="0" /&gt;&lt;/a&gt;The new structure weighs roughly 50lbs without batteries, electronics, or chassis cover. It has rock solid durability and is sturdy enough to hold my weight; 180lbs. Once new shelves are threaded into place (to house electronics) I am going to begin working on the external cover crafted from fiberglass resin and nylon stretch cloth.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2847927331851767771-5424842390223287580?l=www.quotientrobotics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.quotientrobotics.com/2010/01/autonomous-robot-anthonys-mechanical.html</link><author>noreply@blogger.com (David J Barnes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_ZrKBb68KqHo/S1plaI1wvkI/AAAAAAAABCY/Z5q83mtNPg0/s72-c/Anthony+V2+007.jpg" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2847927331851767771.post-8420601630997559322</guid><pubDate>Sat, 09 Jan 2010 03:39:00 +0000</pubDate><atom:updated>2010-01-13T20:37:24.971-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">DC Motors</category><category domain="http://www.blogger.com/atom/ns#">Robot Parts</category><category domain="http://www.blogger.com/atom/ns#">Robot Prototyping</category><category domain="http://www.blogger.com/atom/ns#">Robotic Locomotion</category><category domain="http://www.blogger.com/atom/ns#">parts of robots</category><category domain="http://www.blogger.com/atom/ns#">mobile robot</category><category domain="http://www.blogger.com/atom/ns#">Mechanical Robotics</category><category domain="http://www.blogger.com/atom/ns#">BaneBots</category><category domain="http://www.blogger.com/atom/ns#">PICAXE</category><category domain="http://www.blogger.com/atom/ns#">Anthony</category><title>ServoCity High Torque Gearbox for Robotic Steering Control</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ZrKBb68KqHo/S0f61WPELFI/AAAAAAAABB8/xMTHUjzatRs/s1600-h/Anthony+Wheel+005.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 150px; height: 199px;" src="http://3.bp.blogspot.com/_ZrKBb68KqHo/S0f61WPELFI/AAAAAAAABB8/xMTHUjzatRs/s320/Anthony+Wheel+005.jpg" alt="" id="BLOGGER_PHOTO_ID_5424580070599830610" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZrKBb68KqHo/S0f67HUaaGI/AAAAAAAABCE/PlZAFt5eUbU/s1600-h/Anthony+Wheel+006.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 150px; height: 200px;" src="http://4.bp.blogspot.com/_ZrKBb68KqHo/S0f67HUaaGI/AAAAAAAABCE/PlZAFt5eUbU/s320/Anthony+Wheel+006.jpg" alt="" id="BLOGGER_PHOTO_ID_5424580169674942562" border="0" /&gt;&lt;/a&gt;Precision turning, accuracy, and motor encoding are always of utmost importance when designing a mobile robot. If your vehicle can't drive a  straight line, precisely, you are well behind the eight ball before you face any real challenges.&lt;br /&gt;&lt;br /&gt;With my latest robot &lt;a href="http://www.quotientrobotics.com/2009/12/machine-vision-robotics-platform-opencv.html"&gt;Anthony&lt;/a&gt;, I strive to make this a concern of the past by developing a new mechanism that will control both forward momentum as well as turning. The solution consists of a single assembly that resembles a motor-powered unicycle. The idea is that both steering and propulsion will be controlled from the assembly which is mounted at the rear of the robot. As apposed to traditional drive trains, this vehicles locomotion only uses a single wheel. The upside to this is there are no other motors to calibrate to. The challenge then becomes steering.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ZrKBb68KqHo/S06CR4xF97I/AAAAAAAABCM/ajawotEzNNE/s1600-h/Anthony+Wheel.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 150px; height: 199px;" src="http://1.bp.blogspot.com/_ZrKBb68KqHo/S06CR4xF97I/AAAAAAAABCM/ajawotEzNNE/s320/Anthony+Wheel.jpg" alt="" id="BLOGGER_PHOTO_ID_5426417844835710898" border="0" /&gt;&lt;/a&gt;Hobby servos have very limited torque. As I was searching for stepper motors that could provide me the force needed to turn the assembly, I stumbled across ServoCity's line of &lt;a href="http://www.servocity.com/html/heavy-duty_pan_systems.html"&gt;heavy duty pan systems&lt;/a&gt;. At a relatively low price point, I had to try one. I went with an &lt;a href="http://www.servocity.com/html/spg785a-bm_bottom_mount.html"&gt;SPG785A-BM&lt;/a&gt;. It boasts an amazing 1,315 oz-in of torque at 4.8vdc with the same precision as a standard hobby servo.&lt;br /&gt;&lt;br /&gt;In the images show the servo mounted directly to the top of the assembly, or the headset. After some testing, this is a huge flaw and stress point for the assembly. The new plan is to relocate the servo elsewhere allowing the assembly to attach to the rear of the robot with a bearing and arm assembly. The servo will then use something like tie rods or control arms to swivel the assembly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2847927331851767771-8420601630997559322?l=www.quotientrobotics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.quotientrobotics.com/2010/01/servocity-high-torque-gearbox-for.html</link><author>noreply@blogger.com (David J Barnes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_ZrKBb68KqHo/S0f61WPELFI/AAAAAAAABB8/xMTHUjzatRs/s72-c/Anthony+Wheel+005.jpg" height="72" width="72" /><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2847927331851767771.post-9068291592126604367</guid><pubDate>Wed, 30 Dec 2009 20:55:00 +0000</pubDate><atom:updated>2010-01-21T14:48:11.459-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">C# Computer Vision</category><category domain="http://www.blogger.com/atom/ns#">Sony Handycam</category><category domain="http://www.blogger.com/atom/ns#">Sony LANC</category><category domain="http://www.blogger.com/atom/ns#">Sony Control-L</category><category domain="http://www.blogger.com/atom/ns#">C#</category><category domain="http://www.blogger.com/atom/ns#">FT232R</category><category domain="http://www.blogger.com/atom/ns#">Anthony</category><title>Programmatically Control Sony LANC Camcorder via ELM624</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZrKBb68KqHo/Szu-SmroYDI/AAAAAAAABB0/Vj3ud6FSpHI/s1600-h/Sony_LANC_ELM624.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 300px; height: 225px;" src="http://4.bp.blogspot.com/_ZrKBb68KqHo/Szu-SmroYDI/AAAAAAAABB0/Vj3ud6FSpHI/s320/Sony_LANC_ELM624.jpg" alt="" id="BLOGGER_PHOTO_ID_5421135803300995122" border="0" /&gt;&lt;/a&gt;A few weeks ago I started doing some research on controlling a Sony camcorder programmatically. I was hoping to work directly with a Picaxe or AVR micro controller but stumbled upon a nice dedicated device designed specifically for interfacing RS232 circuits with the LANC protocol. The ELM624 (&lt;a href="http://www.elmelectronics.com/DSheets/ELM624DS.pdf"&gt;datasheet&lt;/a&gt;) is designed by &lt;a href="http://www.elmelectronics.com/"&gt;Elm Electronics&lt;/a&gt; and is built on the PIC12C5XX chip. It abstracts all the complex micro-second timing needs of the LANC protocol and allows for easy integration into any circuit.&lt;br /&gt;&lt;br /&gt;As the datasheet shows, connecting with a traditional RS232 interface is quite simple. For my installation, I decided to use an &lt;a href="http://www.quotientrobotics.com/2009/07/ft232r-breakout-board-uart.html"&gt;FT232R USB&lt;/a&gt; converter (connected directly to a PC C# application). One of the many nice things about this piece of hardware is its flexible EEPROM program-ability. Since the ELM624 signal needs to be inverted you would ordinarily need additional hardware (NPN transistor, resistors, etc). Simply modify the EEPROM settings in the FT232R and save yourself the extra component configuration.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Helpful Links:&lt;/span&gt;&lt;br /&gt;Sony LANC (Control-L) Protocol Overview: &lt;a href="http://www.boehmel.de/lanc.htm"&gt;http://www.boehmel.de/lanc.htm&lt;/a&gt;&lt;br /&gt;Hardware and Software: &lt;a href="http://www.avitresearch.com/"&gt;http://www.avitresearch.com/&lt;/a&gt;&lt;br /&gt;Elm Electronics (ELM624 and various others): &lt;a href="http://www.elmelectronics.com/"&gt;http://www.elmelectronics.com/&lt;/a&gt;&lt;br /&gt;General Overview and Sample VB Application: &lt;a href="http://www.esac.org.uk/SonyLancControl.asp"&gt;http://www.esac.org.uk/SonyLancControl.asp&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2847927331851767771-9068291592126604367?l=www.quotientrobotics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.quotientrobotics.com/2009/12/programmatically-control-sony-lanc.html</link><author>noreply@blogger.com (David J Barnes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_ZrKBb68KqHo/Szu-SmroYDI/AAAAAAAABB0/Vj3ud6FSpHI/s72-c/Sony_LANC_ELM624.jpg" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2847927331851767771.post-2263430197803284184</guid><pubDate>Mon, 21 Dec 2009 01:35:00 +0000</pubDate><atom:updated>2010-01-08T21:48:55.500-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Drunk Robotics</category><category domain="http://www.blogger.com/atom/ns#">Human Computer Interaction</category><category domain="http://www.blogger.com/atom/ns#">Robot Prototyping</category><category domain="http://www.blogger.com/atom/ns#">Robot Communication</category><category domain="http://www.blogger.com/atom/ns#">Robotic Locomotion</category><category domain="http://www.blogger.com/atom/ns#">Robotics</category><category domain="http://www.blogger.com/atom/ns#">Robots</category><category domain="http://www.blogger.com/atom/ns#">Anthony</category><title>Robot Canine Interaction</title><description>Anthony is my latest robot. He is an application I am working on for my PhD research proposal [On Enhanced Control and Interaction with Robots using Hybrid Vision Sensors].&lt;br /&gt;&lt;br /&gt;Robots are always more fun once you've got a few cocktails in you. In the below video we demonstrate that fun as we chase Turi around the kitchen. I'd love to one day take Anthony out on the streets of Chicago and get footage of him interacting with pedestrians, dogs, or anything that moves.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/tLlYFrbcpjk&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/tLlYFrbcpjk&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2847927331851767771-2263430197803284184?l=www.quotientrobotics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.quotientrobotics.com/2009/12/robot-canine-interaction.html</link><author>noreply@blogger.com (David J Barnes)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2847927331851767771.post-7980059326708210547</guid><pubDate>Sun, 13 Dec 2009 17:02:00 +0000</pubDate><atom:updated>2009-12-13T11:09:47.223-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Drunk Robotics</category><category domain="http://www.blogger.com/atom/ns#">David J Barnes</category><category domain="http://www.blogger.com/atom/ns#">Toy Robots</category><category domain="http://www.blogger.com/atom/ns#">Mechanical Robotics</category><title>Mechanical Toy Robot</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ZrKBb68KqHo/SyUeWuXzKmI/AAAAAAAABBs/8UWK8OdVc1M/s1600-h/Mechanical_Toy_Robot.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 220px; height: 293px;" src="http://1.bp.blogspot.com/_ZrKBb68KqHo/SyUeWuXzKmI/AAAAAAAABBs/8UWK8OdVc1M/s320/Mechanical_Toy_Robot.jpg" alt="" id="BLOGGER_PHOTO_ID_5414767502736697954" border="0" /&gt;&lt;/a&gt;December 11th was my thirtieth birthday, a day I won't soon forget. From running keg stands to mechanical toy robot gifts, nearly everything was perfect. Unfortunately I was unable to snag video of a severely intoxicated friend interacting with my latest &lt;a href="http://www.quotientrobotics.com/2009/12/machine-vision-robotics-platform-opencv.html"&gt;trashcan-based robot&lt;/a&gt;. Thank you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2847927331851767771-7980059326708210547?l=www.quotientrobotics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.quotientrobotics.com/2009/12/mechanical-toy-robot.html</link><author>noreply@blogger.com (David J Barnes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_ZrKBb68KqHo/SyUeWuXzKmI/AAAAAAAABBs/8UWK8OdVc1M/s72-c/Mechanical_Toy_Robot.jpg" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2847927331851767771.post-4126863099445447358</guid><pubDate>Fri, 04 Dec 2009 01:36:00 +0000</pubDate><atom:updated>2010-01-21T12:02:34.723-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Computer Vision</category><category domain="http://www.blogger.com/atom/ns#">Robot Prototyping</category><category domain="http://www.blogger.com/atom/ns#">C# Robotics</category><category domain="http://www.blogger.com/atom/ns#">Artificial Intelligence</category><category domain="http://www.blogger.com/atom/ns#">Machine Vision</category><category domain="http://www.blogger.com/atom/ns#">PICAXE-40X1</category><category domain="http://www.blogger.com/atom/ns#">Mechanical Robotics</category><category domain="http://www.blogger.com/atom/ns#">BaneBots</category><category domain="http://www.blogger.com/atom/ns#">Encoder Divider Board</category><category domain="http://www.blogger.com/atom/ns#">H-Bridge</category><category domain="http://www.blogger.com/atom/ns#">Anthony</category><title>Machine Vision Robotics Platform - OpenCV &amp; EmguCV</title><description>A quick overview of my current machine vision platform. The robot currently features a trash can shell, 12" mag wheels, 1/2" steel axles, 2 Banebot RS-540 motors with encoders, encoder divider boards, Sabertooth 2x10 motor controller, and a PICAXE 40x1 micro controller.&lt;br /&gt;&lt;br /&gt;After wiring of the basic system components is complete I will begin to integrate the PC laptop which will act as the main processing unit. A USART interface between the micro controller(s) and the PC will exchange data about direction, speed, vision parameters, etc.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/wOdk4qyWZ5E&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/wOdk4qyWZ5E&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2847927331851767771-4126863099445447358?l=www.quotientrobotics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.quotientrobotics.com/2009/12/machine-vision-robotics-platform-opencv.html</link><author>noreply@blogger.com (David J Barnes)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2847927331851767771.post-3204091895129766111</guid><pubDate>Thu, 19 Nov 2009 20:54:00 +0000</pubDate><atom:updated>2009-12-01T20:47:32.764-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Open CV</category><category domain="http://www.blogger.com/atom/ns#">Haar Training</category><category domain="http://www.blogger.com/atom/ns#">C# Computer Vision</category><category domain="http://www.blogger.com/atom/ns#">Machine Vision</category><category domain="http://www.blogger.com/atom/ns#">HaarCascade</category><category domain="http://www.blogger.com/atom/ns#">Haar Detection</category><category domain="http://www.blogger.com/atom/ns#">Emgu CV</category><title>HaarCascade Training Resources for OpenCV and Computer Vision Algorithms</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ZrKBb68KqHo/SxXUWHLzG7I/AAAAAAAABBg/joQB0fgmMKE/s1600/Haar-Like_Features_HandsForScience_org.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 266px;" src="http://3.bp.blogspot.com/_ZrKBb68KqHo/SxXUWHLzG7I/AAAAAAAABBg/joQB0fgmMKE/s320/Haar-Like_Features_HandsForScience_org.jpg" alt="" id="BLOGGER_PHOTO_ID_5410464003706264498" border="0" /&gt;&lt;/a&gt;My interest in machine &amp;amp; computer vision is growing each day. Each time I crack open the web or continue development of my &lt;a href="http://www.quotientrobotics.com/2009/11/computer-vision-in-c-using-opencv-emgu.html"&gt;QRCV application&lt;/a&gt;, I get sucked deeper and deeper into a world of unknown terminology and bitwise operators that I am only beginning to grasp. One of the many ambitious goals I have for my current robot is understanding hand gestures, understanding the gesture then taking the appropriate action. The beginning to all of this starts with learning the human hand. There are various methods to detect a hand; color, shape, orientation, etc. I have decided to take the route of using haar training to detect my hand(s). Some quick research on haar-like features and haar training led me to the below links.&lt;br /&gt;&lt;br /&gt;After grooming through pages of documentation on haar training, it appears I need a ton (2,000 - 10,000 optimally) of hand photos. In the name of science and good will towards men, I have decided to launch &lt;a href="http://www.HandsForScience.org?From=QR"&gt;www.HandsForScience.org&lt;/a&gt;. A site dedicated to collecting as many unique hands as possible. Once the site fully launches, hopefully people will see past the creepiness of photographing their hand (others hands?) and upload them for science. The goal is to collect thousands then compile and train.&lt;br /&gt;&lt;br /&gt;Some excellent resources for haar-like features and haar training:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://lab.cntl.kyutech.ac.jp/%7Ekobalab/nishida/opencv/OpenCV_ObjectDetection_HowTo.pdf"&gt;http://lab.cntl.kyutech.ac.jp/~kobalab/nishida/opencv/OpenCV_ObjectDetection_HowTo.pdf&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://note.sonots.com/SciSoftware/haartraining.html"&gt;http://note.sonots.com/SciSoftware/haartraining.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://sandarenu.blogspot.com/search/label/OpenCV"&gt;http://sandarenu.blogspot.com/search/label/OpenCV&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2847927331851767771-3204091895129766111?l=www.quotientrobotics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.quotientrobotics.com/2009/11/haarcascade-training-resources-for.html</link><author>noreply@blogger.com (David J Barnes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_ZrKBb68KqHo/SxXUWHLzG7I/AAAAAAAABBg/joQB0fgmMKE/s72-c/Haar-Like_Features_HandsForScience_org.jpg" height="72" width="72" /><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2847927331851767771.post-3814397408613320317</guid><pubDate>Fri, 13 Nov 2009 19:44:00 +0000</pubDate><atom:updated>2009-11-13T13:48:09.148-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">C# Robotics</category><category domain="http://www.blogger.com/atom/ns#">C# Computer Vision</category><category domain="http://www.blogger.com/atom/ns#">OpenCV</category><category domain="http://www.blogger.com/atom/ns#">Face Recognition</category><category domain="http://www.blogger.com/atom/ns#">Emgu CV</category><category domain="http://www.blogger.com/atom/ns#">Skin Recognition</category><title>Computer Vision in C# using OpenCV &amp; Emgu CV</title><description>&lt;span&gt;&lt;a href="http://en.wikipedia.org/wiki/OpenCV"&gt;OpenCV &lt;/a&gt;is a computer vision library originally developed by Intel. &lt;a href="http://www.emgu.com/wiki/index.php/Main_Page"&gt;Emgu CV&lt;/a&gt; is a cross platform .Net wrapper for OpenCV. This is a quick intro to what I call "Quotient Robotics CV"; my C# application that leverages both existing technologies and a RoboRealm-influenced flow of filters and algorithms. It is a work in progress and only features basic threshold, contour, face recognition, skin detection, and drawing filters.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/jjyjQBOd7d8&amp;amp;hl=en_US&amp;amp;fs=1&amp;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/jjyjQBOd7d8&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2847927331851767771-3814397408613320317?l=www.quotientrobotics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.quotientrobotics.com/2009/11/computer-vision-in-c-using-opencv-emgu.html</link><author>noreply@blogger.com (David J Barnes)</author><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2847927331851767771.post-7484900874982095804</guid><pubDate>Tue, 10 Nov 2009 21:18:00 +0000</pubDate><atom:updated>2009-11-10T15:43:53.531-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Open CV</category><category domain="http://www.blogger.com/atom/ns#">C# Robotics</category><category domain="http://www.blogger.com/atom/ns#">Machine Vision</category><category domain="http://www.blogger.com/atom/ns#">C# Face Detection</category><category domain="http://www.blogger.com/atom/ns#">Emgu CV</category><title>Machine Vision - Emgu CV the Open CV Wrapper</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ZrKBb68KqHo/SvnY5bENeHI/AAAAAAAABBY/0opbwQ0MB6A/s1600-h/Emgu+CV+Face+Detection.bmp"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 300px; height: 302px;" src="http://2.bp.blogspot.com/_ZrKBb68KqHo/SvnY5bENeHI/AAAAAAAABBY/0opbwQ0MB6A/s320/Emgu+CV+Face+Detection.bmp" alt="" id="BLOGGER_PHOTO_ID_5402587709037181042" border="0" /&gt;&lt;/a&gt;I have spent the last few weeks working with &lt;a href="http://www.roborealm.com/"&gt;RoboRealm&lt;/a&gt;, a machine vision application offering various filters including blob separation, image and shape match, thresholds, etc. Although I enjoy all of their canned filters and API access methods, I have been getting frustrated not being able to easily implement some of the algorithms I'd like to.&lt;br /&gt;&lt;br /&gt;I have heard plenty about &lt;a href="http://en.wikipedia.org/wiki/OpenCV"&gt;Open CV&lt;/a&gt;; a computer vision library originally developed by Intel, but never fiddled with it. It wasn't until I learned of a C# wrapper, rather a multi-language wrapper called &lt;a href="http://www.emgu.com/wiki/index.php/Main_Page"&gt;Emgu CV&lt;/a&gt; that I decided to do further investigation. Emgu CV is a stable and well supported alternative to Open CV.Net, another C# wrapper for Open CV. Their &lt;a href="http://www.emgu.com/wiki/files/2.0.1.0/Index.html"&gt;documentation&lt;/a&gt; is well formatted and have an active community committed to the development of the platform. Unlike Open CV.net, Emgu CV supports the latest version of Open CV (2.0).&lt;br /&gt;&lt;br /&gt;The above image is the result of a simple face detection application using the HaarCascade objects. A file stream can be captured from a camera device or an avi file. E.g.:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;Capture capture = capture = new Capture(0);&lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt; //Obtains default camera device 0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;Capture capture = capture = new Capture("My_AVI.avi"); &lt;span style="color: rgb(51, 153, 153);"&gt;//Grabs the enclosed avi for processing&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When deploying your application, be sure to include the following libraries found in the Emgu CV bin directory: cv200.dll, cvaux200.dll, cvextern.dll, cxcore200.dll, and highgui200.dll. The easiest way to ensure these get deployed properly is to add them to your project and set their build actions to "Content" and Copy to Output Directory to "Copy if newer."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2847927331851767771-7484900874982095804?l=www.quotientrobotics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.quotientrobotics.com/2009/11/machine-vision-emgu-cv-open-cv-wrapper.html</link><author>noreply@blogger.com (David J Barnes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_ZrKBb68KqHo/SvnY5bENeHI/AAAAAAAABBY/0opbwQ0MB6A/s72-c/Emgu+CV+Face+Detection.bmp" height="72" width="72" /><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2847927331851767771.post-1756797125282944230</guid><pubDate>Tue, 03 Nov 2009 04:47:00 +0000</pubDate><atom:updated>2009-11-02T22:57:09.583-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">RoboRealm API</category><category domain="http://www.blogger.com/atom/ns#">C# Robotics</category><category domain="http://www.blogger.com/atom/ns#">Machine Vision</category><category domain="http://www.blogger.com/atom/ns#">C#</category><category domain="http://www.blogger.com/atom/ns#">RoboRealm</category><title>RoboRealm Server API C# Read Variable</title><description>I felt like tinkering with &lt;a href="http://www.roborealm.com/"&gt;RoboRealm &lt;/a&gt;tonight. Since I bought a license a few weeks ago I have spent very little time with the application. But even after a few minutes the shear power of it's capabilities are obvious.&lt;br /&gt;&lt;br /&gt;Using RoboRealm, I use the Laser_Spot filter to detect the X,Y coordinates of a laser being projected onto the wall. Next, I connect to the remote server using the RoboRealm API (C#).&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/B8zDMaUWlCY&amp;amp;hl=en&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/B8zDMaUWlCY&amp;amp;hl=en&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2847927331851767771-1756797125282944230?l=www.quotientrobotics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.quotientrobotics.com/2009/11/roborealm-server-api-c-read-variable.html</link><author>noreply@blogger.com (David J Barnes)</author><thr:total>0</thr:total></item></channel></rss>

