<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2397196819918312128</id><updated>2012-02-01T20:58:56.380-08:00</updated><category term='OpenCV'/><category term='Hardware'/><category term='Detection'/><category term='Viola-Jones method'/><category term='Hand detection'/><category term='Hand gesture recognition'/><category term='Theory'/><category term='Stereo vision'/><title type='text'>Computer Vision</title><subtitle type='html'>with emphasis on vision-based hand &amp;amp; body tracking for 3D input</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://cv-kolaric.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://cv-kolaric.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Siniša Kolarić</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/-KPfeDogDuo8/TyoYCAuWK9I/AAAAAAAAHJs/MgTgzNOT04M/s220/SK-2011-12-26.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>21</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2397196819918312128.post-5209264773363767602</id><published>2008-12-17T00:47:00.000-08:00</published><updated>2008-12-17T00:52:38.235-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hardware'/><category scheme='http://www.blogger.com/atom/ns#' term='Stereo vision'/><title type='text'>Stereo Vision System ("SVS") by Surveyor Inc.</title><content type='html'>&lt;div&gt;Surveyor Inc. present a truly low-cost (cca. USD 550) stereo vision module. Here is an &lt;a href="http://robots.net/article/2645.html"&gt;article&lt;/a&gt; (containing the press release)  and the &lt;a href="http://www.surveyor.com/stereo/"&gt;link&lt;/a&gt; at Surveyor.com&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_bzdBkBe5kew/SUi86eslthI/AAAAAAAACVI/IUYgRBR1F_U/s1600-h/surveyor.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 236px;" src="http://1.bp.blogspot.com/_bzdBkBe5kew/SUi86eslthI/AAAAAAAACVI/IUYgRBR1F_U/s400/surveyor.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5280678275950425618" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2397196819918312128-5209264773363767602?l=cv-kolaric.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cv-kolaric.blogspot.com/feeds/5209264773363767602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2397196819918312128&amp;postID=5209264773363767602' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/5209264773363767602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/5209264773363767602'/><link rel='alternate' type='text/html' href='http://cv-kolaric.blogspot.com/2008/12/stereo-vision-system-svs-by-surveyor.html' title='Stereo Vision System (&quot;SVS&quot;) by Surveyor Inc.'/><author><name>Siniša Kolarić</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/-KPfeDogDuo8/TyoYCAuWK9I/AAAAAAAAHJs/MgTgzNOT04M/s220/SK-2011-12-26.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_bzdBkBe5kew/SUi86eslthI/AAAAAAAACVI/IUYgRBR1F_U/s72-c/surveyor.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2397196819918312128.post-6442084367931305080</id><published>2008-06-09T12:33:00.000-07:00</published><updated>2008-06-09T14:05:36.154-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hand gesture recognition'/><category scheme='http://www.blogger.com/atom/ns#' term='Hand detection'/><category scheme='http://www.blogger.com/atom/ns#' term='Detection'/><category scheme='http://www.blogger.com/atom/ns#' term='Viola-Jones method'/><title type='text'>The 2004 paper by Ong and Bowden ("A Boosted Classifier Tree for Hand Shape Detection")</title><content type='html'>&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Introduction&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;This is my summary of the 2004 paper by Eng-Jon Ong and Richard Bowden, "A Boosted Classifier Tree for Hand Shape Detection". In this paper, the authors propose a method that does two things:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;detects&lt;/span&gt; the presence of human hands within an image, and&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;classifies&lt;/span&gt; the hand shape (when detected within an image).&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Preparing image datasets&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;The authors first collected a set of various video sequences. Using this set, a training set of 5013 images containing human hands was automatically extracted (segmented-out) by modeling skin tones with a single Gaussian and isolating regions of high skin probability.&lt;br /&gt;&lt;br /&gt;This set of 5013 images was then split into two subsets:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Set A: 2504 images for &lt;span style="font-weight: bold;"&gt;training&lt;/span&gt;, and&lt;/li&gt;&lt;li&gt;Set B: 2509 images for &lt;span style="font-weight: bold;"&gt;testing&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;Training the general hand detector&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Using the set of 2504 images for training, a general hand detector was trained using FloatBoost. A cascade of 11 stages, with a total of 634 weak classifiers, was obtained. This general hand detector was then tested on the set of 2509 images for testing, and the detection error was 0.2%.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;Training the specialized shape detectors&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Both sets A (2504 training images) and B (2509 testing images) are now combined into set C. This set C of 5013 images containing human hands are then clustered (grouped) into 300 sets of images ("hand image clusters") that share common appearance (see figure below depicting 10 example hand image clusters). Again, this clustering was an automatic process. Hands were represented with a set of so-called &lt;span style="font-style: italic;"&gt;shape context features&lt;/span&gt;. These features have the advantage that they are robust to noise and alignment.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;Figure:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; an example of ten automatically extracted&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; hand image clusters,&lt;br /&gt;using &lt;span style="font-style: italic;"&gt;shape context features&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;K-mediod clustering&lt;/span&gt;.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_bzdBkBe5kew/SE2J8WH9WQI/AAAAAAAABGQ/GaJ9paLPeNE/s1600-h/ong-bowden.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_bzdBkBe5kew/SE2J8WH9WQI/AAAAAAAABGQ/GaJ9paLPeNE/s400/ong-bowden.jpg" alt="" id="BLOGGER_PHOTO_ID_5209972013761648898" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;From these 300 clusters, 900 images were then randomly selected. (Therefore, on average 3 images were selected from each cluster.) These 900 images were then defined to constitute the &lt;span style="font-style: italic;"&gt;hand shape test database&lt;/span&gt;. Thus 5013-900=4113 images remained for FloatBoost training (4113/300 = 13.71 images per cluster).&lt;br /&gt;&lt;br /&gt;A cascade of strong classifiers was then FloatBoost-trained on the images of each of these 300 clusters. For each cluster, the images in the remaining 299 clusters provided the "non-hand-shape" images. The authors found that the average error for these detectors on the shape test database was 2.6%.&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;&lt;br /&gt;Combining the general hand detector and specialized shape detectors&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Having now both the general hand detector, and specialized shape detectors, we combine them together as depicted in the figure below:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_bzdBkBe5kew/SE2QnD-rrpI/AAAAAAAABGg/Duth3CZhnEM/s1600-h/ong-bowden2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_bzdBkBe5kew/SE2QnD-rrpI/AAAAAAAABGg/Duth3CZhnEM/s400/ong-bowden2.jpg" alt="" id="BLOGGER_PHOTO_ID_5209979344695045778" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2397196819918312128-6442084367931305080?l=cv-kolaric.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cv-kolaric.blogspot.com/feeds/6442084367931305080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2397196819918312128&amp;postID=6442084367931305080' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/6442084367931305080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/6442084367931305080'/><link rel='alternate' type='text/html' href='http://cv-kolaric.blogspot.com/2008/06/2004-paper-by-ong-and-bowden-boosted.html' title='The 2004 paper by Ong and Bowden (&quot;A Boosted Classifier Tree for Hand Shape Detection&quot;)'/><author><name>Siniša Kolarić</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/-KPfeDogDuo8/TyoYCAuWK9I/AAAAAAAAHJs/MgTgzNOT04M/s220/SK-2011-12-26.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_bzdBkBe5kew/SE2J8WH9WQI/AAAAAAAABGQ/GaJ9paLPeNE/s72-c/ong-bowden.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2397196819918312128.post-5197672270457402371</id><published>2008-06-05T14:18:00.000-07:00</published><updated>2008-06-05T14:21:13.256-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Detection'/><category scheme='http://www.blogger.com/atom/ns#' term='Viola-Jones method'/><title type='text'>Width/height ratios of training samples in Viola-Jones method?</title><content type='html'>Do width/height ratios of training samples in Viola-Jones method have to follow the natural ratios of photographed objects? For example, let's say that the bounding rectangle of a certain hand gesture has the ratio of 1.o. Does it matter if training samples are defined to be of ratio 1.2? Does this ratio of 1.2 affect detection rates?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2397196819918312128-5197672270457402371?l=cv-kolaric.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cv-kolaric.blogspot.com/feeds/5197672270457402371/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2397196819918312128&amp;postID=5197672270457402371' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/5197672270457402371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/5197672270457402371'/><link rel='alternate' type='text/html' href='http://cv-kolaric.blogspot.com/2008/06/widthheight-ratios-of-training-samples.html' title='Width/height ratios of training samples in Viola-Jones method?'/><author><name>Siniša Kolarić</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/-KPfeDogDuo8/TyoYCAuWK9I/AAAAAAAAHJs/MgTgzNOT04M/s220/SK-2011-12-26.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2397196819918312128.post-5083628257096914498</id><published>2008-03-21T03:38:00.000-07:00</published><updated>2008-03-21T03:45:43.436-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hardware'/><title type='text'>Motorola concept phone with a stereo camera</title><content type='html'>Motorola has developed an interesting concept phone featuring a stereo camera (&lt;a href="http://www.mobilemag.com/content/100/340/C14821/" target="_new"&gt;link 1&lt;/a&gt;, &lt;a href="http://crave.cnet.com/8301-1_105-9896563-1.html?%5E$"  target="_new2"&gt;link 2&lt;/a&gt;), presumably to be able to compute disparity maps?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_bzdBkBe5kew/R-OQiWmIedI/AAAAAAAAA44/aWHgjdf0sWs/s1600-h/motorola_stereo_camera.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_bzdBkBe5kew/R-OQiWmIedI/AAAAAAAAA44/aWHgjdf0sWs/s400/motorola_stereo_camera.jpg" alt="" id="BLOGGER_PHOTO_ID_5180142916261673426" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2397196819918312128-5083628257096914498?l=cv-kolaric.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cv-kolaric.blogspot.com/feeds/5083628257096914498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2397196819918312128&amp;postID=5083628257096914498' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/5083628257096914498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/5083628257096914498'/><link rel='alternate' type='text/html' href='http://cv-kolaric.blogspot.com/2008/03/motorola-concept-phone-with-stereo.html' title='Motorola concept phone with a stereo camera'/><author><name>Siniša Kolarić</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/-KPfeDogDuo8/TyoYCAuWK9I/AAAAAAAAHJs/MgTgzNOT04M/s220/SK-2011-12-26.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_bzdBkBe5kew/R-OQiWmIedI/AAAAAAAAA44/aWHgjdf0sWs/s72-c/motorola_stereo_camera.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2397196819918312128.post-4927363563425939335</id><published>2008-03-15T18:44:00.000-07:00</published><updated>2008-03-16T11:19:17.374-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><title type='text'>Explaining output from haartraining.exe</title><content type='html'>This is the table output from haartraning.exe, for a current stage in a cascade:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;+----+----+-+---------+---------+---------+---------+&lt;br /&gt;|  N |%%SMP|F|  ST.THR |    HR   |    FA   | EXP. ERR|&lt;br /&gt;+----+----+-+---------+---------+---------+---------+&lt;br /&gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;N = current feature for this cascade (seq-&gt;total),&lt;/li&gt;&lt;li&gt;%%SMP = percentage of samples used, if trimmings enabled (v_wt)&lt;/li&gt;&lt;li&gt;F = '+' if isFilpped, if symmetry is specified (v_flipped), '-' otherwise&lt;/li&gt;&lt;li&gt;ST.THR = stage threshold, &lt;/li&gt;&lt;li&gt;HR = Hit Rate based on Stage threshold (v_hitrate / numpos), &lt;/li&gt;&lt;li&gt;FA = False alarm based on Stage threshold (v_falsealarm / numneg)&lt;/li&gt;&lt;li&gt;EXP.ERR = Strong classification error of adaboost algorithm,&lt;br /&gt;based on threshold=0 (v_experr)&lt;br /&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/2397196819918312128-4927363563425939335?l=cv-kolaric.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cv-kolaric.blogspot.com/feeds/4927363563425939335/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2397196819918312128&amp;postID=4927363563425939335' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/4927363563425939335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/4927363563425939335'/><link rel='alternate' type='text/html' href='http://cv-kolaric.blogspot.com/2008/03/output-from-haartrainingexe.html' title='Explaining output from haartraining.exe'/><author><name>Siniša Kolarić</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/-KPfeDogDuo8/TyoYCAuWK9I/AAAAAAAAHJs/MgTgzNOT04M/s220/SK-2011-12-26.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2397196819918312128.post-7358405773522570962</id><published>2008-03-14T14:23:00.001-07:00</published><updated>2008-03-14T15:35:56.422-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Theory'/><category scheme='http://www.blogger.com/atom/ns#' term='Detection'/><title type='text'>Some notes on Viola-Jones detection method</title><content type='html'>Viola-Jones detection method:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A &lt;span style="font-style: italic;"&gt;feature&lt;/span&gt; (or &lt;span style="font-style: italic;"&gt;feature instance&lt;/span&gt;) is an instance of &lt;span style="font-style: italic;"&gt;feature prototype&lt;/span&gt; (&lt;span style="font-style: italic;"&gt;feature template&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;A &lt;span style="font-style: italic;"&gt;weak classifier&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;is based on one feature&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;A &lt;span style="font-style: italic;"&gt;strong classifier&lt;/span&gt; (also called &lt;span style="font-style: italic;"&gt;boosted classifier&lt;/span&gt;, or &lt;span style="font-style: italic;"&gt;stage&lt;/span&gt;) is composed of a number of weak classifiers&lt;/li&gt;&lt;li&gt;A &lt;span style="font-style: italic;"&gt;cascade of boosted classifiers&lt;/span&gt; is, then, composed of several strong classifiers, or stages&lt;/li&gt;&lt;li&gt;In a cascade:&lt;ul&gt;&lt;li&gt;1st strong classifier (has two features only) detects almost 100% of subwindows containing the object, but also passes  40% of all subwindow candidates that do not contain the object&lt;/li&gt;&lt;li&gt;2nd strong classifier (five features) detects almost 100% of subwindows containing the object, but passes only 20% of non-object subwindows&lt;/li&gt;&lt;li&gt;3rd strong classifier (twenty features) detects almost 100% and passes merely 10% of non-object subwindows&lt;/li&gt;&lt;li&gt;... and so on&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Therefore, in a cascade, strong classifiers become more and more complex, and more and more "picky", and it gets progressively more difficult for a candidate subwindow to pass through the entire cascade, thus "passing the test"&lt;/li&gt;&lt;li&gt;Feature templates (prototypes) can be scaled independently horizontally and vertically, in order to obtain feature instances:&lt;ul&gt;&lt;li&gt;the minimum sizes are being defined by the template's original resolution (e.g. 25x25 pixels) and&lt;br /&gt;&lt;/li&gt;&lt;li&gt;the maximum sizes by the frame (window) size (e.g. 640x480 pixels)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;If the false positive rate is 0.01 (10^-2), we falsely detect the object in 1 out of 100 frames; at 30 FPS, we have one false positive each 100/30 = 3.3 seconds&lt;br /&gt;&lt;/li&gt;&lt;li&gt;If the false positive rate is 0.00001 (10^-4), we falsely detect the object in 1 out of 10,000 frames; at 30 FPS, we have one false positive each 10,000/30 = 333.3 seconds = 5 min 33.3 s&lt;br /&gt;&lt;/li&gt;&lt;li&gt;If the false positive rate is 0.00001 (10^-6), we falsely detect the object in 1 out of 1,000,000 frames; at 30 FPS, we have one false positive each 1,000,000/30 = 9 hours 15 min&lt;br /&gt;&lt;/li&gt;&lt;li&gt;For a cascade of classifiers, the false positive rate &lt;span style="font-style: italic;"&gt;F&lt;/span&gt; of the cascade is&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;          F&lt;/span&gt; = &lt;span style="font-style: italic;"&gt;f&lt;sub&gt;1&lt;/sub&gt;*f&lt;sub&gt;2&lt;/sub&gt;*...*f&lt;sub&gt;K&lt;/sub&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;where &lt;span style="font-style: italic;"&gt;K&lt;/span&gt; is the number of classifiers, and &lt;span style="font-style: italic;"&gt;f&lt;sub&gt;i&lt;/sub&gt;&lt;/span&gt; is the false positive rate of the &lt;span style="font-style: italic;"&gt;i&lt;/span&gt;-th classifier on &lt;span style="font-style: italic;"&gt;the examples that get through to it&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;For a cascade of classifiers, the detection rate &lt;span style="font-style: italic;"&gt;D&lt;/span&gt; of the cascade is&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;          &lt;/span&gt;&lt;span style="font-style: italic;"&gt;D&lt;/span&gt; = &lt;span style="font-style: italic;"&gt;d&lt;sub&gt;1&lt;/sub&gt;*d&lt;sub&gt;2&lt;/sub&gt;*...*d&lt;sub&gt;K&lt;/sub&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;where &lt;span style="font-style: italic;"&gt;K&lt;/span&gt; is the number of classifiers, and &lt;span style="font-style: italic;"&gt;d&lt;sub&gt;i&lt;/sub&gt;&lt;/span&gt; is the detection rate of the &lt;span style="font-style: italic;"&gt;i&lt;/span&gt;-th classifier on &lt;span style="font-style: italic;"&gt;the examples that get through to it&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;For a strong classifier, the proportion of sub-windows which are labelled as potentially containing the object, is effectively equal to the false positive rate.&lt;/li&gt;&lt;li&gt;&lt;br /&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/2397196819918312128-7358405773522570962?l=cv-kolaric.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cv-kolaric.blogspot.com/feeds/7358405773522570962/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2397196819918312128&amp;postID=7358405773522570962' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/7358405773522570962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/7358405773522570962'/><link rel='alternate' type='text/html' href='http://cv-kolaric.blogspot.com/2008/03/random-notes-on-viola-jones-detection.html' title='Some notes on Viola-Jones detection method'/><author><name>Siniša Kolarić</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/-KPfeDogDuo8/TyoYCAuWK9I/AAAAAAAAHJs/MgTgzNOT04M/s220/SK-2011-12-26.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2397196819918312128.post-6730528772049416237</id><published>2007-12-17T11:50:00.000-08:00</published><updated>2008-06-05T14:28:15.401-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hardware'/><title type='text'>3DV Systems' ZCam depth-sensing camera</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_bzdBkBe5kew/R2bUKiEAO7I/AAAAAAAAA2s/REkHcePiktk/s1600-h/01.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_bzdBkBe5kew/R2bUKiEAO7I/AAAAAAAAA2s/REkHcePiktk/s400/01.jpg" alt="" id="BLOGGER_PHOTO_ID_5145032901724748722" border="0" /&gt;&lt;/a&gt;An interesting development from &lt;a href="http://www.3dvsystems.com/"&gt;3DV Systems&lt;/a&gt;, an Israeli company... They've developed ZCam, a depth-sensing monocular camera (which is also allegedly cheap --- how cheap is not yet known, however). What's better, it operates with infrared, so all the known problems with natural illumination are circumvented in a potential application.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_bzdBkBe5kew/R2bUyCEAO8I/AAAAAAAAA20/q6OCK_y8oVU/s1600-h/02.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_bzdBkBe5kew/R2bUyCEAO8I/AAAAAAAAA20/q6OCK_y8oVU/s400/02.jpg" alt="" id="BLOGGER_PHOTO_ID_5145033580329581506" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Links:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://3dvzcam.com/"&gt;http://3dvzcam.com/&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/2397196819918312128-6730528772049416237?l=cv-kolaric.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cv-kolaric.blogspot.com/feeds/6730528772049416237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2397196819918312128&amp;postID=6730528772049416237' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/6730528772049416237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/6730528772049416237'/><link rel='alternate' type='text/html' href='http://cv-kolaric.blogspot.com/2007/12/3dv-systems-zcam-depth-camera.html' title='3DV Systems&apos; ZCam depth-sensing camera'/><author><name>Siniša Kolarić</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/-KPfeDogDuo8/TyoYCAuWK9I/AAAAAAAAHJs/MgTgzNOT04M/s220/SK-2011-12-26.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_bzdBkBe5kew/R2bUKiEAO7I/AAAAAAAAA2s/REkHcePiktk/s72-c/01.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2397196819918312128.post-3378547732396560429</id><published>2007-09-12T10:51:00.001-07:00</published><updated>2007-09-12T11:02:36.426-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><title type='text'>Extracting (x, y) coordinates from a contour</title><content type='html'>After one extracts the contour of an object by calling &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;num_contours = cvFindContours(img, storage, contour ... )&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;the question frequently arises: how to extract the list of all (x, y) pixel coordinates defining the contour? The answer:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;int maxLevel = 3;&lt;br /&gt;CvTreeNodeIterator iterator;&lt;br /&gt;CvPoint pt;&lt;br /&gt;cvInitTreeNodeIterator( &amp;iterator, contour, maxLevel );  &lt;br /&gt;while( (contour = (CvSeq*)cvNextTreeNode( &amp;iterator )) != 0 )&lt;br /&gt;{&lt;br /&gt;  CvSeqReader reader;&lt;br /&gt;  int count = contour-&gt;total;&lt;br /&gt;  cvStartReadSeq( contour, &amp;reader, 0 );&lt;br /&gt;  count -= !CV_IS_SEQ_CLOSED ( contour );&lt;br /&gt;  for ( int i = 0; i &lt; count; i++ )&lt;br /&gt;  {&lt;br /&gt;    CV_READ_SEQ_ELEM ( pt, reader );&lt;br /&gt;    cout &lt;&lt; pt.x &lt;&lt; pt.y;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2397196819918312128-3378547732396560429?l=cv-kolaric.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cv-kolaric.blogspot.com/feeds/3378547732396560429/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2397196819918312128&amp;postID=3378547732396560429' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/3378547732396560429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/3378547732396560429'/><link rel='alternate' type='text/html' href='http://cv-kolaric.blogspot.com/2007/09/extracting-x-y-coordinates-from-contour.html' title='Extracting (x, y) coordinates from a contour'/><author><name>Siniša Kolarić</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/-KPfeDogDuo8/TyoYCAuWK9I/AAAAAAAAHJs/MgTgzNOT04M/s220/SK-2011-12-26.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2397196819918312128.post-3745292618559998167</id><published>2007-07-16T19:07:00.000-07:00</published><updated>2007-07-19T20:52:20.153-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><title type='text'>Effects of cvFlip()</title><content type='html'>As per OpenCV documentation, the function cvFlip flips an image in one of three different ways, depending on the value of its parameter flip_mode:&lt;ul&gt;&lt;li&gt;= 0  flip image around x-axis&lt;li&gt;&lt; 0  flip image around both axes, x-axis and y-axis&lt;li&gt;&gt; 0  flip image around y-axis&lt;/ul&gt;&lt;br /&gt;Interestingly, the effect I am getting is:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;= 0  no effect&lt;li&gt;&lt; 0  flip image around y-axis&lt;li&gt;&gt; 0  flip image around both axes, x-axis and y-axis&lt;/ul&gt;&lt;br /&gt;Examples:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_bzdBkBe5kew/RpwmMcY8RII/AAAAAAAAAec/VDLwGivpq6c/s1600-h/cvFlip+-1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_bzdBkBe5kew/RpwmMcY8RII/AAAAAAAAAec/VDLwGivpq6c/s400/cvFlip+-1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5087983674242909314" /&gt;&lt;/a&gt;&lt;center&gt;Figure: cvFlag -1. Instead of flipping around both x and y axes, it flips around y only.&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_bzdBkBe5kew/Rpwm7cY8RJI/AAAAAAAAAek/Vbvbclxq8IE/s1600-h/cvFlip+0.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_bzdBkBe5kew/Rpwm7cY8RJI/AAAAAAAAAek/Vbvbclxq8IE/s400/cvFlip+0.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5087984481696760978" /&gt;&lt;/a&gt;&lt;center&gt;Figure: cvFlag 0. Instead of flipping around x axis, it has no effect.&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_bzdBkBe5kew/RpwnCcY8RKI/AAAAAAAAAes/pb2vqJLPj3E/s1600-h/cvFlip+%2B1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_bzdBkBe5kew/RpwnCcY8RKI/AAAAAAAAAes/pb2vqJLPj3E/s400/cvFlip+%2B1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5087984601955845282" /&gt;&lt;/a&gt;&lt;center&gt;Figure: cvFlag +1. Instead of flipping around y axis, it flips around both x and y axes.&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;The answer to this apparent paradox is the following: the first photo (in all three pairs of photos above) was &lt;span style="font-style:italic;"&gt;grabbed&lt;/span&gt; by a camera, and it happens that in this case OpenCV returns an image with a bottom-left (BL) origin (which is different from the default in OpenCV, where all images have top-left (TL) origin).&lt;br /&gt;&lt;br /&gt;Later, when I copy the grabbed BL image into another TL image, OpenCV automatically flips the image around the x-axis, and when I later flip the resulting image with cvFlip(0), the result is that these two operations cancel each other.&lt;br /&gt;&lt;br /&gt;The same, of course holds for flags &gt;0 and &lt;0.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2397196819918312128-3745292618559998167?l=cv-kolaric.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cv-kolaric.blogspot.com/feeds/3745292618559998167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2397196819918312128&amp;postID=3745292618559998167' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/3745292618559998167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/3745292618559998167'/><link rel='alternate' type='text/html' href='http://cv-kolaric.blogspot.com/2007/07/effects-of-cvflip.html' title='Effects of cvFlip()'/><author><name>Siniša Kolarić</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/-KPfeDogDuo8/TyoYCAuWK9I/AAAAAAAAHJs/MgTgzNOT04M/s220/SK-2011-12-26.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_bzdBkBe5kew/RpwmMcY8RII/AAAAAAAAAec/VDLwGivpq6c/s72-c/cvFlip+-1.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2397196819918312128.post-8837450578337928856</id><published>2007-07-13T22:17:00.000-07:00</published><updated>2007-07-13T23:18:28.293-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><title type='text'>How does OpenCV detect the orientation of a calibration pattern?</title><content type='html'>As we all know OpenCV draws the red line first when using the function cvDrawChessboardCorners() (see also &lt;a href="http://cv-kolaric.blogspot.com/2007/06/cvdrawchessboardcorners.html"&gt;this post&lt;/a&gt;). To make things clearer w.r.t. the detected orientation of the calibration pattern (in our case, a NxM chessboard where N is odd (even) and M is even (odd)), I made a test with various configurations and made screenshots. (Click on the figure below to download the full-resolution version.)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_bzdBkBe5kew/RphdmsY8RHI/AAAAAAAAAeU/RylNQJMi9yo/s1600-h/all.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_bzdBkBe5kew/RphdmsY8RHI/AAAAAAAAAeU/RylNQJMi9yo/s400/all.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5086918698447160434" /&gt;&lt;/a&gt;&lt;center&gt;&lt;em&gt;Figure: nine different NxM chessboard combinations, with chessboard corners drawn&lt;/em&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;From the image above, we can make the following conclusions: if we feed OpenCV an NxM chessboard, where there is N-1 (M-1) corners in the horizontal (vertical) direction so that the leftmost-topmost square is black, then the N side (horizontal side) of the board is always in the X direction (in other words, corners along N edge will always have the same color). Especially, the first row of corners in X direction will be drawn in &lt;span style="color: rgb(255, 0, 0);"&gt;red&lt;/span&gt; because this is how cvDrawChessboardCorners() works.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2397196819918312128-8837450578337928856?l=cv-kolaric.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cv-kolaric.blogspot.com/feeds/8837450578337928856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2397196819918312128&amp;postID=8837450578337928856' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/8837450578337928856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/8837450578337928856'/><link rel='alternate' type='text/html' href='http://cv-kolaric.blogspot.com/2007/07/how-does-opencv-detect-orientation-of.html' title='How does OpenCV detect the orientation of a calibration pattern?'/><author><name>Siniša Kolarić</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/-KPfeDogDuo8/TyoYCAuWK9I/AAAAAAAAHJs/MgTgzNOT04M/s220/SK-2011-12-26.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_bzdBkBe5kew/RphdmsY8RHI/AAAAAAAAAeU/RylNQJMi9yo/s72-c/all.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2397196819918312128.post-3021470119205246111</id><published>2007-07-01T21:20:00.001-07:00</published><updated>2007-07-01T21:50:01.926-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hardware'/><title type='text'>The new Logitech QuickCam Pro 9000</title><content type='html'>Technological progress marches on... The new Logitech QuickCam Pro 9000 webcam has some impressive specifications: Carl Zeiss optics, HD video 960x720, a true 2M sensor... All that for measly 100 bucks. Check out the &lt;a href="http://www.logitech.com/index.cfm/webcam_communications/webcams/devices/3056&amp;cl=us,en"&gt;Logitech page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_bzdBkBe5kew/Roh-k14f2CI/AAAAAAAAAT4/8S0YZJnP4PI/s1600-h/Logitech_QuickCam_Pro_9000.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_bzdBkBe5kew/Roh-k14f2CI/AAAAAAAAAT4/8S0YZJnP4PI/s400/Logitech_QuickCam_Pro_9000.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5082451350892042274" /&gt;&lt;/a&gt;&lt;center&gt;Figure: Logitech QuickCam Pro 9000&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2397196819918312128-3021470119205246111?l=cv-kolaric.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cv-kolaric.blogspot.com/feeds/3021470119205246111/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2397196819918312128&amp;postID=3021470119205246111' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/3021470119205246111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/3021470119205246111'/><link rel='alternate' type='text/html' href='http://cv-kolaric.blogspot.com/2007/07/new-logitech-quickcam-pro-9000.html' title='The new Logitech QuickCam Pro 9000'/><author><name>Siniša Kolarić</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/-KPfeDogDuo8/TyoYCAuWK9I/AAAAAAAAHJs/MgTgzNOT04M/s220/SK-2011-12-26.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_bzdBkBe5kew/Roh-k14f2CI/AAAAAAAAAT4/8S0YZJnP4PI/s72-c/Logitech_QuickCam_Pro_9000.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2397196819918312128.post-2977873423576695895</id><published>2007-06-27T07:32:00.000-07:00</published><updated>2007-07-20T14:11:42.215-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><title type='text'>OpenCV FAQ</title><content type='html'>&lt;span style="font-style:italic;"&gt;(Note: this OpenCV FAQ page is a constant work in progress.)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Q. Can extrinsic parameters and world's origin be determined uniquely with respect to a MxN checkerboard? What about a NxN checkerboard?&lt;/span&gt;&lt;br /&gt;A: Yes, in the case of MxN checkerboard calibration patterns, extrinsic parameters (and consequently, world's = pattern's origin) can be defined uniquely, no matter how your camera looks at the pattern. However, this is not so for a NxN checkerboard.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2397196819918312128-2977873423576695895?l=cv-kolaric.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cv-kolaric.blogspot.com/feeds/2977873423576695895/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2397196819918312128&amp;postID=2977873423576695895' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/2977873423576695895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/2977873423576695895'/><link rel='alternate' type='text/html' href='http://cv-kolaric.blogspot.com/2007/06/opencv-faq.html' title='OpenCV FAQ'/><author><name>Siniša Kolarić</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/-KPfeDogDuo8/TyoYCAuWK9I/AAAAAAAAHJs/MgTgzNOT04M/s220/SK-2011-12-26.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2397196819918312128.post-1676004055573363267</id><published>2007-06-24T22:16:00.000-07:00</published><updated>2007-06-26T22:26:01.811-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><title type='text'>Camera's coordinate system in OpenCV</title><content type='html'>A couple of notes of the orientation of the camera's coordinate system in OpenCV. Let's say that we used a number of 320x240 photos (containing a calibration pattern, for example a checkerboard) to calibrate a camera. Here is an example of such a photo:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_bzdBkBe5kew/Rn9Q1-e6B9I/AAAAAAAAAS8/N2-p49BtSzU/s1600-h/01+Picture+5.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_bzdBkBe5kew/Rn9Q1-e6B9I/AAAAAAAAAS8/N2-p49BtSzU/s400/01+Picture+5.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5079867792933128146" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is a 8x7 square pattern, where each square has dimensions 24.1 x 24.1 milimeters. OpenCV analyzes this photo and detects the corners, with pattern's (=world's) origin denoted by O in the following figure (green cross):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_bzdBkBe5kew/Rn9S_ue6B_I/AAAAAAAAATM/khpOiihluPY/s1600-h/03+Picture+5.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_bzdBkBe5kew/Rn9S_ue6B_I/AAAAAAAAATM/khpOiihluPY/s400/03+Picture+5.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5079870159460108274" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The coordinates of the origin are (0, 0, 0)&lt;sub&gt;world&lt;/sub&gt; = (-271.6, 111.2, 489.9)&lt;sub&gt;camera&lt;/sub&gt; = (254, 103)&lt;sub&gt;image&lt;/sub&gt;.&lt;br /&gt;&lt;br /&gt;Red cross represents the detected principal point (a part of intrinsics data). For the set of calibration photos in question, OpenCV detected the principal point at (177.1, 118.32) which rounded off gives (177, 118). This is almost at the middle of the photo (160,120), but not quite. This happens frequently due to camera imperfections. &lt;br /&gt;&lt;br /&gt;Now let's take again a look at the photo above. If the x grows to the right, and y grows up, one would expect both coordinates x, y of the origin to be positive in the camera's system, right? Wrong. With OpenCV, in the camera's system, &lt;span style="font-style:italic;"&gt;x grows to the left&lt;/span&gt;, and y grows up, which enables the camera coordinate system to be always right-handed (because +z shoots away from the camera, into the photo).&lt;br /&gt;&lt;br /&gt;Thus, the coordinates of the origin in camera's system, for this particular case, happens to be x = -271.6, and y = 111.2. By definition, coordinate z is always positive and in this case it happens that z = 489.9.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_bzdBkBe5kew/RoHqIV4f1-I/AAAAAAAAATY/u6VVG0_5fD8/s1600-h/05+Picture+5.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_bzdBkBe5kew/RoHqIV4f1-I/AAAAAAAAATY/u6VVG0_5fD8/s400/05+Picture+5.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5080599283684595682" /&gt;&lt;/a&gt;&lt;center&gt;Figure: Camera's coordinate system (axis z goes into the image)&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;Interestingly, when we reverse the image, we get the following:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_bzdBkBe5kew/RoHqul4f1_I/AAAAAAAAATg/jBnWHO2tALk/s1600-h/05+Picture+5reverse.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_bzdBkBe5kew/RoHqul4f1_I/AAAAAAAAATg/jBnWHO2tALk/s400/05+Picture+5reverse.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5080599940814591986" /&gt;&lt;/a&gt;&lt;center&gt;Figure: Camera's coordinate system (axis z goes into the image)&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;Finally, when we draw in the world's (=pattern's) coordinate system, we get the following (yellow axes):&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_bzdBkBe5kew/RoHs814f2AI/AAAAAAAAATo/7BkJ6PX_8eo/s1600-h/06+Picture+5.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_bzdBkBe5kew/RoHs814f2AI/AAAAAAAAATo/7BkJ6PX_8eo/s400/06+Picture+5.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5080602384650983426" /&gt;&lt;/a&gt;&lt;br /&gt;Therefore, +z axis of the world coordinate system also looks INTO the pattern, therefore we "can't see +z axis" because it's obstructed by the pattern itself. Here is the same image, only turned upside down:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_bzdBkBe5kew/RoHtSl4f2BI/AAAAAAAAATw/9sbYRDgFMwM/s1600-h/06+Picture+5a.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_bzdBkBe5kew/RoHtSl4f2BI/AAAAAAAAATw/9sbYRDgFMwM/s400/06+Picture+5a.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5080602758313138194" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2397196819918312128-1676004055573363267?l=cv-kolaric.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cv-kolaric.blogspot.com/feeds/1676004055573363267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2397196819918312128&amp;postID=1676004055573363267' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/1676004055573363267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/1676004055573363267'/><link rel='alternate' type='text/html' href='http://cv-kolaric.blogspot.com/2007/06/cameras-coordinate-system.html' title='Camera&apos;s coordinate system in OpenCV'/><author><name>Siniša Kolarić</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/-KPfeDogDuo8/TyoYCAuWK9I/AAAAAAAAHJs/MgTgzNOT04M/s220/SK-2011-12-26.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_bzdBkBe5kew/Rn9Q1-e6B9I/AAAAAAAAAS8/N2-p49BtSzU/s72-c/01+Picture+5.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2397196819918312128.post-8195646617824395678</id><published>2007-06-22T10:44:00.001-07:00</published><updated>2007-06-22T10:46:41.104-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hardware'/><title type='text'>Webcams with large field of view (FOV)</title><content type='html'>Webcams with large field of view (FOV) are useful in computer-vision setups. The following two photos demonstrate the difference in FOV between  older and newer webcams (original shots can be found &lt;a href="http://www.gearbits.com/archives/2005/04/wideangle_webca.html"&gt;here&lt;/a&gt;).&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_bzdBkBe5kew/Rml07-e6BsI/AAAAAAAAAP8/iAhq6N6nGeQ/s1600-h/oldcam.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_bzdBkBe5kew/Rml07-e6BsI/AAAAAAAAAP8/iAhq6N6nGeQ/s400/oldcam.jpg" alt="" id="BLOGGER_PHOTO_ID_5073715028943308482" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;Figure: older webcam (approx. 52º FOV)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_bzdBkBe5kew/Rml1Due6BtI/AAAAAAAAAQE/d1V37Ycdf9c/s1600-h/newcam.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_bzdBkBe5kew/Rml1Due6BtI/AAAAAAAAAQE/d1V37Ycdf9c/s400/newcam.jpg" alt="" id="BLOGGER_PHOTO_ID_5073715162087294674" border="0" /&gt;&lt;/a&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;Figure: newer webcam (&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Creative Live! Ultra with 76º &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;FOV)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: left;"&gt;Obviously not only is the FOV significantly larger, colors are also more vivid and faithful (which can also be taken advantage of in a computer-vision application).&lt;br /&gt;&lt;br /&gt;Here are some newer webcams (with FOV in degrees):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://us.creative.com/products/product.asp?category=218&amp;subcategory=219&amp;amp;product=14813"&gt;Creative Live! Cam Voice&lt;/a&gt; / &lt;span style="font-weight: bold;"&gt;85º&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.logitech.com/index.cfm/products/details/US/EN,CRID=2204,CONTENTID=10562"&gt;Logitech QuickCam Fusion&lt;/a&gt; / &lt;span style="font-weight: bold;"&gt;78º&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://us.creative.com/corporate/pressroom/factsheets/factsheet.asp?id=108"&gt;Creative WebCam NX Ultra&lt;/a&gt; / &lt;span style="font-weight: bold;"&gt;78º&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://us.creative.com/products/product.asp?category=218&amp;subcategory=219&amp;amp;product=13979"&gt;Creative Live! Motion&lt;/a&gt; / &lt;span style="font-weight: bold;"&gt;76º&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://us.creative.com/products/product.asp?category=218&amp;subcategory=219&amp;amp;product=10451"&gt;Creative Live! Ultra&lt;/a&gt; / &lt;span style="font-weight: bold;"&gt;76º&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.logitech.com/index.cfm/products/details/US/EN,CRID=2204,CONTENTID=10556"&gt;Logitech QuickCam Pro 5000&lt;/a&gt; / &lt;span style="font-weight: bold;"&gt;63º&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;... compared with some older (pre-2006) webcams:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Creative NX Pro / &lt;span style="font-weight: bold;"&gt;52º&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Logitech ClickSmart 420 / &lt;span style="font-weight: bold;"&gt;43º&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Logitech QuickCam Communicate STX / &lt;span style="font-weight: bold;"&gt;42º&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2397196819918312128-8195646617824395678?l=cv-kolaric.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cv-kolaric.blogspot.com/feeds/8195646617824395678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2397196819918312128&amp;postID=8195646617824395678' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/8195646617824395678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/8195646617824395678'/><link rel='alternate' type='text/html' href='http://cv-kolaric.blogspot.com/2007/06/webcams-with-large-field-of-view-fov.html' title='Webcams with large field of view (FOV)'/><author><name>Siniša Kolarić</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/-KPfeDogDuo8/TyoYCAuWK9I/AAAAAAAAHJs/MgTgzNOT04M/s220/SK-2011-12-26.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_bzdBkBe5kew/Rml07-e6BsI/AAAAAAAAAP8/iAhq6N6nGeQ/s72-c/oldcam.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2397196819918312128.post-1898893667778831243</id><published>2007-06-20T18:21:00.000-07:00</published><updated>2007-06-24T22:15:53.696-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><title type='text'>Printing out camera parameters (intrinsics &amp; extrinsics) after call to cvCalibrateCamera2()</title><content type='html'>This is one way to print out the intrinsics matrix obtained after a call to cvCalibrateCamera2():&lt;table border="1" cellpadding="10" cellspacing="0" width="100%"&gt;&lt;tr&gt;&lt;td width="100%" bgcolor="#DDDDDD"&gt;&lt;b&gt;&lt;pre&gt;&lt;br /&gt;for (int x = 0; x&lt;3; x++)&lt;br /&gt;{&lt;br /&gt;  printf("\n");&lt;br /&gt;  for (int y = 0; y&lt;3; y++)&lt;br /&gt;  {&lt;br /&gt;    printf( "K[%i, %i]=%10.6f      ", x, y, cvmGet(camera_matrix, x, y) );&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;The result of the loop above is ([fx 0 cx; 0 fy cy; 0 0 1]):&lt;table border="1" cellpadding="10" cellspacing="0" width="100%"&gt;&lt;tr&gt;&lt;td width="100%" bgcolor="#DDDDDD"&gt;&lt;b&gt;&lt;pre&gt;&lt;br /&gt;K[0, 0]=498.286392      K[0, 1]=  0.000000      K[0, 2]=153.187943&lt;br /&gt;K[1, 0]=  0.000000      K[1, 1]=605.857215      K[1, 2]= 49.275781&lt;br /&gt;K[2, 0]=  0.000000      K[2, 1]=  0.000000      K[2, 2]=  1.000000&lt;br /&gt;&lt;/pre&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;The result above has been obtained after calling the function on the image in &lt;a href="http://cv-kolaric.blogspot.com/2007/06/cvdrawchessboardcorners.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_bzdBkBe5kew/RnmuEOe6B6I/AAAAAAAAASk/OBtfZtKTwDc/s400/Picture_24b.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px;" src="http://2.bp.blogspot.com/_bzdBkBe5kew/RnmuEOe6B6I/AAAAAAAAASk/OBtfZtKTwDc/s400/Picture_24b.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;It is possible to use the same loop above for printing out matrix R, however before you do that, you have to transform the rotation vector (as computed by cvCalibrateCamera2()) into matrix form:&lt;table border="1" cellpadding="10" cellspacing="0" width="100%"&gt;&lt;tr&gt;&lt;td width="100%" bgcolor="#DDDDDD"&gt;&lt;b&gt;&lt;pre&gt;&lt;br /&gt;CvMat* rot_matrix;&lt;br /&gt;rot_matrix = cvCreateMat( 3, 3, CV_32FC1 );&lt;br /&gt;cvRodrigues2(&amp;rot_vects, rot_matrix);&lt;br /&gt;&lt;/pre&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;Now simply use the loop above (just substitute camera_matrix with rot_matrix).&lt;br /&gt;&lt;br /&gt;To print out translation vector:&lt;br /&gt;&lt;table border="1" cellpadding="10" cellspacing="0" width="100%"&gt;&lt;tr&gt;&lt;td width="100%" bgcolor="#DDDDDD"&gt;&lt;b&gt;&lt;pre&gt;&lt;br /&gt;printf("\n                 translation vector: "); &lt;br /&gt;double T[3];&lt;br /&gt;CvMat _T = cvMat( 1, 3, CV_64F, T );&lt;br /&gt;cvConvert( &amp;trans_vects, &amp;_T );&lt;br /&gt;printf( "\n T[0]=%10.6f      ", T[0] );&lt;br /&gt;printf( "\n T[1]=%10.6f      ", T[1] );&lt;br /&gt;printf( "\n T[2]=%10.6f      ", T[2] );&lt;br /&gt;&lt;/pre&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2397196819918312128-1898893667778831243?l=cv-kolaric.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cv-kolaric.blogspot.com/feeds/1898893667778831243/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2397196819918312128&amp;postID=1898893667778831243' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/1898893667778831243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/1898893667778831243'/><link rel='alternate' type='text/html' href='http://cv-kolaric.blogspot.com/2007/06/printing-out-camera-matrix-intrinsics.html' title='Printing out camera parameters (intrinsics &amp; extrinsics) after call to cvCalibrateCamera2()'/><author><name>Siniša Kolarić</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/-KPfeDogDuo8/TyoYCAuWK9I/AAAAAAAAHJs/MgTgzNOT04M/s220/SK-2011-12-26.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_bzdBkBe5kew/RnmuEOe6B6I/AAAAAAAAASk/OBtfZtKTwDc/s72-c/Picture_24b.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2397196819918312128.post-2473458591368112804</id><published>2007-06-20T14:04:00.000-07:00</published><updated>2007-06-26T12:06:36.261-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><title type='text'>cvDrawChessboardCorners(...)</title><content type='html'>In case the checkerboard pattern has been found/detected in the input image, function cvDrawChessboardCorners() (whose implementation can be found in cvcalibinit.cpp) will traverse the detected corners like this:&lt;table border="1" cellpadding="10" cellspacing="0" width="100%"&gt;&lt;tr&gt;&lt;td width="100%" bgcolor="#DDDDDD"&gt;&lt;b&gt;&lt;pre&gt;&lt;br /&gt;int x, y;&lt;br /&gt;CvPoint prev_pt = {0, 0};&lt;br /&gt;const int line_max = 7;&lt;br /&gt;static const CvScalar line_colors[line_max] =&lt;br /&gt;{&lt;br /&gt;  {{0,0,255}},&lt;br /&gt;  {{0,128,255}},&lt;br /&gt;  {{0,200,200}},&lt;br /&gt;  {{0,255,0}},&lt;br /&gt;  {{200,200,0}},&lt;br /&gt;  {{255,0,0}},&lt;br /&gt;  {{255,0,255}}&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;for( y = 0, i = 0; y &lt; pattern_size.height; y++ )&lt;br /&gt;{&lt;br /&gt;  CvScalar color = line_colors[y % line_max];&lt;br /&gt;  if( cn == 1 )&lt;br /&gt;    color = cvScalarAll(200);&lt;br /&gt;  color.val[0] *= scale;&lt;br /&gt;  color.val[1] *= scale;&lt;br /&gt;  color.val[2] *= scale;&lt;br /&gt;  color.val[3] *= scale;&lt;br /&gt;&lt;br /&gt;  for( x = 0; x &lt; pattern_size.width; x++, i++ )&lt;br /&gt;  {&lt;br /&gt;    CvPoint pt;&lt;br /&gt;&lt;br /&gt;    pt.x = cvRound(corners[i].x*(1 &amp;lt;&amp;lt; shift));&lt;br /&gt;    pt.y = cvRound(corners[i].y*(1 &amp;lt;&amp;lt; shift));&lt;br /&gt;&lt;br /&gt;    if( i != 0 )&lt;br /&gt;      cvLine( image, prev_pt, pt, color, 1, line_type, shift );&lt;br /&gt;&lt;br /&gt;    cvLine(&lt;br /&gt;      image, &lt;br /&gt;      cvPoint(pt.x - r, pt.y - r),&lt;br /&gt;      cvPoint(pt.x + r, pt.y + r), &lt;br /&gt;      color, &lt;br /&gt;      1, &lt;br /&gt;      line_type, &lt;br /&gt;      shift );&lt;br /&gt;&lt;br /&gt;    cvLine( &lt;br /&gt;      image, &lt;br /&gt;      cvPoint(pt.x - r, pt.y + r),&lt;br /&gt;      cvPoint(pt.x + r, pt.y - r), &lt;br /&gt;      color, &lt;br /&gt;      1, &lt;br /&gt;      line_type, &lt;br /&gt;      shift );&lt;br /&gt;&lt;br /&gt;    cvCircle( image, pt, r+(1 &amp;lt;&amp;lt; shift), color, 1, line_type, shift );&lt;br /&gt;&lt;br /&gt;    prev_pt = pt;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;Therefore the function traverses each horizontal line. Furthermore, the following colors will be used to render the horizontal lines (note that OpenCV stores color data in BGR format, instead of RGB):&lt;ul&gt;&lt;li&gt;0,0,255 = 255,0,0&lt;sub&gt;RGB&lt;/sub&gt; = &lt;span style="color: rgb(255, 0, 0);"&gt;red&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;0,128,255 = 255,128,0&lt;sub&gt;RGB&lt;/sub&gt; = &lt;span style="color: rgb(255, 128, 128);"&gt;orange&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;0,200,200 = 200,200,0&lt;sub&gt;RGB&lt;/sub&gt; = &lt;span style="color: rgb(200, 200, 0);"&gt;light olive&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;0,255,0 = 0,255,0&lt;sub&gt;RGB&lt;/sub&gt; = &lt;span style="color: rgb(0, 255, 0);"&gt;green&lt;/span&gt;&lt;/li&gt;&lt;li&gt;200,200,0 = 0,200,200,0&lt;sub&gt;RGB&lt;/sub&gt; = &lt;span style="color: rgb(0, 200, 200);"&gt;light blue&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;255,0,0 = 0,0,255&lt;sub&gt;RGB&lt;/sub&gt; = &lt;span style="color: rgb(0, 0, 255);"&gt;blue&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;255,0,255 = 255,0,255&lt;sub&gt;RGB&lt;/sub&gt; = &lt;span style="color: rgb(255, 0, 255);"&gt;pink&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Therefore, the &lt;span style="color: rgb(255, 0, 0);"&gt;red&lt;/span&gt; axis designates axis X in the pattern. Here is an example:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_bzdBkBe5kew/Rnmtyee6B5I/AAAAAAAAASc/7jnXWzMKJxI/s1600-h/Picture_24a.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_bzdBkBe5kew/Rnmtyee6B5I/AAAAAAAAASc/7jnXWzMKJxI/s400/Picture_24a.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5078281137524705170" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The same image, with corners drawn:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_bzdBkBe5kew/RnmuEOe6B6I/AAAAAAAAASk/OBtfZtKTwDc/s1600-h/Picture_24b.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_bzdBkBe5kew/RnmuEOe6B6I/AAAAAAAAASk/OBtfZtKTwDc/s400/Picture_24b.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5078281442467383202" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The following corners (total 7*6=42 of them) have been detected by OpenCV:&lt;br /&gt;&lt;table border="1" cellpadding="10" cellspacing="0" width="100%"&gt;&lt;tr&gt;&lt;td width="100%" bgcolor="#DDDDDD"&gt;&lt;b&gt;&lt;pre&gt;&lt;br /&gt;        (0, 0):  x, y =   115.00,   181.50&lt;br /&gt;        (1, 0):  x, y =   112.00,   168.00&lt;br /&gt;        (2, 0):  x, y =   109.00,   153.50&lt;br /&gt;        (3, 0):  x, y =   105.50,   138.50&lt;br /&gt;        (4, 0):  x, y =   101.50,   122.50&lt;br /&gt;        (5, 0):  x, y =    98.00,   105.50&lt;br /&gt;        (6, 0):  x, y =    93.00,    86.50&lt;br /&gt;        (0, 1):  x, y =   136.50,   181.50&lt;br /&gt;        (1, 1):  x, y =   134.00,   167.50&lt;br /&gt;        (2, 1):  x, y =   132.00,   153.50&lt;br /&gt;        (3, 1):  x, y =   129.00,   138.50&lt;br /&gt;        (4, 1):  x, y =   126.00,   122.50&lt;br /&gt;        (5, 1):  x, y =   123.00,   105.00&lt;br /&gt;        (6, 1):  x, y =   120.00,    86.00&lt;br /&gt;        (0, 2):  x, y =   158.00,   181.50&lt;br /&gt;        (1, 2):  x, y =   156.50,   167.50&lt;br /&gt;        (2, 2):  x, y =   155.00,   153.50&lt;br /&gt;        (3, 2):  x, y =   153.00,   138.50&lt;br /&gt;        (4, 2):  x, y =   151.00,   122.50&lt;br /&gt;        (5, 2):  x, y =   149.00,   104.50&lt;br /&gt;        (6, 2):  x, y =   146.50,    85.50&lt;br /&gt;        (0, 3):  x, y =   180.50,   181.50&lt;br /&gt;        (1, 3):  x, y =   180.00,   168.50&lt;br /&gt;        (2, 3):  x, y =   178.00,   153.50&lt;br /&gt;        (3, 3):  x, y =   177.50,   138.50&lt;br /&gt;        (4, 3):  x, y =   176.00,   122.50&lt;br /&gt;        (5, 3):  x, y =   175.00,   104.50&lt;br /&gt;        (6, 3):  x, y =   173.50,    85.50&lt;br /&gt;        (0, 4):  x, y =   202.50,   182.00&lt;br /&gt;        (1, 4):  x, y =   202.00,   168.50&lt;br /&gt;        (2, 4):  x, y =   201.50,   153.50&lt;br /&gt;        (3, 4):  x, y =   201.50,   139.00&lt;br /&gt;        (4, 4):  x, y =   201.50,   122.00&lt;br /&gt;        (5, 4):  x, y =   201.50,   104.50&lt;br /&gt;        (6, 4):  x, y =   201.50,    84.50&lt;br /&gt;        (0, 5):  x, y =   225.50,   182.50&lt;br /&gt;        (1, 5):  x, y =   225.50,   168.50&lt;br /&gt;        (2, 5):  x, y =   226.50,   154.00&lt;br /&gt;        (3, 5):  x, y =   227.00,   138.50&lt;br /&gt;        (4, 5):  x, y =   227.50,   121.50&lt;br /&gt;        (5, 5):  x, y =   228.50,   103.50&lt;br /&gt;        (6, 5):  x, y =   230.00,    84.00&lt;br /&gt;&lt;/pre&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;NOTE: if the size of a field (square, whether white or black) is for example 34x34mm, then corner:&lt;ul&gt;&lt;li&gt;(0, 0) has 3D coordinates (0mm, 0mm, 0mm)&lt;li&gt;(1, 0) has 3D coordinates (34mm, 0mm, 0mm)&lt;li&gt;(2, 0) has 3D coordinates (68mm, 0mm, 0mm)&lt;li&gt;...&lt;li&gt;(0, 1) has 3D coordinates (0mm, 34mm, 0mm)&lt;li&gt;(1, 1) has 3D coordinates (34mm, 34mm, 0mm)&lt;li&gt;(2, 1) has 3D coordinates (68mm, 34mm, 0mm)&lt;li&gt;...&lt;li&gt;...&lt;li&gt;...&lt;li&gt;(0, 5) has 3D coordinates (0mm, 5*34mm, 0mm)&lt;li&gt;(1, 5) has 3D coordinates (34mm, 5*34mm, 0mm)&lt;li&gt;...&lt;li&gt;(6, 5) has 3D coordinates (6*34mm, 5*34mm, 0mm)&lt;/ul&gt;and so on.&lt;br /&gt;&lt;br /&gt;What follows now is the image with corner indexes (i, j) indicated:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_bzdBkBe5kew/Rnmxeee6B7I/AAAAAAAAASs/tjdST10cSCk/s1600-h/Picture_24c.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_bzdBkBe5kew/Rnmxeee6B7I/AAAAAAAAASs/tjdST10cSCk/s400/Picture_24c.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5078285191973832626" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here with coordinate axes:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_bzdBkBe5kew/RnnH7Oe6B8I/AAAAAAAAAS0/O_CEP0IVs2s/s1600-h/Picture_24d.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_bzdBkBe5kew/RnnH7Oe6B8I/AAAAAAAAAS0/O_CEP0IVs2s/s400/Picture_24d.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5078309875150882754" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2397196819918312128-2473458591368112804?l=cv-kolaric.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cv-kolaric.blogspot.com/feeds/2473458591368112804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2397196819918312128&amp;postID=2473458591368112804' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/2473458591368112804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/2473458591368112804'/><link rel='alternate' type='text/html' href='http://cv-kolaric.blogspot.com/2007/06/cvdrawchessboardcorners.html' title='cvDrawChessboardCorners(...)'/><author><name>Siniša Kolarić</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/-KPfeDogDuo8/TyoYCAuWK9I/AAAAAAAAHJs/MgTgzNOT04M/s220/SK-2011-12-26.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_bzdBkBe5kew/Rnmtyee6B5I/AAAAAAAAASc/7jnXWzMKJxI/s72-c/Picture_24a.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2397196819918312128.post-2950696037755584697</id><published>2007-06-20T09:56:00.000-07:00</published><updated>2007-06-20T10:10:52.013-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><title type='text'>Axis orientation in OpenCV</title><content type='html'>If you're going to use a checkerboard to calibrate a camera using OpenCV and its function cvFindExtrinsicCameraParams_64d(), note that OpenCV expects a checkerboard with right-handed orientation. This means that x axis goes from left to right, y from bottom to top, and z from below up (that is, out of the picture) .&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_bzdBkBe5kew/Rnlffue6B2I/AAAAAAAAASE/b5r8DUaBJSo/s1600-h/OpenCV_orientation.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_bzdBkBe5kew/Rnlffue6B2I/AAAAAAAAASE/b5r8DUaBJSo/s400/OpenCV_orientation.jpg" alt="" id="BLOGGER_PHOTO_ID_5078195053495191394" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2397196819918312128-2950696037755584697?l=cv-kolaric.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cv-kolaric.blogspot.com/feeds/2950696037755584697/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2397196819918312128&amp;postID=2950696037755584697' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/2950696037755584697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/2950696037755584697'/><link rel='alternate' type='text/html' href='http://cv-kolaric.blogspot.com/2007/06/axis-orientation-in-opencv.html' title='Axis orientation in OpenCV'/><author><name>Siniša Kolarić</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/-KPfeDogDuo8/TyoYCAuWK9I/AAAAAAAAHJs/MgTgzNOT04M/s220/SK-2011-12-26.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_bzdBkBe5kew/Rnlffue6B2I/AAAAAAAAASE/b5r8DUaBJSo/s72-c/OpenCV_orientation.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2397196819918312128.post-4426499016298153793</id><published>2007-06-20T07:25:00.000-07:00</published><updated>2007-06-20T07:33:40.054-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Theory'/><title type='text'>Cameras</title><content type='html'>Abstracted camera: screen - optics - aperture.&lt;br /&gt;&lt;br /&gt;Pinhole camera: screen - aperture.  (That is, optics is an identity.) The problem is that aperture (=pinhole) must be small thus exposure time must be long.&lt;br /&gt;&lt;br /&gt;Optical camera: screen - optics - aperture. Aims at producing the same picture as pinhole camera, but by means of a much larger aperture. It can do that because optics correctly concentrates all the incoming light rays. Because aperture is larger, exposure time is shorter.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2397196819918312128-4426499016298153793?l=cv-kolaric.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cv-kolaric.blogspot.com/feeds/4426499016298153793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2397196819918312128&amp;postID=4426499016298153793' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/4426499016298153793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/4426499016298153793'/><link rel='alternate' type='text/html' href='http://cv-kolaric.blogspot.com/2007/06/cameras.html' title='Cameras'/><author><name>Siniša Kolarić</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/-KPfeDogDuo8/TyoYCAuWK9I/AAAAAAAAHJs/MgTgzNOT04M/s220/SK-2011-12-26.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2397196819918312128.post-3648430162047036701</id><published>2007-06-19T10:12:00.000-07:00</published><updated>2007-06-19T10:24:49.247-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Theory'/><title type='text'>On Homographies</title><content type='html'>Homography (also called collineation) is an invertible mapping &lt;span style="font-style: italic;"&gt;h&lt;/span&gt; from &lt;span style="font-style: italic;"&gt;P&lt;sup&gt;n&lt;/sup&gt;&lt;/span&gt; to &lt;span style="font-style: italic;"&gt;P&lt;sup&gt;n&lt;/sup&gt;&lt;/span&gt; such that:&lt;br /&gt;&lt;div style="text-align: center;"&gt;three points &lt;span style="font-style: italic;"&gt;x&lt;sub&gt;1&lt;/sub&gt;, x&lt;sub&gt;2&lt;/sub&gt;, x&lt;sub&gt;3&lt;/sub&gt;&lt;/span&gt; lie on the same line &lt;=&gt; &lt;span style="font-style: italic;"&gt;h(x&lt;sub&gt;1&lt;/sub&gt;), h(x&lt;sub&gt;2&lt;/sub&gt;), h(x&lt;sub&gt;3&lt;/sub&gt;)&lt;/span&gt; lie on the same (another) line too.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;In the 2-space, mapping &lt;span style="font-style: italic;"&gt;h: &lt;/span&gt;&lt;span style="font-style: italic;"&gt;P&lt;sup&gt;2&lt;/sup&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt; -&gt; &lt;/span&gt;&lt;span style="font-style: italic;"&gt;P&lt;sup&gt;2&lt;/sup&gt;&lt;/span&gt; is a homography &lt;=&gt; exists a regular matrix &lt;span style="font-style: italic;"&gt;H&lt;/span&gt; in &lt;span style="font-style: italic;"&gt;M33&lt;/span&gt; such that &lt;span style="font-style: italic;"&gt;h(x)=Hx&lt;/span&gt;, for all points x in &lt;span style="font-style: italic;"&gt;P&lt;sup&gt;2&lt;/sup&gt;&lt;/span&gt;. Note that &lt;span style="font-style: italic;"&gt;H&lt;/span&gt; can be multiplied by any non-zero factor without altering the transformation, thus there are eight independent ratios amongst the nine elements of &lt;span style="font-style: italic;"&gt;H&lt;/span&gt;, therefore &lt;span style="font-style: italic;"&gt;H&lt;/span&gt; has eight DoF.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2397196819918312128-3648430162047036701?l=cv-kolaric.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cv-kolaric.blogspot.com/feeds/3648430162047036701/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2397196819918312128&amp;postID=3648430162047036701' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/3648430162047036701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/3648430162047036701'/><link rel='alternate' type='text/html' href='http://cv-kolaric.blogspot.com/2007/06/homography.html' title='On Homographies'/><author><name>Siniša Kolarić</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/-KPfeDogDuo8/TyoYCAuWK9I/AAAAAAAAHJs/MgTgzNOT04M/s220/SK-2011-12-26.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2397196819918312128.post-1966010619958786892</id><published>2007-06-19T10:03:00.000-07:00</published><updated>2007-06-19T10:08:36.702-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Theory'/><title type='text'>Homogeneous coordinates</title><content type='html'>There are two distinct advantages of using homogeneous coordinates in computer vision &amp;amp; graphics:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;perspective projection, which is a non-linear transformation, can be represented by a system of LINEAR equations.&lt;/li&gt;&lt;li&gt;points at infinity can be easily dealt with in all computations (instead of computing limits at infinity).&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2397196819918312128-1966010619958786892?l=cv-kolaric.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cv-kolaric.blogspot.com/feeds/1966010619958786892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2397196819918312128&amp;postID=1966010619958786892' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/1966010619958786892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/1966010619958786892'/><link rel='alternate' type='text/html' href='http://cv-kolaric.blogspot.com/2007/06/homogeneous-coordinates.html' title='Homogeneous coordinates'/><author><name>Siniša Kolarić</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/-KPfeDogDuo8/TyoYCAuWK9I/AAAAAAAAHJs/MgTgzNOT04M/s220/SK-2011-12-26.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2397196819918312128.post-7437063596036162190</id><published>2007-06-19T09:59:00.001-07:00</published><updated>2007-06-19T11:21:08.278-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Theory'/><title type='text'>Minimum information needed to calculate transformations</title><content type='html'>&lt;span style="font-style: italic;"&gt;P&lt;sup&gt;2&lt;/sup&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt; -&gt; P&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/span&gt; (plane -&gt; plane):&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;dof?&lt;/th&gt;&lt;th&gt;Name of transformation?&lt;/th&gt;&lt;th&gt;2D point correspondences needed?&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;Euclidean&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;Similarity&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;Affinity&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;Projective (homography)&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;P&lt;sup&gt;3&lt;/sup&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt; -&gt; P&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/span&gt; (space -&gt; plane):&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;dof?&lt;/th&gt;&lt;th&gt;Name of transformation?&lt;/th&gt;&lt;th&gt;3D-2D point correspondences needed?&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;?&lt;br /&gt;&lt;/td&gt;&lt;td&gt;Euclidean&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;?&lt;br /&gt;&lt;/td&gt;&lt;td&gt;Similarity&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;?&lt;br /&gt;&lt;/td&gt;&lt;td&gt;Affinity&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;Projective (homography)&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;P&lt;sup&gt;3&lt;/sup&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt; -&gt; P&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;sup&gt;3&lt;/sup&gt;&lt;/span&gt; (space -&gt; space):&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;dof?&lt;/th&gt;&lt;th&gt;Name of transformation?&lt;/th&gt;&lt;th&gt;3D point correspondences needed?&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;Euclidean&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;7&lt;br /&gt;&lt;/td&gt;&lt;td&gt;Similarity&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;12&lt;br /&gt;&lt;/td&gt;&lt;td&gt;Affinity&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt;Projective (homography)&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2397196819918312128-7437063596036162190?l=cv-kolaric.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cv-kolaric.blogspot.com/feeds/7437063596036162190/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2397196819918312128&amp;postID=7437063596036162190' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/7437063596036162190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2397196819918312128/posts/default/7437063596036162190'/><link rel='alternate' type='text/html' href='http://cv-kolaric.blogspot.com/2007/06/minimum-number-of-points-to-calculate.html' title='Minimum information needed to calculate transformations'/><author><name>Siniša Kolarić</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/-KPfeDogDuo8/TyoYCAuWK9I/AAAAAAAAHJs/MgTgzNOT04M/s220/SK-2011-12-26.jpg'/></author><thr:total>0</thr:total></entry></feed>
