c++/windows software development, image processing from video stream
Skills required: C++ development for Windows, experience with image analysis
I would like a program, written in C++, that analyzes in real-time video from the computer's webcam and looks for situations where most of the image is relatively stationary, except for two medium-sized areas of rapidly changing pixels. The purpose of the program will be to detect when a person sitting in front of the screen closes or opens their eyes or blinks. For this algorithm to work, the person of course would have to hold their head stationary and not change their facial expression while the eyes are opening or closing. Note that no complicated facial recognition is needed for the algorithm as described, though if you (unlike me) are an expert in image recognition and firmly believe that facial recognition will be necessary, please let me know. Note that you may not assume that the person's head will be vertically oriented, it can also be horizontally oriented such that from the point of view of the webcam one eye will be above the other (this will happen, for example, if the user is lying on the bed). Ideally it should work regardless of the angle, provided of course that the user's eyes are clearly visible. Note that the algorithm I outlined will not be able to distinguish between eyes being closed and eyes being opened, but of course it should be able to distinguish blinks (as a quick succession of two actions). If you can figure out an easy way to distinguish opening from closing, that's a bonus, but if not you should simply assume that the user starts out with their eyes open and go from there.
More exact specifications: the project will be deemed complete if, in addition to satisfying the above description, it successfully passes the following tests:
– Accuracy test. I will perform different eye actions facing the screen at different tilt angles of my head, mostly around 0° and 90°, with no head movement or change in facial expression during the actions. The program must indicate all actions it recognizes in its dialog window and must make no more than one mistake per 1000 actions (any misrecognized action or false positive counts as a mistake). I will also move my head around, move my laptop around, etc. for 3 min. and the program must not give a single false positive (of course, it's not supposed to recognize any eye actions either under those conditions). In the hopefully unlikely event of a dispute, the person that mediates the dispute will be asked to test the program in the way described above for a few minutes and their judgment on the accuracy of the program will be final.
– Speed and resource utilization test. I will look at how fast, after an action is performed, the program indicates it in its window. The subjective impression must be that recognition happens in real time, i.e. that there is no or virtually no delay (in case of a dispute, it is the subjective impression of whoever mediates it that we will rely on to determine if this condition is satisfied). I will also look at resource utilization of the program using Windows task manager. You must utilize no more than 100 MB of memory and no more than 25% of processor time on a laptop with pretty average performance characteristics (I will test it on Toshiba Portégé, i5 processor, Windows experience Index of 5.9, in case of a dispute, the computer of the mediator is to be used, with the same or higher Windows experience Index)
– Correct data representation test. To show that the data the program collects is stored in an easily analyzable format, the program must perform the following simple action: whenever the user blinks twice with an interval separating the blinks of between 0.25 and 0.41 seconds followed by 0.5 seconds of no eye actions, the program will send a mouseclick to the current location of the mouse cursor. In addition, whenever the user closes their eyes for between 0.5 and 1.0 seconds and then opens them the program will indicate in its dialog window: "eyes were closed".
Note about the budget: I have a rough idea of the complexity of the job and my budget reflects that, however if you believe that to satisfy the requirements I outlined would require a higher budget please let me know, I have some wiggle room. Also, if you wish, I can separate the project into two phases, so that once you complete the first phase you can receive a predefined percentage of the price, with the rest payable when the full project is complete.