Paparazzi UAS  v5.15_devel-46-gd23ed71
Paparazzi is a free software Unmanned Aircraft System.
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
lucas_kanade.c File Reference

efficient fixed-point optical-flow calculation More...

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include "lucas_kanade.h"
+ Include dependency graph for lucas_kanade.c:

Go to the source code of this file.

Functions

struct flow_topticFlowLK (struct image_t *new_img, struct image_t *old_img, struct point_t *points, uint16_t *points_cnt, uint16_t half_window_size, uint16_t subpixel_factor, uint8_t max_iterations, uint8_t step_threshold, uint8_t max_points, uint8_t pyramid_level, uint8_t keep_bad_points)
 
struct flow_topticFlowLK_flat (struct image_t *new_img, struct image_t *old_img, struct point_t *points, uint16_t *points_cnt, uint16_t half_window_size, uint16_t subpixel_factor, uint8_t max_iterations, uint8_t step_threshold, uint16_t max_points, uint8_t keep_bad_points)
 Compute the optical flow of several points using the Lucas-Kanade algorithm by Yves Bouguet The initial fixed-point implementation is doen by G. More...
 

Detailed Description

efficient fixed-point optical-flow calculation

Compute the optical flow of several points using the pyramidal Lucas-Kanade algorithm by Yves Bouguet The initial fixed-point implementation is done by G.

  • Initial fixed-point C implementation by G. de Croon
  • Algorithm: Lucas-Kanade by Yves Bouguet
  • Publication: http://robots.stanford.edu/cs223b04/algo_tracking.pdf

    de Croon and is adapted by Freek van Tienen for the implementation in Paparazzi. Pyramids implementation and related development done by Hrvoje Brezak.

    Parameters
    [in]*new_imgThe newest grayscale image (TODO: fix YUV422 support)
    [in]*old_imgThe old grayscale image (TODO: fix YUV422 support)
    [in]*pointsPoints to start tracking from
    [in,out]points_cntThe amount of points and it returns the amount of points tracked
    [in]half_window_sizeHalf the window size (in both x and y direction) to search inside
    [in]subpixel_factorThe subpixel factor which calculations should be based on
    [in]max_iterationsMaximum amount of iterations to find the new point
    [in]step_thresholdThe threshold of additional subpixel flow at which the iterations should stop
    [in]max_pointsThe maximum amount of points to track, we skip x points and then take a point.
    [in]pyramid_levelLevel of pyramid used in computation (0 == no pyramids used)
    Returns
    The vectors from the original *points in subpixels

    Pyramidal implementation of Lucas-Kanade feature tracker.

Uses input images to build pyramid of padded images.

For every pyramid level:

For all points:

  • (1) determine the subpixel neighborhood in the old image
  • (2) get the x- and y- gradients
  • (3) determine the 'G'-matrix [sum(Axx) sum(Axy); sum(Axy) sum(Ayy)], where sum is over the window
  • (4) iterate over taking steps in the image to minimize the error:
    • [a] get the subpixel neighborhood in the new image
    • [b] determine the image difference between the two neighborhoods
    • [c] calculate the 'b'-vector
    • [d] calculate the additional flow step and possibly terminate the iteration
  • (5) use calculated flow as initial flow estimation for next level of pyramid

Definition in file lucas_kanade.c.

Function Documentation

struct flow_t* opticFlowLK ( struct image_t new_img,
struct image_t old_img,
struct point_t points,
uint16_t points_cnt,
uint16_t  half_window_size,
uint16_t  subpixel_factor,
uint8_t  max_iterations,
uint8_t  step_threshold,
uint8_t  max_points,
uint8_t  pyramid_level,
uint8_t  keep_bad_points 
)
struct flow_t* opticFlowLK_flat ( struct image_t new_img,
struct image_t old_img,
struct point_t points,
uint16_t points_cnt,
uint16_t  half_window_size,
uint16_t  subpixel_factor,
uint8_t  max_iterations,
uint8_t  step_threshold,
uint16_t  max_points,
uint8_t  keep_bad_points 
)

Compute the optical flow of several points using the Lucas-Kanade algorithm by Yves Bouguet The initial fixed-point implementation is doen by G.

de Croon and is adapted by Freek van Tienen for the implementation in Paparazzi.

Parameters
[in]*new_imgThe newest grayscale image (TODO: fix YUV422 support)
[in]*old_imgThe old grayscale image (TODO: fix YUV422 support)
[in]*pointsPoints to start tracking from
in/out]points_cnt The amount of points and it returns the amount of points tracked
[in]half_window_sizeHalf the window size (in both x and y direction) to search inside
[in]subpixel_factorThe subpixel factor which calculations should be based on
[in]max_iterationMaximum amount of iterations to find the new point
[in]step_thresholdThe threshold at which the iterations should stop
[in]max_pointThe maximum amount of points to track, we skip x points and then take a point.
Returns
The vectors from the original *points in subpixels

Definition at line 266 of file lucas_kanade.c.

References flow_t::error, FALSE, flow_t::flow_x, flow_t::flow_y, image_t::h, image_calculate_g(), image_create(), image_difference(), image_free(), IMAGE_GRADIENT, image_gradients(), IMAGE_GRAYSCALE, image_multiply(), image_subpixel_window(), LARGE_FLOW_ERROR, p, patch_size, flow_t::pos, TRUE, image_t::w, point_t::x, and point_t::y.

Referenced by opticFlowLK().

+ Here is the call graph for this function:

+ Here is the caller graph for this function: