<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-gb">
<link rel="self" type="application/atom+xml" href="http://theeyetribe.com/forum/feed.php?f=9&amp;t=32" />

<title>The Eye Tribe</title>
<subtitle>Developer Forum</subtitle>
<link href="http://theeyetribe.com/forum/index.php" />
<updated>2015-07-31T09:07:35+02:00</updated>

<author><name><![CDATA[The Eye Tribe]]></name></author>
<id>http://theeyetribe.com/forum/feed.php?f=9&amp;t=32</id>
<entry>
<author><name><![CDATA[JeffKang]]></name></author>
<updated>2015-07-31T09:07:35+02:00</updated>
<published>2015-07-31T09:07:35+02:00</published>
<id>http://theeyetribe.com/forum/viewtopic.php?t=32&amp;p=2185#p2185</id>
<link href="http://theeyetribe.com/forum/viewtopic.php?t=32&amp;p=2185#p2185"/>
<title type="html"><![CDATA[Re: Distance from sensor incurs vertical shift (and how to f]]></title>

<content type="html" xml:base="http://theeyetribe.com/forum/viewtopic.php?t=32&amp;p=2185#p2185"><![CDATA[
Asymmetric Aperture raytrace patent expiry (for Z movement?)<br /><br /><!-- l --><a class="postlink-local" href="http://theeyetribe.com/forum/viewtopic.php?f=8&amp;t=520">viewtopic.php?f=8&amp;t=520</a><!-- l --><br /><br />Asymmetric Aperture eye tracking - Explicit raytracing for gimbal-based gazepoint trackers expired patent - solution for z-axis forwards and backwards head movement?<br /><br />Could the Asymmetric Aperture method be an adequate interim solution to the vertical shift from z-axis movment as the head moves forwards and backwards?<br /><br />Patent “Explicit raytracing for gimbal-based gazepoint trackers” (WO 2006108017 A2) seems to have expired, and is now in the public domain.<br /><!-- m --><a class="postlink" href="http://www.google.com/patents/WO2006108017A2?cl=en">http://www.google.com/patents/WO2006108017A2?cl=en</a><!-- m --><br /> <br />Interactive minds eye tracking uses the Asymmetric Aperture method:<br /><br /><blockquote class="uncited"><div><br />To achieve high gaze point tracking accuracy, the image processing algorithms in our eye tracking systems explicitly accommodate several common sources of gaze point tracking error.<br /><br />The accuracy of video eye trackers is typically <span style="font-weight: bold">sensitive to head motion along the camera axis.</span><br /><span style="font-weight: bold">As the head moves toward the camera the predicted gaze point (if uncorrected for range) moves radially away from the camera, and as the head moves backward, the predicted gaze point moves radially in toward the camera.</span><br /><br />Typically, when a person is about 60 cm from the camera, and looking at a point toward the top of the computer screen head motions of 2.5 cm along the camera Z axis result in predicted gaze point variations of about 1,9 cm.<br /><br />All our eye trackers use the patented Asymmetric Aperture Method <span style="font-weight: bold">to measure variations in the range between the camera and the cornea of the eye, and they use the range information to minimize gaze point tracking errors resulting from longitudinal head motions.</span><br /></div></blockquote><br /><br /><!-- m --><a class="postlink" href="http://www.interactive-minds.com/eye-tracker">http://www.interactive-minds.com/eye-tracker</a><!-- m --><br /> <br />________________________________________<br /><br /><span style="font-weight: bold">Explicit raytracing for gimbal-based gazepoint trackers WO 2006108017 A2</span><br /><br />Abstract<br /><br /><blockquote class="uncited"><div><br />One embodiment of the present invention is a method for computing a first gaze axis of an eye in a first coordinate system. <br />A camera is focused on the eye and moved to maintain the focus on the eye as the eye moves in the first coordinate system<br />A first location of the camera in the first coordinate system is measured<br />A second location of the eye and a gaze direction of the eye within a second coordinate system are measured<br />A second gaze axis within the second coordinate system is computed from the second location and the gaze direction<br />The first gaze axis is computed from the second gaze axis and the first location using a first coordinate transformation.<br /></div></blockquote><br /> <br /><span style="font-weight: bold">The patent is expired?:</span><br /><blockquote class="uncited"><div><br />May 14, 2008 32PN Ep: public notification in the ep bulletin as address of the adressee cannot be established <br />Free format text: NOTING OF LOSS OF RIGHTS PURSUANT TO RULE 112(1) EPC - FORM 1205A (05.03.2008)<br /></div></blockquote><br /><br /><!-- m --><a class="postlink" href="http://www.google.com/patents/WO2006108017A2?cl=en">http://www.google.com/patents/WO2006108017A2?cl=en</a><!-- m --><br /><br /><blockquote class="uncited"><div><br /><span style="font-weight: bold">TLDR: This method seems an awful lot more complex than it is.<br />But basically it’s projecting an IR pattern onto the eye that changes as the range changes. <br />So you can measure range by looking at how the pattern looks.<br />Pretty simple, doesn't require a ton of math to compute, and gives you a highly precise range measurement.</span><br /></div></blockquote><p>Statistics: Posted by <a href="http://theeyetribe.com/forum/memberlist.php?mode=viewprofile&amp;u=2379">skataJeffKang</a> — 31 Jul 2015, 09:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[joaquin]]></name></author>
<updated>2015-02-05T20:06:44+02:00</updated>
<published>2015-02-05T20:06:44+02:00</published>
<id>http://theeyetribe.com/forum/viewtopic.php?t=32&amp;p=1711#p1711</id>
<link href="http://theeyetribe.com/forum/viewtopic.php?t=32&amp;p=1711#p1711"/>
<title type="html"><![CDATA[Re: Distance from sensor incurs vertical shift (and how to f]]></title>

<content type="html" xml:base="http://theeyetribe.com/forum/viewtopic.php?t=32&amp;p=1711#p1711"><![CDATA[
I think using the pupils as reference is not such a good idea because the size of them might change over time due to habituation to room light or variation in room lighting.<p>Statistics: Posted by <a href="http://theeyetribe.com/forum/memberlist.php?mode=viewprofile&amp;u=7108">skatajoaquin</a> — 05 Feb 2015, 20:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Martin]]></name></author>
<updated>2014-09-02T19:39:04+02:00</updated>
<published>2014-09-02T19:39:04+02:00</published>
<id>http://theeyetribe.com/forum/viewtopic.php?t=32&amp;p=1341#p1341</id>
<link href="http://theeyetribe.com/forum/viewtopic.php?t=32&amp;p=1341#p1341"/>
<title type="html"><![CDATA[Re: Distance from sensor incurs vertical shift (and how to f]]></title>

<content type="html" xml:base="http://theeyetribe.com/forum/viewtopic.php?t=32&amp;p=1341#p1341"><![CDATA[
Not yet. It's at internal testing and performance optimization.<p>Statistics: Posted by <a href="http://theeyetribe.com/forum/memberlist.php?mode=viewprofile&amp;u=117">skataMartin</a> — 02 Sep 2014, 19:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[aamanieu@adobe.com]]></name></author>
<updated>2014-08-21T00:42:04+02:00</updated>
<published>2014-08-21T00:42:04+02:00</published>
<id>http://theeyetribe.com/forum/viewtopic.php?t=32&amp;p=1316#p1316</id>
<link href="http://theeyetribe.com/forum/viewtopic.php?t=32&amp;p=1316#p1316"/>
<title type="html"><![CDATA[Re: Distance from sensor incurs vertical shift (and how to f]]></title>

<content type="html" xml:base="http://theeyetribe.com/forum/viewtopic.php?t=32&amp;p=1316#p1316"><![CDATA[
is there a downloadable beta or even an alpha version of this miraculous version 1.0 that fix this major problem ?<p>Statistics: Posted by <a href="http://theeyetribe.com/forum/memberlist.php?mode=viewprofile&amp;u=3259">skataaamanieu@adobe.com</a> — 21 Aug 2014, 00:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Martin]]></name></author>
<updated>2014-05-27T13:39:57+02:00</updated>
<published>2014-05-27T13:39:57+02:00</published>
<id>http://theeyetribe.com/forum/viewtopic.php?t=32&amp;p=926#p926</id>
<link href="http://theeyetribe.com/forum/viewtopic.php?t=32&amp;p=926#p926"/>
<title type="html"><![CDATA[Re: Distance from sensor incurs vertical shift (and how to f]]></title>

<content type="html" xml:base="http://theeyetribe.com/forum/viewtopic.php?t=32&amp;p=926#p926"><![CDATA[
<blockquote><div><cite>bostwickenator wrote:</cite><br />Is this implemented in the server yet?<br /></div></blockquote><br /><br />On its way. This feature will mark version 1.0. It's not just a simple compensation coefficient, it's a whole new calibration model. <br />There's a couple of things left to fix and we won't ship this feature until it works really well. Preliminary results are pretty spectacular.<p>Statistics: Posted by <a href="http://theeyetribe.com/forum/memberlist.php?mode=viewprofile&amp;u=117">skataMartin</a> — 27 May 2014, 13:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[bostwickenator@gmail.com]]></name></author>
<updated>2014-05-27T05:08:57+02:00</updated>
<published>2014-05-27T05:08:57+02:00</published>
<id>http://theeyetribe.com/forum/viewtopic.php?t=32&amp;p=924#p924</id>
<link href="http://theeyetribe.com/forum/viewtopic.php?t=32&amp;p=924#p924"/>
<title type="html"><![CDATA[Re: Distance from sensor incurs vertical shift (and how to f]]></title>

<content type="html" xml:base="http://theeyetribe.com/forum/viewtopic.php?t=32&amp;p=924#p924"><![CDATA[
Is this implemented in the server yet?<p>Statistics: Posted by <a href="http://theeyetribe.com/forum/memberlist.php?mode=viewprofile&amp;u=2707">skatabostwickenator@gmail.com</a> — 27 May 2014, 05:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[bostwickenator@gmail.com]]></name></author>
<updated>2014-03-06T05:58:22+02:00</updated>
<published>2014-03-06T05:58:22+02:00</published>
<id>http://theeyetribe.com/forum/viewtopic.php?t=32&amp;p=520#p520</id>
<link href="http://theeyetribe.com/forum/viewtopic.php?t=32&amp;p=520#p520"/>
<title type="html"><![CDATA[Re: Distance from sensor incurs vertical shift (and how to f]]></title>

<content type="html" xml:base="http://theeyetribe.com/forum/viewtopic.php?t=32&amp;p=520#p520"><![CDATA[
Eye to eye distance will be far more accurate for determining your Z<p>Statistics: Posted by <a href="http://theeyetribe.com/forum/memberlist.php?mode=viewprofile&amp;u=2707">skatabostwickenator@gmail.com</a> — 06 Mar 2014, 05:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kevin.cole@devfacto.com]]></name></author>
<updated>2014-01-21T12:11:40+02:00</updated>
<published>2014-01-21T12:11:40+02:00</published>
<id>http://theeyetribe.com/forum/viewtopic.php?t=32&amp;p=168#p168</id>
<link href="http://theeyetribe.com/forum/viewtopic.php?t=32&amp;p=168#p168"/>
<title type="html"><![CDATA[Re: Distance from sensor incurs vertical shift (and how to f]]></title>

<content type="html" xml:base="http://theeyetribe.com/forum/viewtopic.php?t=32&amp;p=168#p168"><![CDATA[
I managed to add some compensation for the z-shift a bit.  I didn't use the calibration over a distance as it was proving to be too tedious and often the sensor would report bad data and I wasn't able to filter it out easily enough.  I switched my approach to using a formula.<br /><br />ZInitial = headPosition.Z at sweet spot;<br />ZCurrent = headPosition.Z;<br />YGaze = gazePoint.Y;<br />YMouse = cursorPoint.Y;<br />YDelta = YMouse - YGaze;<br /><br />YConstant = Math.Sqrt(Math.Abs(YDelta))/(ZCurrent - ZInitial);<br /><br />Then to compute the delta needed to put it back in the right spot:<br />YDelta = ((ZCurrent-ZInitial)*YConstant)^2<br /><br /><br />If I could get a good value for the head's Z-Distance from the sensor I'm sure it would work smoothly.  The code currently has a problem if the user heads more near to the sensor.  I think that's because I'm incorrectly judging head distance based on the pupils.  Would be nice to know the actual distance some how, maybe more calibrations and tweaking?<br /><br />How it works:<br /><br />1. The user runs a normal calibration run to set the sensor up properly (looking at the circles).<br />2. The user uses the GazeDot and positions their body so that the gaze dot lines up with where they are looking on the screen.<br />3. User clicks a button which calls SetSweetSpot()<br />4. User moves farther away, looking at the tip of their cursor and clicks a button that calls SetDeltas()<br />5. User moves closer to sensor and clicks a button that calls SetDeltas() again (which is supposed to calculate for YConstantOnNearZ but has issues right now)<br />6. You now have a method of correcting the gaze offset by a bit.<br /><br />I was able to keep the gaze location within 100 pixels of the actual gaze location, it's not perfect but it is a heck of a lot better.  Seems to work nicely within a 2 ft range from the sweet spot.  Would no doubt be more better if I could get a realistic head position or if the sensor had depth sensing in it.<br /><br />The X correction when you move side to side will most likely need to be done by figuring out the projection from the sensor to the user which I don't understand the math behind very well (I was never good at 3D Maths  <img src="http://theeyetribe.com/forum/images/smilies/icon_redface.gif" alt=":oops:" title="Embarrassed" /> ).<br /><br />Here's a video showing the result  (Video is unlisted)  <!-- m --><a class="postlink" href="http://www.youtube.com/watch?v=0PvtbHz_arE">http://www.youtube.com/watch?v=0PvtbHz_arE</a><!-- m --><br /><br /><br /><dl class="codebox"><dt>Code: </dt><dd><code>using System;<br />using System.Drawing;<br />using System.Runtime.InteropServices;<br />using TETCSharpClient;<br />using TETCSharpClient.Data;<br /><br />namespace NetworkController.Plugin.EyeTribe<br />{<br />    public class Correction : IGazeUpdateListener,IDisposable<br />    {<br />        public static Correction Instance;<br /><br />        public double ZInitial;<br />        public double ZCurrent;<br />        public double YGaze;<br />        public double YMouse;<br />        public double YDelta;<br />        public double YConstantOnFarZ;<br />        public double YConstantOnNearZ;<br /><br /><br />        public Correction()<br />        {<br />            Instance = this;<br />            GazeManager.Instance.AddGazeListener(this);<br />        }<br />        public void Dispose()<br />        {<br />            GazeManager.Instance.RemoveGazeListener(this);<br />            Instance = null;<br />        }<br /><br />        /// &lt;summary&gt;<br />        /// When looking at a point on the screen and the dot using the normal eyetribe result is exactly on the point you are looking at.<br />        /// &lt;/summary&gt;<br />        public void SetSweetSpot()<br />        {<br />            ZInitial = ZCurrent;<br />        }<br /><br /><br />        /// &lt;summary&gt;<br />        /// Assuming user is looking directly at the tip of mouse cursor the offsets can be calculated.<br />        /// The user should be leaned back or forward enough to make a noticable error.<br />        /// &lt;/summary&gt;<br />        public void SetDeltas()<br />        {<br />            YDelta = YMouse - YGaze;<br /><br />            //Perform calcs for constants<br />            //Yp= Sqr(Yd) / (Zc - Zi)<br />            if(ZCurrent &lt; ZInitial) YConstantOnFarZ = Math.Sqrt(Math.Abs(YDelta))/(ZCurrent - ZInitial);<br />            else YConstantOnNearZ = Math.Sqrt(Math.Abs(YDelta))/(ZCurrent - ZInitial); //Different constant for near due to bad head position z value<br />        }<br /><br /><br />        public void OnGazeUpdate(GazeData gazeData)<br />        {<br /><br />            var isValid = ((gazeData.State &amp; GazeData.STATE_TRACKING_GAZE) != 0)<br />                          &amp;&amp; ((gazeData.State &amp; GazeData.STATE_TRACKING_PRESENCE) != 0)<br />                          &amp;&amp; ((gazeData.State &amp; GazeData.STATE_TRACKING_EYES) != 0)<br />                          &amp;&amp; ((gazeData.State &amp; GazeData.STATE_TRACKING_FAIL) == 0)<br />                          &amp;&amp; ((gazeData.State &amp; GazeData.STATE_TRACKING_LOST) == 0)<br />                          &amp;&amp; gazeData.SmoothedCoordinates != null<br />                          &amp;&amp; gazeData.SmoothedCoordinates.X != 0<br />                          &amp;&amp; gazeData.SmoothedCoordinates.Y != 0<br />                ;<br />            if (!isValid) return;<br /><br />            var headPosition = gazeData.HeadPosition(); //See other post for code: http://theeyetribe.com/forum/viewtopic.php?f=11&amp;t=35&amp;sid=301d70c38eb44f37495cf997dc8d9b11<br />            if (headPosition == null) return;<br /><br />            //Now that we can suppose the data is probably valid we can make use of it.<br />            var cursorPoint = GetCursorPosition();<br />            var gazePoint = gazeData.SmoothedCoordinates;<br /><br />            ZCurrent = headPosition.Z;<br />            YGaze = gazePoint.Y;<br />            YMouse = cursorPoint.Y;<br /><br />        }<br /><br />        public Point2D CorrectPoint(Point2D point)<br />        {<br />            var result = new Point2D(point);<br />            var y = (ZCurrent - ZInitial)* (ZCurrent&lt;ZInitial ? YConstantOnFarZ : YConstantOnNearZ );<br />            result.Y = result.Y - (y*y); //Yd = ((Zc-Zi)*Yc)^2<br />            return result;<br />        }<br /><br /><br />        public void OnCalibrationStateChanged(bool isCalibrated) { }<br /><br />        public void OnScreenIndexChanged(int screenIndex) { }<br /><br />        #region Windows Mouse API<br />        <br />        /// &lt;summary&gt;<br />        /// Struct representing a point.<br />        /// &lt;/summary&gt;<br />        &#91;StructLayout(LayoutKind.Sequential)&#93;<br />        public struct POINT<br />        {<br />            public int X;<br />            public int Y;<br /><br />            public static implicit operator Point(POINT point)<br />            {<br />                return new Point(point.X, point.Y);<br />            }<br />        }<br /><br />        /// &lt;summary&gt;<br />        /// Retrieves the cursor's position, in screen coordinates.<br />        /// &lt;/summary&gt;<br />        /// &lt;see&gt;See MSDN documentation for further information.&lt;/see&gt;<br />        &#91;DllImport(&quot;user32.dll&quot;)&#93;<br />        public static extern bool GetCursorPos(out POINT lpPoint);<br /><br />        public static Point GetCursorPosition()<br />        {<br />            POINT lpPoint;<br />            GetCursorPos(out lpPoint);<br />            //bool success = User32.GetCursorPos(out lpPoint);<br />            // if (!success)<br /><br />            return lpPoint;<br />        }<br />        #endregion<br />    }<br /><br />}<br /></code></dd></dl><p>Statistics: Posted by <a href="http://theeyetribe.com/forum/memberlist.php?mode=viewprofile&amp;u=1830">skatakevin.cole@devfacto.com</a> — 21 Jan 2014, 12:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Martin]]></name></author>
<updated>2014-01-16T14:45:42+02:00</updated>
<published>2014-01-16T14:45:42+02:00</published>
<id>http://theeyetribe.com/forum/viewtopic.php?t=32&amp;p=128#p128</id>
<link href="http://theeyetribe.com/forum/viewtopic.php?t=32&amp;p=128#p128"/>
<title type="html"><![CDATA[Re: Distance from sensor incurs vertical shift (and how to f]]></title>

<content type="html" xml:base="http://theeyetribe.com/forum/viewtopic.php?t=32&amp;p=128#p128"><![CDATA[
Hi Kevin,<br /><br />You made the correct observation, this is a limitation with the initial release. <br /><br />I'd be glad to try out your compensation routine and potentially merge/branch the GIT repo. <br /><br />Thanks.<p>Statistics: Posted by <a href="http://theeyetribe.com/forum/memberlist.php?mode=viewprofile&amp;u=117">skataMartin</a> — 16 Jan 2014, 14:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kevin.cole@devfacto.com]]></name></author>
<updated>2014-01-16T04:30:22+02:00</updated>
<published>2014-01-16T04:30:22+02:00</published>
<id>http://theeyetribe.com/forum/viewtopic.php?t=32&amp;p=122#p122</id>
<link href="http://theeyetribe.com/forum/viewtopic.php?t=32&amp;p=122#p122"/>
<title type="html"><![CDATA[Distance from sensor incurs vertical shift (and how to fix)]]></title>

<content type="html" xml:base="http://theeyetribe.com/forum/viewtopic.php?t=32&amp;p=122#p122"><![CDATA[
I discovered the eye-tribe once calibrated will encounter issues if the user moves either forward or backward from the device.<br /><br />Moving further away causes a shift downwards, moving closer a shift upwards.<br /><br />I found I may be able to correct for this issue if I manipulate the output coordinates using the iris size.  Perhaps an additional calibration point could be to ask the user to lean back while staring at the same point and then lean forward staring at the same point, this way you can capture this change and adjust for it.<br /><br /><br />Another thing as a developer I may find better is getting the raw X/Y of the pupil location in relation to it's calibrated zone as a normalized float (1.0 to -1.0)    That way we may be able to internally do our own calibration or maths in-case our use-case for the device doesn't fit the current calibration method.  You can add these values for each eye on the GazeData class.<br /><br />For example, I would like to sit the device on a podium and work with dual monitor setup of rather large screens which may act as one large wide screen.<br /><br />Edit:<br />After reviewing the API it seems like the smoothed coordinates are returning such a setting (1/-1)  Ignore that portion =)  My initial point was from observation of the eyetribe ui and brief look at the samples.<br /><br />The Calibration for distance still stands though.  Do you accept contributions to the GIT for the CSharpClient?  Perhaps once I'm done I can expand on the code a bit?<p>Statistics: Posted by <a href="http://theeyetribe.com/forum/memberlist.php?mode=viewprofile&amp;u=1830">skatakevin.cole@devfacto.com</a> — 16 Jan 2014, 04:30</p><hr />
]]></content>
</entry>
</feed>