Face detection and tracking

<< return to Python examples

This section illustrates the possibilites of ALFaceDetection.


Detect faces and print information about them.


# -*- encoding: UTF-8 -*- 
# This test demonstrates how to use the ALFaceDetection module.
# Note that you might not have this module depending on your distribution
# - We first instantiate a proxy to the ALFaceDetection module
#     Note that this module should be loaded on the robot's naoqi.
#     The module output its results in ALMemory in a variable
#     called "FaceDetected"

# - We then read this ALMemory value and check whether we get
#   interesting things.

import time

from naoqi import ALProxy

IP = "nao.local"  # Replace here with your NaoQi's IP address.
PORT = 9559

# Create a proxy to ALFaceDetection
  faceProxy = ALProxy("ALFaceDetection", IP, PORT)
except Exception, e:
  print "Error when creating face detection proxy:"
  print str(e)

# Subscribe to the ALFaceDetection proxy
# This means that the module will write in ALMemory with
# the given period below
period = 500
faceProxy.subscribe("Test_Face", period, 0.0 )

# ALMemory variable where the ALFacedetection modules
# outputs its results
memValue = "FaceDetected"

# Create a proxy to ALMemory
  memoryProxy = ALProxy("ALMemory", IP, PORT)
except Exception, e:
  print "Error when creating memory proxy:"
  print str(e)

# A simple loop that reads the memValue and checks whether faces are detected.
for i in range(0, 20):
  val = memoryProxy.getData(memValue)

  print ""
  print "*****"
  print ""

  # Check whether we got a valid output.
  if(val and isinstance(val, list) and len(val) >= 2):

    # We detected faces !
    # For each face, we can read its shape info and ID.

    # First Field = TimeStamp.
    timeStamp = val[0]

    # Second Field = array of face_Info's.
    faceInfoArray = val[1]

      # Browse the faceInfoArray to get info on each detected face.
      for j in range( len(faceInfoArray)-1 ):
        faceInfo = faceInfoArray[j]

        # First Field = Shape info.
        faceShapeInfo = faceInfo[0]

        # Second Field = Extra info (empty for now).
        faceExtraInfo = faceInfo[1]

        print "  alpha %.3f - beta %.3f" % (faceShapeInfo[1], faceShapeInfo[2])
        print "  width %.3f - height %.3f" % (faceShapeInfo[3], faceShapeInfo[4])

    except Exception, e:
      print "faces detected, but it seems getData is invalid. ALValue ="
      print val
      print "Error msg %s" % (str(e))
    print "No face detected"

# Unsubscribe the module.

print "Test terminated successfully."


Detect and track faces with NAO’s head.


# -*- encoding: UTF-8 -*-
# This python script assumes that you have correctly set your PYTHONPATH
# environment variable to "your_naoqi_sdk_path"/lib/.
# When tracking is activated, faces looking sideways, or located further away
# should be tracked for a longer period.
# Launch Monitor, Cameraviewer, activate face detection, and see if it works better.

from naoqi import ALProxy

import sys

USAGE = "USAGE:\n" \
        "python vision_setfacetracking.py [NAO_IP] [0 or 1] \n" \
        "\nExamples: \n" \
        "Enable tracking: set_tracking.py 1\n" \
        "Disable tracking: set_tracking.py 0"

def set_nao_face_detection_tracking(nao_ip, nao_port, tracking_enabled):
    """Make a proxy to nao's ALFaceDetection and enable/disable tracking.

    faceProxy = ALProxy("ALFaceDetection", nao_ip, nao_port)

    print "Will set tracking to '%s' on the robot ..." % tracking_enabled

    # Enable or disable tracking.

    # Just to make sure correct option is set.
    print "Is tracking now enabled on the robot?", faceProxy.isTrackingEnabled()

def main():
    # Specify your IP address here.
    nao_ip = ""
    nao_port = 9559

    tracking_enabled = True

        if len(sys.argv) > 1:
            nao_ip = sys.argv[1]

        if len(sys.argv) > 2:
            tracking_enabled = bool(int(sys.argv[2]))

        set_nao_face_detection_tracking(nao_ip, nao_port, tracking_enabled)

    except Exception as e:
        print "Exception Caught: %s\n" % e
        print USAGE

if __name__ == "__main__":