Sunday, August 22, 2010

Experimenting with FaceAPI

0 Kommentare
How do I look??

Works good without Eye-Tracker
Works slightly worse with my eye tracker goggles on ;)

Howto: Hide the cursor in Windows

0 Kommentare
A problem I had during the development of my gaze-enhanced tab switching, was that the mouse cursor was diverting the user's gaze. That's why I decided to hide the cursor, while gaze control is active.

A major problem here was that the .net funktions Cursor.Hide() and WinApi ShowCursor(false) are only valid for the user control they are called from.
I searched for a way to hide the cursors globally in windows.

One possibility which came to my mind was to change the Windows cursor temporarily (as you can also do it via System Control->Mouse Settings) to an invisible dummy cursor, which is basically just a .cur file without any content. The information for the currently active cursors is stored in the Windows registry. Reading from and changing the registry is not that big of a problem for C#.

So here is what I had to do:
  1. Store the current cursor path
  2. Change the cursors "Arrow" and "Hand" to the invisible.cur file
  3. Force a reload of the registry
  4. Later: restore the original cursors again.
After the jump is the code, which does what I wanted to accomplish. It is called on pressing the hotkey combination for "enable gaze control", which I set to the same hotkey combo as "show tab previews" in firefox :)

Saturday, August 14, 2010

C#: HowTo directly change a setting in an "*.exe.config" file

0 Kommentare
I had been searching for more than half a day for a way to directly change the values in the appSettings section in the  *.exe.config of my application. The problem is that the settings are read-only. I found no way to write to the *.exe.config file. I neither found a class or a method online to do this.
So I created my own method which directly accesses the *.exe.config file by making use of its XML structure.
Thus, I am able to add and change nodes and ultimately save the XML file.

Here is the code:

Wednesday, August 11, 2010

Processing Global Hotkey Events

0 Kommentare
I want to trigger an Event, everytime the ESC Key is pressed.
As shown below, this is npt that hard, when the program is in focus. If it out of focus, the event is not triggered.
Thus, I need global hotkey processing.

I found a page, where this method is explained using a custom class, which utilized Hooks.

More here:
http://www.tutorial-board.de/index.php?page=Thread&threadID=382
http://www.codeproject.com/KB/cs/globalhook.aspx
http://dotnet-snippets.de/dns/globale-hotkeys-tastenkombinationen-SID356.aspx

Handling the ESC Key in C#

0 Kommentare
Found this here: http://channel9.msdn.com/forums/TechOff/224745-Escape-Key-Event-Bug-C/?CommentID=224767
Escape Key is a command key, so you should achieve this with another trick, for example:

using System;
using System.Windows.Forms;

namespace HandleEscapeKeyDemo
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        protected override Boolean ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (keyData == Keys.Escape)
            {
                OnPressEscapeKey();
            }
            return true;
        }

        private void OnPressEscapeKey()
        {
            MessageBox.Show("Escape Key Is Pressed");
        }
    }
}


Sheva

WORKS!

Thursday, August 5, 2010

Trying to understand the smoothing algorithm from EyeWriter

1 Kommentare
The algorithm looks very simple:
There is one parameter, which controlls the intensity of the smoothin effect.

The formula is structured like this

NewCursorPosition =
       SmoothingFactor * OldCursorPosition
      + (1-SmoothingFactor) * ActualGazePosition

Code from testApp.cpp Line 62
   eyeSmoothed.x = CM.smoothing * eyeSmoothed.x + (1-CM.smoothing) * screenPoint.x;

One example for this:

NewPos = 0,97 * 487 + (1-0,97) * 705
              = 472 + 21
              = 493


The difference between OldPos and New Pos is 493-487 = 5px. This means, that the cursos slowly adopts to the actual gaze position without large jumps..
Increasing the Smoothing Factor leads to a much slower moving of the cursor, decreasing it, results in an abrupt jumping of the cursor, which gives it less stability.

From a first impression, the GT algorithm does not work as good as this simple and lean EyeWriter algorithm, AND uses a much more complicated logic. Therefore, I probably could implement this very simple algorithm instead.

However, I need to understand the GT algorithm first in order to decide.

Friday, July 16, 2010

Some captures from my first trials with my eye tracker

0 Kommentare
ITU Gaze Tracker

Eye Writer Tracking Software

Calibration with ITU Software
 

Calibration in EyeWriter Software

Eye Tracking Game

0 Kommentare

Eye tracking game: Summary from theo tveteras on Vimeo.

I don't believe that this works as shown in the video!!
These people are wildly moving their heads and bodies... how is exact eye tacking possible under these conditions?

I did neither find a link on how to assemble this nor a link to the software they are using

Sunday, July 11, 2010

Built my first Eye Tracker

0 Kommentare
This is it!! I've built my own eye tracker and I think I can be satisfied with the first try. I was able to remove the IR filter from to PS Eye and add an IR bandpass. I was also able to install the two IR LEDs and power them with two 1,5V batteries. With a twisted aluminum wire, I could mount the tracker to a pair of 1€ sunglasses.


I did testruns with this construction with ITU GazeTracker and the EyeWriter tracking software.
Both showed favourable results.
I could already use my eyes controlling a pointer in both softwares. However it was not that accurate, perhaps caused by my "temporal" eye tracker constuction.
Accuracy was better with ITU tracker, in my opinion.
TODO: Improve accuracy, either with better eye tracker or optimizing the software.

I found out that the EyeWriter software does not do any glint tracking, but only pupil tracking.
The glint tracking on the ITU software seems to require for brighter IR LEDs as sometimes, the tracking was poor.

Another problem, I encountered is that the glasses are black, which may sometimes disturb the tracker from my pupils. 
TODO: Use differently colored glasses or use a colored tape on my current ones

One problem occured because of the human anatomy: there is a huge vein running next to my eyes. Wearing the sunglasses tightly on my skin causes them to bounce, beacuse the vein gives an impulse everytime my heart beats.
TODO: Find sth. I can use for cushoning

All in all, I think these are good results for a first try.
Looking forward wrking on this interesting topic on Tuesday!

Saturday, July 10, 2010

Building my own Eye Tracker

0 Kommentare
TODO: Include pix and a step-by-step description

Trying to get the PS Eye to work:
Having sucessfully installed the driver on Windows7 (x86), I started the test application to see if the PS Cam is working.
Works...

However, I still don't get 60fps @ 640... what's the problem?
    Solution: http://codelaboratories.com/forums/viewthread/117/P10/

Problem after removing the IR Filter: the focal distace is a bit shorter => cam cannot focus on near objects
    Solution: Shorten the mount with sand paper!!
    Here: http://detsu.de/blog/index.php?post/2010/01/19/PS3eye-IR-filter-remove-focus


Hacking the PS Eye after the jump...