|
Paparazzi UAS
v5.18.0_stable
Paparazzi is a free software Unmanned Aircraft System.
|
Go to the documentation of this file.
53 #define OPTICFLOW_SHOW_CORNERS 0
55 #define EXHAUSTIVE_FAST 0
68 #ifndef OPTICFLOW_CORNER_METHOD
69 #define OPTICFLOW_CORNER_METHOD ACT_FAST
72 #ifndef OPTICFLOW_CORNER_METHOD_CAMERA2
73 #define OPTICFLOW_CORNER_METHOD_CAMERA2 ACT_FAST
79 #ifndef OPTICFLOW_MAX_TRACK_CORNERS
80 #define OPTICFLOW_MAX_TRACK_CORNERS 25
83 #ifndef OPTICFLOW_MAX_TRACK_CORNERS_CAMERA2
84 #define OPTICFLOW_MAX_TRACK_CORNERS_CAMERA2 25
89 #ifndef OPTICFLOW_WINDOW_SIZE
90 #define OPTICFLOW_WINDOW_SIZE 10
93 #ifndef OPTICFLOW_WINDOW_SIZE_CAMERA2
94 #define OPTICFLOW_WINDOW_SIZE_CAMERA2 10
99 #ifndef OPTICFLOW_SEARCH_DISTANCE
100 #define OPTICFLOW_SEARCH_DISTANCE 20
103 #ifndef OPTICFLOW_SEARCH_DISTANCE_CAMERA2
104 #define OPTICFLOW_SEARCH_DISTANCE_CAMERA2 20
109 #ifndef OPTICFLOW_SUBPIXEL_FACTOR
110 #define OPTICFLOW_SUBPIXEL_FACTOR 10
113 #ifndef OPTICFLOW_SUBPIXEL_FACTOR_CAMERA2
114 #define OPTICFLOW_SUBPIXEL_FACTOR_CAMERA2 10
119 #ifndef OPTICFLOW_RESOLUTION_FACTOR
120 #define OPTICFLOW_RESOLUTION_FACTOR 100
123 #ifndef OPTICFLOW_RESOLUTION_FACTOR_CAMERA2
124 #define OPTICFLOW_RESOLUTION_FACTOR_CAMERA2 100
129 #ifndef OPTICFLOW_MAX_ITERATIONS
130 #define OPTICFLOW_MAX_ITERATIONS 10
133 #ifndef OPTICFLOW_MAX_ITERATIONS_CAMERA2
134 #define OPTICFLOW_MAX_ITERATIONS_CAMERA2 10
139 #ifndef OPTICFLOW_THRESHOLD_VEC
140 #define OPTICFLOW_THRESHOLD_VEC 2
143 #ifndef OPTICFLOW_THRESHOLD_VEC_CAMERA2
144 #define OPTICFLOW_THRESHOLD_VEC_CAMERA2 2
149 #ifndef OPTICFLOW_PYRAMID_LEVEL
150 #define OPTICFLOW_PYRAMID_LEVEL 2
153 #ifndef OPTICFLOW_PYRAMID_LEVEL_CAMERA2
154 #define OPTICFLOW_PYRAMID_LEVEL_CAMERA2 2
159 #ifndef OPTICFLOW_FAST9_ADAPTIVE
160 #define OPTICFLOW_FAST9_ADAPTIVE TRUE
163 #ifndef OPTICFLOW_FAST9_ADAPTIVE_CAMERA2
164 #define OPTICFLOW_FAST9_ADAPTIVE_CAMERA2 TRUE
169 #ifndef OPTICFLOW_FAST9_THRESHOLD
170 #define OPTICFLOW_FAST9_THRESHOLD 20
173 #ifndef OPTICFLOW_FAST9_THRESHOLD_CAMERA2
174 #define OPTICFLOW_FAST9_THRESHOLD_CAMERA2 20
179 #ifndef OPTICFLOW_FAST9_MIN_DISTANCE
180 #define OPTICFLOW_FAST9_MIN_DISTANCE 10
183 #ifndef OPTICFLOW_FAST9_MIN_DISTANCE_CAMERA2
184 #define OPTICFLOW_FAST9_MIN_DISTANCE_CAMERA2 10
189 #ifndef OPTICFLOW_FAST9_PADDING
190 #define OPTICFLOW_FAST9_PADDING 20
193 #ifndef OPTICFLOW_FAST9_PADDING_CAMERA2
194 #define OPTICFLOW_FAST9_PADDING_CAMERA2 20
200 #define FAST9_LOW_THRESHOLD 5
201 #define FAST9_HIGH_THRESHOLD 60
204 #ifndef OPTICFLOW_METHOD
205 #define OPTICFLOW_METHOD 0
208 #ifndef OPTICFLOW_METHOD_CAMERA2
209 #define OPTICFLOW_METHOD_CAMERA2 0
214 #if OPTICFLOW_METHOD > 1
215 #error WARNING: Both Lukas Kanade and EdgeFlow are NOT selected camera1
218 #if OPTICFLOW_METHOD_CAMERA2 > 1
219 #error WARNING: Both Lukas Kanade and EdgeFlow are NOT selected camera2
222 #ifndef OPTICFLOW_DEROTATION
223 #define OPTICFLOW_DEROTATION TRUE
226 #ifndef OPTICFLOW_DEROTATION_CAMERA2
227 #define OPTICFLOW_DEROTATION_CAMERA2 TRUE
232 #ifndef OPTICFLOW_DEROTATION_CORRECTION_FACTOR_X
233 #define OPTICFLOW_DEROTATION_CORRECTION_FACTOR_X 1.0
236 #ifndef OPTICFLOW_DEROTATION_CORRECTION_FACTOR_X_CAMERA2
237 #define OPTICFLOW_DEROTATION_CORRECTION_FACTOR_X_CAMERA2 1.0
242 #ifndef OPTICFLOW_DEROTATION_CORRECTION_FACTOR_Y
243 #define OPTICFLOW_DEROTATION_CORRECTION_FACTOR_Y 1.0
246 #ifndef OPTICFLOW_DEROTATION_CORRECTION_FACTOR_Y_CAMERA2
247 #define OPTICFLOW_DEROTATION_CORRECTION_FACTOR_Y_CAMERA2 1.0
252 #ifndef OPTICFLOW_MEDIAN_FILTER
253 #define OPTICFLOW_MEDIAN_FILTER FALSE
256 #ifndef OPTICFLOW_MEDIAN_FILTER_CAMERA2
257 #define OPTICFLOW_MEDIAN_FILTER_CAMERA2 FALSE
262 #ifndef OPTICFLOW_FEATURE_MANAGEMENT
263 #define OPTICFLOW_FEATURE_MANAGEMENT 0
266 #ifndef OPTICFLOW_FEATURE_MANAGEMENT_CAMERA2
267 #define OPTICFLOW_FEATURE_MANAGEMENT_CAMERA2 0
272 #ifndef OPTICFLOW_FAST9_REGION_DETECT
273 #define OPTICFLOW_FAST9_REGION_DETECT 1
276 #ifndef OPTICFLOW_FAST9_REGION_DETECT_CAMERA2
277 #define OPTICFLOW_FAST9_REGION_DETECT_CAMERA2 1
282 #ifndef OPTICFLOW_FAST9_NUM_REGIONS
283 #define OPTICFLOW_FAST9_NUM_REGIONS 9
286 #ifndef OPTICFLOW_FAST9_NUM_REGIONS_CAMERA2
287 #define OPTICFLOW_FAST9_NUM_REGIONS_CAMERA2 9
292 #ifndef OPTICFLOW_ACTFAST_LONG_STEP
293 #define OPTICFLOW_ACTFAST_LONG_STEP 10
296 #ifndef OPTICFLOW_ACTFAST_LONG_STEP_CAMERA2
297 #define OPTICFLOW_ACTFAST_LONG_STEP_CAMERA2 10
302 #ifndef OPTICFLOW_ACTFAST_SHORT_STEP
303 #define OPTICFLOW_ACTFAST_SHORT_STEP 2
306 #ifndef OPTICFLOW_ACTFAST_SHORT_STEP_CAMERA2
307 #define OPTICFLOW_ACTFAST_SHORT_STEP_CAMERA2 2
312 #ifndef OPTICFLOW_ACTFAST_GRADIENT_METHOD
313 #define OPTICFLOW_ACTFAST_GRADIENT_METHOD 1
316 #ifndef OPTICFLOW_ACTFAST_GRADIENT_METHOD_CAMERA2
317 #define OPTICFLOW_ACTFAST_GRADIENT_METHOD_CAMERA2 1
322 #ifndef OPTICFLOW_ACTFAST_MIN_GRADIENT
323 #define OPTICFLOW_ACTFAST_MIN_GRADIENT 10
326 #ifndef OPTICFLOW_ACTFAST_MIN_GRADIENT_CAMERA2
327 #define OPTICFLOW_ACTFAST_MIN_GRADIENT_CAMERA2 10
333 #ifndef OPTICFLOW_BODY_TO_CAM_PHI
334 #define OPTICFLOW_BODY_TO_CAM_PHI 0
336 #ifndef OPTICFLOW_BODY_TO_CAM_THETA
337 #define OPTICFLOW_BODY_TO_CAM_THETA 0
339 #ifndef OPTICFLOW_BODY_TO_CAM_PSI
340 #define OPTICFLOW_BODY_TO_CAM_PSI -M_PI_2
343 #ifndef OPTICFLOW_BODY_TO_CAM_PHI_CAMERA2
344 #define OPTICFLOW_BODY_TO_CAM_PHI_CAMERA2 0
346 #ifndef OPTICFLOW_BODY_TO_CAM_THETA_CAMERA2
347 #define OPTICFLOW_BODY_TO_CAM_THETA_CAMERA2 0
349 #ifndef OPTICFLOW_BODY_TO_CAM_PSI_CAMERA2
350 #define OPTICFLOW_BODY_TO_CAM_PSI_CAMERA2 -M_PI_2
355 #ifndef OPTICFLOW_TRACK_BACK
356 #define OPTICFLOW_TRACK_BACK FALSE
359 #ifndef OPTICFLOW_TRACK_BACK_CAMERA2
360 #define OPTICFLOW_TRACK_BACK_CAMERA2 FALSE
367 #ifndef OPTICFLOW_SHOW_FLOW
368 #define OPTICFLOW_SHOW_FLOW FALSE
371 #ifndef OPTICFLOW_SHOW_FLOW_CAMERA2
372 #define OPTICFLOW_SHOW_FLOW_CAMERA2 FALSE
379 #include "filters/median_filter.h"
385 static int cmp_flow(
const void *a,
const void *
b);
386 static int cmp_array(
const void *a,
const void *
b);
440 #ifdef OPTICFLOW_CAMERA2
517 float error_threshold;
518 int n_iterations_RANSAC, n_samples_RANSAC, success_fit;
524 result->
fps = 1000.f / dt;
584 #if OPTICFLOW_SHOW_CORNERS
634 int32_t back_x, back_y, diff_x, diff_y, dist_squared;
635 int32_t back_track_threshold = 200;
641 diff_x = back_x - vectors[i].
pos.
x;
642 diff_y = back_y - vectors[i].
pos.
y;
643 dist_squared = diff_x * diff_x + diff_y * diff_y;
645 if (dist_squared > back_track_threshold) {
657 uint8_t color[4] = {0, 0, 0, 0};
658 uint8_t bad_color[4] = {0, 0, 0, 0};
672 error_threshold = 10.0f;
673 n_iterations_RANSAC = 20;
674 n_samples_RANSAC = 5;
676 n_samples_RANSAC, img->
w, img->
h, &fit_info);
716 float diff_flow_x = 0.f;
717 float diff_flow_y = 0.f;
721 float rotation_threshold = M_PI / 180.0f;
749 uint8_t color[4] = {255, 255, 255, 255};
750 uint8_t bad_color[4] = {255, 255, 255, 255};
826 struct flow_t *predicted_flow_vectors = malloc(
sizeof(
struct flow_t) * n_points);
849 float x_n_new, y_n_new, x_pix_new, y_pix_new;
850 float predicted_flow_x, predicted_flow_y;
851 for (
uint16_t i = 0; i < n_points; i++) {
853 predicted_flow_vectors[i].
pos.
x = flow_vectors[i].
pos.
x;
854 predicted_flow_vectors[i].
pos.
y = flow_vectors[i].
pos.
y;
860 predicted_flow_x =
A * x_n * y_n -
B * x_n * x_n -
B + C * y_n;
861 predicted_flow_y = -C * x_n +
A +
A * y_n * y_n -
B * x_n * y_n;
863 x_n_new = x_n + predicted_flow_x;
864 y_n_new = y_n + predicted_flow_y;
871 predicted_flow_vectors[i].
error = 0;
873 predicted_flow_vectors[i].
flow_x = 0;
874 predicted_flow_vectors[i].
flow_y = 0;
878 predicted_flow_vectors[i].
flow_x = 0;
879 predicted_flow_vectors[i].
flow_y = 0;
883 return predicted_flow_vectors;
918 if (!exists) {
c1++; }
932 region_count[i] = calloc(2,
sizeof(
uint16_t));
933 region_count[i][0] = 0;
934 region_count[i][1] = i;
942 region_count[region_index][0]++;
952 roi[0] = (region_count[i][1] % root_regions) * (img->
w / root_regions);
953 roi[1] = (region_count[i][1] / root_regions) * (img->
h / root_regions);
954 roi[2] = roi[0] + (img->
w / root_regions);
955 roi[3] = roi[1] + (img->
h / root_regions);
965 for (
uint16_t j = 0; j < new_count; j++) {
992 free(region_count[i]);
1011 static uint8_t current_frame_nr = 0;
1013 static uint8_t previous_frame_offset[2] = {1, 1};
1017 displacement.
x = calloc(img->
w,
sizeof(
int32_t));
1018 displacement.
y = calloc(img->
h,
sizeof(
int32_t));
1024 edge_hist[i].
x = calloc(img->
w,
sizeof(
int32_t));
1025 edge_hist[i].
y = calloc(img->
h,
sizeof(
int32_t));
1049 int32_t *edge_hist_x = edge_hist[current_frame_nr].
x;
1050 int32_t *edge_hist_y = edge_hist[current_frame_nr].
y;
1064 int32_t *prev_edge_histogram_x = edge_hist[previous_frame_nr[0]].
x;
1065 int32_t *prev_edge_histogram_y = edge_hist[previous_frame_nr[1]].
y;
1071 der_shift_x = (
int16_t)((edge_hist[current_frame_nr].eulers.phi - edge_hist[previous_frame_nr[0]].
eulers.
phi) *
1073 der_shift_y = (
int16_t)((edge_hist[current_frame_nr].eulers.theta - edge_hist[previous_frame_nr[1]].
eulers.
theta) *
1079 displacement.
x, img->
w,
1080 window_size, disp_range, der_shift_x);
1082 displacement.
y, img->
h,
1083 window_size, disp_range, der_shift_y);
1089 window_size + disp_range,
RES);
1092 window_size + disp_range,
RES);
1128 float time_diff_x = (
float)(
timeval_diff(&edge_hist[previous_frame_nr[0]].frame_time, &img->
ts)) / 1000.;
1129 float time_diff_y = (float)(
timeval_diff(&edge_hist[previous_frame_nr[1]].frame_time, &img->
ts)) / 1000.;
1130 fps_x = 1 / (time_diff_x);
1131 fps_y = 1 / (time_diff_y);
1133 result->
fps = fps_x;
1154 current_frame_nr = (current_frame_nr + 1) %
MAX_HORIZON;
1156 free(displacement.
x);
1157 free(displacement.
y);
1172 bool flow_successful =
false;
1175 static int8_t switch_counter[2] = {-1, -1};
1198 return flow_successful;
1210 msec = (finishtime->tv_sec - starttime->tv_sec) * 1000;
1211 msec += (finishtime->tv_usec - starttime->tv_usec) / 1000;
1241 return pa[0] - pb[0];
static uint32_t timeval_diff(struct timeval *starttime, struct timeval *finishtime)
Calculate the difference from start till finish.
#define OPTICFLOW_FAST9_PADDING
int16_t flow_x
Flow in x direction from the camera (in subpixels) with X positive to the right.
#define OPTICFLOW_ACTFAST_GRADIENT_METHOD_CAMERA2
static void manage_flow_features(struct image_t *img, struct opticflow_t *opticflow, struct opticflow_result_t *result)
#define OPTICFLOW_BODY_TO_CAM_PSI
#define float_rmat_of_eulers
void image_create(struct image_t *img, uint16_t width, uint16_t height, enum image_type type)
Create a new image.
bool feature_management
Decides whether to keep track corners in memory for the next frame instead of re-detecting every time...
#define OPTICFLOW_CORNER_METHOD_CAMERA2
#define OPTICFLOW_MAX_TRACK_CORNERS
#define OPTICFLOW_FAST9_NUM_REGIONS_CAMERA2
void draw_edgeflow_img(struct image_t *img, struct edge_flow_t edgeflow, int32_t *edge_hist_x_prev, int32_t *edge_hist_x)
Draws edgehistogram, displacement and linefit directly on the image for debugging (only for edgeflow ...
void image_switch(struct image_t *a, struct image_t *b)
This will switch image *a and *b This is faster as image_copy because it doesn't copy the whole image...
#define OPTICFLOW_DEROTATION
void image_show_flow_color(struct image_t *img, struct flow_t *vectors, uint16_t points_cnt, uint8_t subpixel_factor, const uint8_t *color, const uint8_t *bad_color)
Shows the flow from a specific point to a new point This works on YUV422 and Grayscale images.
struct point_t * fast9_ret_corners
Corners.
uint8_t max_iterations
The maximum amount of iterations the Lucas Kanade algorithm should do.
#define OPTICFLOW_MAX_ITERATIONS
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)
void calculate_edge_histogram(struct image_t *img, int32_t edge_histogram[], char direction, uint16_t edge_threshold)
Calculate a edge/gradient histogram for each dimension of the image.
#define FAST9_LOW_THRESHOLD
uint16_t count
Number of times the point has been tracked successfully.
uint8_t fast9_num_regions
The number of regions of interest the image is split into.
uint32_t getAmountPeaks(int32_t *edgehist, int32_t thres, int32_t size)
getAmountPeaks, calculates the amount of peaks in a edge histogram
float derotation_correction_factor_y
Correction factor for derotation in Y axis, determined from a fit from the gyros and flow rotation....
uint16_t tracked_cnt
The amount of tracked corners.
#define OPTICFLOW_FAST9_ADAPTIVE_CAMERA2
uint16_t fast9_rsize
Amount of corners allocated.
int16_t flow_y
Flow in y direction from the camera (in subpixels) with Y positive to the bottom.
uint16_t fast9_min_distance
Minimum distance in pixels between corners.
float divergence
Divergence as determined with a linear flow fit.
float surface_roughness
Surface roughness as determined with a linear optical flow fit.
#define OPTICFLOW_SEARCH_DISTANCE_CAMERA2
#define FLOAT_EULERS_ZERO(_e)
#define OPTICFLOW_FAST9_ADAPTIVE
struct image_t img_gray
Current gray image frame.
struct point_t pos
The original position the flow comes from in subpixels.
uint16_t max_track_corners
Maximum amount of corners Lucas Kanade should track.
bool opticflow_calc_frame(struct opticflow_t *opticflow, struct image_t *img, struct opticflow_result_t *result)
Run the optical flow on a new image frame.
#define OPTICFLOW_ACTFAST_MIN_GRADIENT_CAMERA2
#define OPTICFLOW_FEATURE_MANAGEMENT
#define OPTICFLOW_DEROTATION_CORRECTION_FACTOR_X_CAMERA2
#define OPTICFLOW_ACTFAST_LONG_STEP_CAMERA2
static int cmp_flow(const void *a, const void *b)
Compare two flow vectors based on flow distance Used for sorting.
#define OPTICFLOW_FAST9_THRESHOLD
float agl_dist_value_filtered
#define OPTICFLOW_SUBPIXEL_FACTOR
Functions for undistorting camera images.
#define OPTICFLOW_METHOD_CAMERA2
@ IMAGE_GRAYSCALE
Grayscale image with only the Y part (uint8 per pixel)
uint16_t window_size
Window size for the blockmatching algorithm (general value for all methods)
bool derotation
Derotation switched on or off (depended on the quality of the gyroscope measurement)
#define OPTICFLOW_MEDIAN_FILTER_CAMERA2
char * dev_name
path to device
struct image_t prev_img_gray
Previous gray image frame.
#define OPTICFLOW_ACTFAST_SHORT_STEP_CAMERA2
uint16_t fast9_padding
Padding used in FAST9 detector.
#define OPTICFLOW_BODY_TO_CAM_PHI_CAMERA2
float actfast_short_step
Step size to take when there is an edge to be followed.
void image_to_grayscale(struct image_t *input, struct image_t *output)
Convert an image to grayscale.
#define OPTICFLOW_ACTFAST_GRADIENT_METHOD
#define OPTICFLOW_MAX_TRACK_CORNERS_CAMERA2
#define OPTICFLOW_FAST9_THRESHOLD_CAMERA2
#define OPTICFLOW_FEATURE_MANAGEMENT_CAMERA2
void float_rmat_transp_vmult(struct FloatVect3 *vb, struct FloatRMat *m_b2a, struct FloatVect3 *va)
rotate 3D vector by transposed rotation matrix.
struct FloatVect3 vel_cam
The velocity in camera frame (m/s)
float derotation_correction_factor_x
Correction factor for derotation in x axis, determined from a fit from the gyros and flow rotation....
uint8_t corner_method
Method to use for determining where the corners are.
Calculate divergence from flow vectors by looking at line sizes beteween the points.
bool fast9_region_detect
Decides whether to detect fast9 corners in specific regions of interest or the whole image (only for ...
int actfast_gradient_method
Whether to use a simple or Sobel filter.
#define OPTICFLOW_MEDIAN_FILTER
#define OPTICFLOW_TRACK_BACK_CAMERA2
#define OPTICFLOW_PYRAMID_LEVEL
uint8_t pyramid_level
Number of pyramid levels used in Lucas Kanade algorithm (0 == no pyramids used)
uint16_t y_sub
The y subpixel coordinate of the point.
#define OPTICFLOW_BODY_TO_CAM_PHI
float Dhane_k
(un)distortion parameter for a fish-eye lens
#define OPTICFLOW_WINDOW_SIZE_CAMERA2
#define OPTICFLOW_DEROTATION_CAMERA2
#define OPTICFLOW_THRESHOLD_VEC
#define OPTICFLOW_ACTFAST_LONG_STEP
uint16_t subpixel_factor
The amount of subpixels per pixel.
#define OPTICFLOW_FAST9_NUM_REGIONS
#define OPTICFLOW_DEROTATION_CORRECTION_FACTOR_Y_CAMERA2
bool got_first_img
If we got a image to work with.
Calculate velocity from optic flow.
#define OPTICFLOW_SEARCH_DISTANCE
struct FloatVect3 vel_body
The velocity in body frame (m/s) with X positive to the front of the aircraft, Y positive to the righ...
#define OPTICFLOW_SHOW_FLOW
bool median_filter
Decides to use a median filter on the velocity.
void act_fast(struct image_t *img, uint8_t fast_threshold, uint16_t *num_corners, struct point_t **ret_corners, uint16_t n_agents, uint16_t n_time_steps, float long_step, float short_step, int min_gradient, int gradient_method, int camera_id)
Do an ACT-FAST corner detection.
bool fast9_adaptive
Whether the FAST9 threshold should be adaptive.
void image_copy(struct image_t *input, struct image_t *output)
Copy an image from inut to output This will only work if the formats are the same.
#define OPTICFLOW_SHOW_FLOW_CAMERA2
#define OPTICFLOW_DEROTATION_CORRECTION_FACTOR_X
#define OPTICFLOW_TRACK_BACK
uint8_t fast9_threshold
FAST9 corner detection threshold.
float actfast_long_step
Step size to take when there is no texture.
#define FAST9_MAX_CORNERS
#define FAST9_HIGH_THRESHOLD
float fps
Frames per second of the optical flow calculation.
#define OPTICFLOW_FAST9_REGION_DETECT
uint8_t camera_id
Camera id as passed to cv_add_to_device.
calculate optical flow with EdgeFlow
bool normalized_coords_to_distorted_pixels(float x_n, float y_n, float *x_pd, float *y_pd, float k, const float *K)
Transform normalized coordinates to distorted pixel coordinates.
#define OPTICFLOW_DEROTATION_CORRECTION_FACTOR_Y
float focal_y
focal length in the y-direction in pixels
uint16_t f
Camera baseline, in meters (i.e. horizontal distance between the two cameras of the stereo setup)
bool track_back
Whether to track flow vectors back to the previous image, in order to check if the back-tracked flow ...
float noise_measurement
noise of measurement, for state filter
Finds corners in an image by actively scanning the image. This method is inspired by the work in: de ...
uint32_t x
The x coordinate of the point.
#define OPTICFLOW_BODY_TO_CAM_THETA
#define OPTICFLOW_ACTFAST_MIN_GRADIENT
void fast9_detect(struct image_t *img, uint8_t threshold, uint16_t min_dist, uint16_t x_padding, uint16_t y_padding, uint16_t *num_corners, uint16_t *ret_corners_length, struct point_t **ret_corners, uint16_t *roi)
Do a FAST9 corner detection.
static int cmp_array(const void *a, const void *b)
Compare the rows of an integer (uint16_t) 2D array based on the first column.
efficient fixed-point optical-flow calculation
void calculate_edge_displacement(int32_t *edge_histogram, int32_t *edge_histogram_prev, int32_t *displacement, uint16_t size, uint8_t window, uint8_t disp_range, int32_t der_shift)
Calculate_displacement calculates the displacement between two histograms.
#define OPTICFLOW_FAST9_MIN_DISTANCE_CAMERA2
#define OPTICFLOW_RESOLUTION_FACTOR
#define OPTICFLOW_RESOLUTION_FACTOR_CAMERA2
struct camera_intrinsics_t camera_intrinsics
Intrinsics of the camera; camera calibration parameters and distortion parameter(s)
float get_size_divergence(struct flow_t *vectors, int count, int n_samples)
Get divergence from optical flow vectors based on line sizes between corners.
#define OPTICFLOW_ACTFAST_SHORT_STEP
#define OPTICFLOW_BODY_TO_CAM_PSI_CAMERA2
#define OPTICFLOW_CORNER_METHOD
uint32_t y
The y coordinate of the point.
bool just_switched_method
Boolean to check if methods has been switched (for reinitialization)
bool analyze_linear_flow_field(struct flow_t *vectors, int count, float error_threshold, int n_iterations, int n_samples, int im_width, int im_height, struct linear_flow_fit_info *info)
Analyze a linear flow field, retrieving information such as divergence, surface roughness,...
static struct flow_t * predict_flow_vectors(struct flow_t *flow_vectors, uint16_t n_points, float phi_diff, float theta_diff, float psi_diff, struct opticflow_t *opticflow)
float divergence
Basically, relative_velocity_z. Actual divergence of a 2D flow field is 2 * relative_velocity_z.
uint16_t x_sub
The x subpixel coordinate of the point.
int16_t flow_der_y
The derotated flow calculation in the y direction (in subpixels)
float div_size
Divergence as determined with the size_divergence script.
#define OPTICFLOW_WINDOW_SIZE
void line_fit(int32_t *displacement, int32_t *divergence, int32_t *flow, uint32_t size, uint32_t border, uint16_t RES)
Fits a linear model to an array with pixel displacements with least squares.
#define OPTICFLOW_BODY_TO_CAM_THETA_CAMERA2
int actfast_min_gradient
Threshold that decides when there is sufficient texture for edge following.
#define OPTICFLOW_SUBPIXEL_FACTOR_CAMERA2
struct timeval frame_time
#define OPTICFLOW_THRESHOLD_VEC_CAMERA2
float center_y
center image coordinate in the y-direction
float surface_roughness
The error of the linear fit is a measure of surface roughness.
int32_t flow_x
The x direction flow in subpixels.
#define OPTICFLOW_FAST9_PADDING_CAMERA2
uint16_t resolution_factor
The resolution in EdgeFlow to determine the Divergence.
bool calc_fast9_lukas_kanade(struct opticflow_t *opticflow, struct image_t *img, struct opticflow_result_t *result)
Run the optical flow with fast9 and lukaskanade on a new image frame.
struct opticflow_t opticflow[ACTIVE_CAMERAS]
Opticflow calculations.
#define OPTICFLOW_PYRAMID_LEVEL_CAMERA2
int16_t flow_der_x
The derotated flow calculation in the x direction (in subpixels)
struct timeval ts
The timestamp of creation.
struct FloatEulers eulers
#define OPTICFLOW_FAST9_MIN_DISTANCE
uint8_t method
Method to use to calculate the optical flow.
uint16_t corner_cnt
The amount of coners found by FAST9.
uint8_t threshold_vec
The threshold in x, y subpixels which the algorithm should stop.
bool distorted_pixels_to_normalized_coords(float x_pd, float y_pd, float *x_n, float *y_n, float k, const float *K)
Transform distorted pixel coordinates to normalized coordinates.
#define VECT3_ASSIGN(_a, _x, _y, _z)
bool calc_edgeflow_tot(struct opticflow_t *opticflow, struct image_t *img, struct opticflow_result_t *result)
Run the optical flow with EDGEFLOW on a new image frame.
bool show_flow
Whether to draw the flow vectors on the image. Watch out! This changes the image as will be received ...
struct MedianFilter3Float vel_filt
const struct video_config_t * camera
#define OPTICFLOW_MAX_ITERATIONS_CAMERA2
uint16_t search_distance
Search distance for blockmatching alg.
float center_x
center image coordinate in the x-direction
float focal_x
focal length in the x-direction in pixels
struct FloatRMat body_to_cam[2]
uint32_t error
The matching error in the tracking process in subpixels.
int32_t flow_y
The y direction flow in subpixels.
void image_show_points(struct image_t *img, struct point_t *points, uint16_t points_cnt)
Show points in an image by coloring them through giving the pixels the maximum value.
void opticflow_calc_init(struct opticflow_t opticflow[])
Initialize the opticflow calculator.
struct FloatEulers eulers
Euler Angles at time of image.
void calc_previous_frame_nr(struct opticflow_result_t *result, struct opticflow_t *opticflow, uint8_t current_frame_nr, uint8_t *previous_frame_offset, uint8_t *previous_frame_nr)
Calc_previous_frame_nr; adaptive Time Horizon.
#define OPTICFLOW_FAST9_REGION_DETECT_CAMERA2