Face tracking with Arduino, Processing and OpenCV
I have stripped down the processing code to the bare basics so that it can be used however you want. I added lots of comments to make it easier to understand and leave you open to put your own actions in when criteria are met. I have also added an additional check to see if the face is in the middle of the screen, (min_x, max_x, min_y and max_y inside middle square), so additional actions can be performed, in the case of a robot, it could move towards you.
The stripped down processing code : https://www.dropbox.com/sh/vpvbsrpx43zzcen/S8Xi4MmMwj
Made the face tracking code to control a remote control car to show its potential uses.
The last update I will post on this. I was playing around with the basic sketch today and managed to read how far away the face is from the screen. All I did was put my face 30cm away from the screen and work out how many pixels wide the face bounding box was. I then did the same for 60cm and used the two points to form a linear equation to determine how far away the face is depending on how big the bounding box of the face is. I recorded this and the link is below:
How this actually works is described about below but also in the video. I suggest you watch the video as my writing is terrible.
The Processing code : https://www.dropbox.com/sh/v9hkdxuoazoyb0d/fCGQzEfBAK The OpenCV and Arduino libraries are needed. OpenCV also needs to be installed onto the computer.
The Arduino code : https://www.dropbox.com/sh/ujjlahx83ilv1j2/QB0bu8E-EJ
This is something that I have wanted to do for a very long time, face tracking. As I look at all my favorite films I see a common factor, technology, whether it was R2D2, flying cars or JARVIS from the Iron Man movies. I have already made something inspired by JARVIS, a simple voice control code written in Glovepie to control my computer seen here: http://www.youtube.com/watch?v=i5S1H1nogpI&feature=plcp, but this time I wanted to make something really cool. I had the idea in the shower to try to make something that would follow my face like something out of the i-Robot movie and the rough idea of how I would do it.
I have been mucking around with Processing for about a month now and the Arduino Uno for about 4 and have learnt a lot about the two and how the two can interact. I knew that I didn't have the skill-set to have a Arduino standalone face tracking system and later found out that this wouldn't be possible anyway because of the processing strength required cannot be provided by the Arduino. I looked into how processing could use my webcam and found many libraries with blob detection and such but nothing like what I really wanted. On my google adventures I found a motion detection code that took two frames from a video and subtracted colours in each pixels to detect changes in the overall picture, I liked this idea and decided to start with that. I played around with the code for a while but couldn't manage to split up the video data into 9 quadrants that I could use. More googling found OpenCV and all the powerful things that had been made with it, I decided this is what I would use. I installed OpenCV and installed OpenCV libraries for processing. I found a sample code for face detection and attempted to run it, it didn't work. After much troubleshooting I found out that Processing wasn't acquiring the appropriate file for face tracking so I had to input the full path directory to that file. After that it still didn't work, I had to include the rectangle class in Java also. After all this it finally started to work, Processing was tracking my face.
Now to talk about what I did. I broke up the screen into 9 different quadrants representing different areas of the screen, I did this visually by drawing 4 lines running up and down the screen to show where the areas are. The program drew a bounding box around the faces with a (x,y,width,height) values, all I did was simply check to see which quadrant the box was in and then print those results to Processing. Depending on what quadrant the box is in Processing will write cases to the Arduino through the serial port. The Arduino code listens for cases and increments the servos position accordingly.