Lucas and Kanade developed an algorithm which allows tracking of object through a video stream. The algorithm requires less resources and is usually faster in response than many other forms of tracking.
Pros :
- low resource
- quick response time
- can track many points at once
Cons:
- requires or prefers high contrast corners over plain backgrounds
- initial tracking points must be set manually, or by some other algorithm
- will not "re-aquire" a corner if the corner moves out of the field of view
The OpenCV service has this algorithm incorporated into the LKOpticalTrack filter. Start MRL and load an OpenCV service. I usually use PyramidDown too, so the display is more responsive. After PyramidDown, load LKOpticalTrack, name it something creative like lkopticaltrack :)
Highlight the filter, then pick something you want to track in the video. Click on it with the mouse. A red dot should appear and follow whatever you selected until it runs out of the field of view.
This point is published as a message so other Services can consume it, like the Jython service, which in turn could control a pan / tilt kit.
Programmatic Control
# lkOpticalTrack.py # to experiment with Lucas Kanade optical flow/tracking # starts opencv and adds the filter and one tracking point from jarray import zeros, array import time opencv = runtime.createAndStart("opencv","OpenCV") # scale the view down - faster since updating the screen is # relatively slow opencv.addFilter("pyramidDown1","PyramidDown") # add out LKOpticalTrack filter opencv.addFilter("lkOpticalTrack1","LKOpticalTrack") # begin capturing opencv.capture() # set focus on the lkOpticalTrack filter opencv.setDisplayFilter("lkOpticalTrack1") # rest a second or 2 for video to stabalize time.sleep(2) # set a point in the middle of a 320 X 240 view screen opencv.invokeFilterMethod("lkOpticalTrack1","samplePoint", 160, 120) #opencv.stopCapture()