cv = require 'opencv'

# First we create a new VideoCapture object to get
# video from the camera (0 for default camera)
camera = new cv.VideoCapture(1)

# we create a window to display the Video frames
namedWindow = new cv.NamedWindow('Video', 0)
color = [255,0,0]

frameRead = () ->
  # camera.read allows us to retrieve the current
  # frame to be displayed in the video window.
  camera.read((err, im) ->
    # We can check for errors and even break the
    # program execution if an error is detected here.
    console.log "The err ==>#{ err }" if err

    # There is no need to display the image width or Height
    # but I leave this here in case anyone needs to check them.
    #console.log("Width: #{im.width()}")
    #console.log("height: #{im.height()}")

    # Before working with the frame we need to check the image
    # is already available and has a width and height greater than 0,
    # otherwise it will fail when trying to do namedWindow.show()
    # and the image has width or height equal or less than 0.
    if im.width() > 0 and im.height() > 0
      #console.log("Interval ID => #{ intervalId }")
      #console.log(intervalId)
      clearInterval(intervalId) if intervalId?
      im.detectObject('./haarcascades/haarcascade_frontalface_alt.xml', {}, (err, faces) ->
        for face in faces
          im.rectangle([face.x, face.y], [face.x + face.width, face.y + face.height], [0,255,0], 2)

        # We use the previously created namedWindow to display the
        # video frame to wich we applied the blur and filter.
        namedWindow.show(im)

        # Finally we get the key pressed on the window to terminate
        # execution of the program.
        res = namedWindow.blockingWaitKey(0, 20)

        # In this case we terminate the program if any key is pressed.
        #if res >= 0 then do not set a new timeout to get a new frame.
        setTimeout(frameRead, 5) if res < 0
      )

  )

# We set an interval to retrieve frames from the
# video source and we get the intervalId so we can
# stop the program by pressing any key on the video feed window.
intervalId = setInterval(() ->
  frameRead(intervalId)
, 100)

Use recursinve frame reading (instead of time interval) from video feed to try and hit max frames per second.
Use recursinve frame reading (instead of time interval) from video feed to try and hit max frames per second.
