Click here to Skip to main content
15,860,844 members
Articles / Programming Languages / C#

Intelligent Screen Saver

Rate me:
Please Sign up or sign in to vote.
3.87/5 (17 votes)
15 Aug 2007CPOL2 min read 182.6K   10.9K   111   54
A utility to control screen saver on your computer using computer vision (human face detection), rather than idle timer.
Screenshot - facede.png

Introduction

This is a utility to control screen saver using human face detection. Human face detection is performed using OpenCV Haar-Cascade method. The software is primarily a daemon that resides in your system tray and keeps observing the input from a webcam to analyze if the user is no longer in view. Currently two angles are supported namely frontal pose and profile pose.

Background

The idea of an intelligent screen saver is not new. In the past, it was not achievable because of accuracy problems with computer vision algorithms and computation power of computers. OpenCV (open source computer vision library) has an implementation of the object detection algorithm suggested originally by Paul Viola. I have adopted from the face detection sample that comes with this library and have used the cascades files that come with it.

Using the Code

Face detection is performed by a mix-mode DLL, i.e. it uses unmanaged code to perform face detection and provides a managed wrapper. This DLL, hence can now be called from any CLR enabled language (C#, VB.NET, etc.). This DLL expects a managed System.Drawing.Image object and performs face detection.

This managed System.Drawing.Image object is taken from the ctlDxCam library (a custom library built from code posted on an article on CodeProject.com, it can capture frames from a webcam as System.Drawing.Image objects) which captures video frames from a webcam.

Screensaver is controlled by a class that uses borrowed code from another article on CodeProject.com. Please consult references section for details.

C++
// On the first thread, we perform polling for face detection
CommonVariables.FaceDetected = (faceLocator.WrapDetectFaces(LatestFrame)>0);

// On the second thread, we evaluate conditions to trigger screen saver
private void Run()
  {
   bool IsScreenSaverRunning;
   while(KeepRunning)
   {
    //check if screen saver is currently active
    IsScreenSaverRunning = ScreenSaverHandler.IsScreenSaverRunning();
    
    //if last captured frame has not been evaluated
    if(!CommonVariables.IsConsumed)
    {
    //was faces detected in the last polled frame
     if(CommonVariables.FaceDetected)
     {
      CommonVariables.VoteCount = 0;
    //yes face was detected, kill screen saver if running
      if(IsScreenSaverRunning)
        ScreenSaverHandler.StopScreenSaver();
     }
     else if(!IsScreenSaverRunning)
     {     
    //face was not detected, screen saver isnt running either
    //collect votes of no_face_detected
      CommonVariables.VoteCount++;
    //if votes exceed tolerated amount of no_face detected condition
      if(CommonVariables.VoteCount >= CommonVariables.MinVoteRequired)
      {
    //reset votescount and launch screen saver
       CommonVariables.VoteCount = 0;
       ScreenSaverHandler.LaunchScreenSaver();
      }
     }
    }
 
    if(IsScreenSaverRunning)
      Thread.Sleep(1000);     //shorter polling timer
    else             //longer polling timer
      Thread.Sleep(CommonVariables.PollingTimer); 
   }
  }  

The source code performs polling on the camera input and evaluates the captured frame at desired interval of time. For each frame that does not have a face in it, a counter (VoteCount) is incremented. After a specified number of such votes, screen saver is launched.

If the polling timer is set to 5 seconds and required votes is set to 2, then if a person leaves his seat, screen saver will start running in approximately (5*2) 10 seconds.

Points of Interest

This source code demonstrates an interesting concept to use OpenCV from managed code (C#, VB.NET, Managed VC++.NET). The algorithm of face detection is very robust but still has its limitations. False detection of the algorithm can be adjusted by setting the light condition of the environment and camera position, etc. User can select whether he wants frontal face detection or profile face detection and hence place camera in respective angles.

References

History

  • First version, proof of concept

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Web Developer
Pakistan Pakistan
BCSE - Software Engineering (2000 - 2004)
Foundation University Institute of Management and Computer Sciences.
Pakistan.

MS - Computer Sciences (2004 - 2005)
Lahore Univeristy of Management Sciences
Pakistan.

Comments and Discussions

 
GeneralRe: WrapGetFaceCordinates help Pin
Zeeshan Ejaz Bhatti19-Sep-07 7:43
Zeeshan Ejaz Bhatti19-Sep-07 7:43 
Questioncall the DLL from ASP .NET Pin
skull_missah17-Sep-07 10:47
skull_missah17-Sep-07 10:47 
AnswerRe: call the DLL from ASP .NET Pin
Zeeshan Ejaz Bhatti18-Sep-07 0:04
Zeeshan Ejaz Bhatti18-Sep-07 0:04 
GeneralRe: call the DLL from ASP .NET Pin
skull_missah18-Sep-07 4:52
skull_missah18-Sep-07 4:52 
GeneralCan't build in VS2005... Pin
User 1942896-Aug-07 23:36
User 1942896-Aug-07 23:36 
GeneralRe: Can't build in VS2005... Pin
Zeeshan Ejaz Bhatti9-Aug-07 23:24
Zeeshan Ejaz Bhatti9-Aug-07 23:24 
GeneralRe: Can't build in VS2005... Pin
User 1942899-Aug-07 23:50
User 1942899-Aug-07 23:50 
GeneralRe: Can't build in VS2005... Pin
Zeeshan Ejaz Bhatti10-Aug-07 0:04
Zeeshan Ejaz Bhatti10-Aug-07 0:04 
I found the fix, open project properties of the project FaceDetectionWrapper.. and remove the /ZI switch from the "c++" section of the tree..

All Rights Reserved! All Wrongs Revenged!

GeneralRe: Can't build in VS2005... Pin
Zeeshan Ejaz Bhatti10-Aug-07 3:21
Zeeshan Ejaz Bhatti10-Aug-07 3:21 
GeneralRe: Can't build in VS2005... Pin
br00t_4_c14-Aug-07 7:42
br00t_4_c14-Aug-07 7:42 
GeneralRe: Can't build in VS2005... Pin
User 19428915-Aug-07 1:35
User 19428915-Aug-07 1:35 
GeneralRe: Can't build in VS2005... Pin
Zeeshan Ejaz Bhatti15-Aug-07 0:25
Zeeshan Ejaz Bhatti15-Aug-07 0:25 
GeneralRe: Can't build in VS2005... Pin
br00t_4_c24-Aug-07 9:01
br00t_4_c24-Aug-07 9:01 
GeneralRe: Can't build in VS2005... Pin
Zeeshan Ejaz Bhatti24-Aug-07 9:54
Zeeshan Ejaz Bhatti24-Aug-07 9:54 
GeneralRe: Can't build in VS2005... [modified] Pin
trecee_jhnsn18-Oct-07 1:44
trecee_jhnsn18-Oct-07 1:44 
GeneralRe: Can't build in VS2005... Pin
Zeeshan Ejaz Bhatti23-Oct-07 23:13
Zeeshan Ejaz Bhatti23-Oct-07 23:13 
GeneralData corrupted Pin
Eduardolemco24-Jul-07 16:55
Eduardolemco24-Jul-07 16:55 
GeneralRe: Data corrupted Pin
Zeeshan Ejaz Bhatti25-Jul-07 9:06
Zeeshan Ejaz Bhatti25-Jul-07 9:06 
GeneralRe: Data corrupted Pin
Eduardolemco25-Jul-07 16:22
Eduardolemco25-Jul-07 16:22 
GeneralRe: Data corrupted Pin
Zeeshan Ejaz Bhatti26-Jul-07 9:29
Zeeshan Ejaz Bhatti26-Jul-07 9:29 
GeneralRe: Data corrupted Pin
Zeeshan Ejaz Bhatti25-Jul-07 9:14
Zeeshan Ejaz Bhatti25-Jul-07 9:14 
GeneralIf a tree falls in a forest with no one there to hear it... Pin
Rei Miyasaka23-Jul-07 0:20
Rei Miyasaka23-Jul-07 0:20 
GeneralRe: If a tree falls in a forest with no one there to hear it... Pin
Zeeshan Ejaz Bhatti23-Jul-07 6:57
Zeeshan Ejaz Bhatti23-Jul-07 6:57 
GeneralRe: If a tree falls in a forest with no one there to hear it... Pin
Rei Miyasaka23-Jul-07 10:43
Rei Miyasaka23-Jul-07 10:43 
GeneralRe: If a tree falls in a forest with no one there to hear it... Pin
Zeeshan Ejaz Bhatti23-Jul-07 18:57
Zeeshan Ejaz Bhatti23-Jul-07 18:57 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.