Paparazzi UAS
v5.18.0_stable
Paparazzi is a free software Unmanned Aircraft System.
|
Go to the source code of this file.
Macros | |
#define | CACHE_LINE_LENGTH 64 |
Functions | |
void | image_create (struct image_t *img, uint16_t width, uint16_t height, enum image_type type) |
Create a new image. More... | |
void | image_free (struct image_t *img) |
Free the image. More... | |
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. More... | |
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 buffer. More... | |
void | image_to_grayscale (struct image_t *input, struct image_t *output) |
Convert an image to grayscale. More... | |
uint16_t | image_yuv422_colorfilt (struct image_t *input, struct image_t *output, uint8_t y_m, uint8_t y_M, uint8_t u_m, uint8_t u_M, uint8_t v_m, uint8_t v_M) |
Filter colors in an YUV422 image. More... | |
int | check_color_yuv422 (struct image_t *im, int x, int y, uint8_t y_m, uint8_t y_M, uint8_t u_m, uint8_t u_M, uint8_t v_m, uint8_t v_M) |
Checks the color of a single pixel in a YUV422 image. More... | |
void | set_color_yuv422 (struct image_t *im, int x, int y, uint8_t Y, uint8_t U, uint8_t V) |
Sets Y,U,V for a single pixel. More... | |
void | image_yuv422_downsample (struct image_t *input, struct image_t *output, uint8_t downsample) |
Simplified high-speed low CPU downsample function without averaging downsample factor must be 1, 2, 4, 8 ... More... | |
void | image_add_border (struct image_t *input, struct image_t *output, uint8_t border_size) |
This function adds padding to input image by mirroring the edge image elements. More... | |
void | pyramid_next_level (struct image_t *input, struct image_t *output, uint8_t border_size) |
This function takes previous padded pyramid level and outputs next level of pyramid without padding. More... | |
void | pyramid_build (struct image_t *input, struct image_t *output_array, uint8_t pyr_level, uint16_t border_size) |
This function populates given array of image_t structs with wanted number of padded pyramids based on given input. More... | |
void | image_subpixel_window (struct image_t *input, struct image_t *output, struct point_t *center, uint32_t subpixel_factor, uint8_t border_size) |
This outputs a subpixel window image in grayscale Currently only works with Grayscale images as input but could be upgraded to also support YUV422 images. More... | |
void | image_gradients (struct image_t *input, struct image_t *dx, struct image_t *dy) |
Calculate the gradients using the following matrix: [0 -1 0; -1 0 1; 0 1 0]. More... | |
void | image_calculate_g (struct image_t *dx, struct image_t *dy, int32_t *g) |
Calculate the G vector of an image gradient This is used for optical flow calculation. More... | |
uint32_t | image_difference (struct image_t *img_a, struct image_t *img_b, struct image_t *diff) |
Calculate the difference between two images and return the error This will only work with grayscale images. More... | |
int32_t | image_multiply (struct image_t *img_a, struct image_t *img_b, struct image_t *mult) |
Calculate the multiplication between two images and return the error This will only work with image gradients. More... | |
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. More... | |
void | image_show_points_color (struct image_t *img, struct point_t *points, uint16_t points_cnt, uint8_t *color) |
Show points in an image by coloring them through giving the pixels the maximum value. More... | |
void | image_show_flow (struct image_t *img, struct flow_t *vectors, uint16_t points_cnt, uint8_t subpixel_factor) |
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. More... | |
void | image_gradient_pixel (struct image_t *img, struct point_t *loc, int method, int *dx, int *dy) |
Get the gradient at a pixel location. More... | |
void | image_draw_rectangle (struct image_t *img, int x_min, int x_max, int y_min, int y_max, uint8_t *color) |
Draw a rectangle on the image. More... | |
void | image_draw_crosshair (struct image_t *img, struct point_t *loc, const uint8_t *color, uint32_t size_crosshair) |
Draw a cross-hair on the image. More... | |
void | image_draw_line (struct image_t *img, struct point_t *from, struct point_t *to) |
Draw a pink line on the image. More... | |
void | image_draw_line_color (struct image_t *img, struct point_t *from, struct point_t *to, const uint8_t *color) |
Draw a line on the image. More... | |
Image helper functions, like resizing, color filter, converters...
Definition in file image.c.
int check_color_yuv422 | ( | struct image_t * | im, |
int | x, | ||
int | y, | ||
uint8_t | y_m, | ||
uint8_t | y_M, | ||
uint8_t | u_m, | ||
uint8_t | u_M, | ||
uint8_t | v_m, | ||
uint8_t | v_M | ||
) |
Checks the color of a single pixel in a YUV422 image.
1 means that it passes the filter, 0 that it does not.
[in] | im | The input image to filter |
[in] | x | The x-coordinate of the pixel |
[in] | y | The y-coordinate of the pixel |
[in] | y_m | The Y minimum value |
[in] | y_M | The Y maximum value |
[in] | u_m | The U minimum value |
[in] | u_M | The U maximum value |
[in] | v_m | The V minimum value |
[in] | v_M | The V maximum value |
Definition at line 230 of file image.c.
References image_t::buf, image_t::h, and image_t::w.
Referenced by check_color_snake_gate_detection().
This function adds padding to input image by mirroring the edge image elements.
[in] | *input | - input image (grayscale only) |
[out] | *output | - the output image |
[in] | border_size | - amount of padding around image. Padding is made by reflecting image elements at the edge Example: f e d c b a | a b c d e f | f e d c b a |
Definition at line 361 of file image.c.
References image_t::buf, image_t::h, image_create(), image_t::type, and image_t::w.
Referenced by pyramid_build().
Calculate the G vector of an image gradient This is used for optical flow calculation.
[in] | *dx | The gradient in the X direction |
[in] | *dy | The gradient in the Y direction |
[out] | *g | The G[4] vector devided by 255 to keep in range |
Definition at line 562 of file image.c.
References image_t::buf, image_t::h, and image_t::w.
Referenced by opticFlowLK(), and opticFlowLK_flat().
Copy an image from inut to output This will only work if the formats are the same.
[in] | *input | The input image to copy from |
[out] | *output | The out image to copy to |
Definition at line 89 of file image.c.
References image_t::buf, image_t::buf_size, image_t::eulers, image_t::h, image_t::pprz_ts, image_t::ts, image_t::type, and image_t::w.
Referenced by calc_fast9_lukas_kanade(), cv_async_function(), and undistort_image_func().
void image_create | ( | struct image_t * | img, |
uint16_t | width, | ||
uint16_t | height, | ||
enum image_type | type | ||
) |
Create a new image.
[out] | *img | The output image |
[in] | width | The width of the image |
[in] | height | The height of the image |
[in] | type | The type of image (YUV422 or grayscale) |
Definition at line 43 of file image.c.
References image_t::buf, image_t::buf_size, CACHE_LINE_LENGTH, image_t::h, IMAGE_GRADIENT, IMAGE_INT16, IMAGE_JPEG, IMAGE_YUV422, type(), image_t::type, and image_t::w.
Referenced by calc_fast9_lukas_kanade(), cv_async_function(), cv_blob_locator_func(), cv_window_func(), detect_window(), image_add_border(), log_image(), opticFlowLK(), opticFlowLK_flat(), pano_unwrap_init(), pyramid_next_level(), qrscan(), set_output_image_size(), undistort_image_func(), video_capture_save(), video_thread_function(), and viewvideo_function().
Calculate the difference between two images and return the error This will only work with grayscale images.
[in] | *img_a | The image to substract from |
[in] | *img_b | The image to substract from img_a |
[out] | *diff | The image difference (if not needed can be NULL) |
Definition at line 594 of file image.c.
References image_t::buf, image_t::h, and image_t::w.
Referenced by opticFlowLK(), and opticFlowLK_flat().
void image_draw_crosshair | ( | struct image_t * | img, |
struct point_t * | loc, | ||
const uint8_t * | color, | ||
uint32_t | size_crosshair | ||
) |
Draw a cross-hair on the image.
[in,out] | *img | The image to show the line on |
[in] | loc | The location of the cross-hair |
[in] | color | The line color as a [U, Y1, V, Y2] uint8_t array, or a uint8_t value pointer for grayscale images. Example colors: white = {127, 255, 127, 255}, green = {0, 127, 0, 127}; |
[in] | size_crosshair | Actually the half size of the cross hair |
Definition at line 880 of file image.c.
References image_t::h, image_draw_line_color(), image_t::w, point_t::x, and point_t::y.
Referenced by draw_gate_color_polygon(), draw_gate_color_square(), image_show_flow_color(), image_show_points_color(), and snake_gate_detection().
Draw a pink line on the image.
[in,out] | *img | The image to show the line on |
[in] | *from | The point to draw from |
[in] | *to | The point to draw to |
Definition at line 906 of file image.c.
References image_draw_line_color().
Referenced by draw_edgeflow_img(), and qrscan().
void image_draw_line_color | ( | struct image_t * | img, |
struct point_t * | from, | ||
struct point_t * | to, | ||
const uint8_t * | color | ||
) |
Draw a line on the image.
[in,out] | *img | The image to show the line on |
[in] | *from | The point to draw from |
[in] | *to | The point to draw to |
[in] | *color | The line color as a [U, Y1, V, Y2] uint8_t array, or a uint8_t value pointer for grayscale images. Example colors: white = {127, 255, 127, 255}, green = {0, 127, 0, 127}; |
Definition at line 921 of file image.c.
References image_t::buf, image_t::h, IMAGE_YUV422, image_t::type, image_t::w, point_t::x, and point_t::y.
Referenced by draw_gate_color_polygon(), draw_gate_color_square(), image_draw_crosshair(), image_draw_line(), image_draw_rectangle(), and image_show_flow_color().
void image_draw_rectangle | ( | struct image_t * | img, |
int | x_min, | ||
int | x_max, | ||
int | y_min, | ||
int | y_max, | ||
uint8_t * | color | ||
) |
Draw a rectangle on the image.
[in,out] | *img | The image to show the line on |
[in] | x_min | start in x |
[in] | x_max | end of x |
[in] | y_min | start in y |
[in] | y_max | end of y |
[in] | color | in [U, Y, V, Y] format |
Definition at line 838 of file image.c.
References image_draw_line_color(), point_t::x, and point_t::y.
void image_free | ( | struct image_t * | img | ) |
Free the image.
[in] | *img | The image to free |
Definition at line 75 of file image.c.
References image_t::buf.
Referenced by cv_async_function(), cv_blob_locator_func(), cv_window_func(), detect_window(), opticFlowLK(), opticFlowLK_flat(), pyramid_build(), set_output_image_size(), undistort_image_func(), video_capture_save(), video_thread_function(), and viewvideo_function().
void image_gradient_pixel | ( | struct image_t * | img, |
struct point_t * | loc, | ||
int | method, | ||
int * | dx, | ||
int * | dy | ||
) |
Get the gradient at a pixel location.
[in,out] | *img | The image |
[in] | loc | The location at which to get the gradient |
[in] | method | 0 = {-1, 0, 1}, 1 = Sobel {-1, 0, 1; -2, 0, 2; -1, 0, 1} |
[in] | dx | The gradient in x-direction |
[in] | dy | The gradient in y-direction |
Definition at line 766 of file image.c.
References image_t::buf, image_t::h, IMAGE_YUV422, image_t::type, image_t::w, point_t::x, and point_t::y.
Referenced by act_fast().
Calculate the gradients using the following matrix: [0 -1 0; -1 0 1; 0 1 0].
[in] | *input | Input grayscale image |
[out] | *dx | Output gradient in the X direction (dx->w = input->w-2, dx->h = input->h-2) |
[out] | *dy | Output gradient in the Y direction (dx->w = input->w-2, dx->h = input->h-2) |
Definition at line 538 of file image.c.
References image_t::buf, image_t::h, and image_t::w.
Referenced by opticFlowLK(), and opticFlowLK_flat().
Calculate the multiplication between two images and return the error This will only work with image gradients.
[in] | *img_a | The image to multiply |
[in] | *img_b | The image to multiply with |
[out] | *mult | The image multiplication (if not needed can be NULL) |
Definition at line 632 of file image.c.
References image_t::buf, image_t::h, and image_t::w.
Referenced by opticFlowLK(), and opticFlowLK_flat().
void image_show_flow | ( | struct image_t * | img, |
struct flow_t * | vectors, | ||
uint16_t | points_cnt, | ||
uint8_t | subpixel_factor | ||
) |
Definition at line 715 of file image.c.
References image_show_flow_color().
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.
[in,out] | *img | The image to show the flow on |
[in] | *vectors | The flow vectors to show |
[in] | *points_cnt | The amount of points and vectors to show |
[in] | subpixel_factor | |
[in] | color | color for good vectors |
[in] | bad_color | color for bad vectors |
Definition at line 732 of file image.c.
References flow_t::flow_x, flow_t::flow_y, image_draw_crosshair(), image_draw_line_color(), LARGE_FLOW_ERROR, flow_t::pos, point_t::x, and point_t::y.
Referenced by calc_fast9_lukas_kanade(), and image_show_flow().
Show points in an image by coloring them through giving the pixels the maximum value.
This works with YUV422 and grayscale images
[in,out] | *img | The image to place the points on |
[in] | *points | The points to sohw |
[in] | *points_cnt | The amount of points to show |
Definition at line 668 of file image.c.
References image_show_points_color().
Referenced by calc_fast9_lukas_kanade().
void image_show_points_color | ( | struct image_t * | img, |
struct point_t * | points, | ||
uint16_t | points_cnt, | ||
uint8_t * | color | ||
) |
Show points in an image by coloring them through giving the pixels the maximum value.
This works with YUV422 and grayscale images
[in,out] | *img | The image to place the points on |
[in] | *points | The points to show |
[in] | *points_cnt | The amount of points to show |
[in] | *color | The color of the points as a [U, Y1, V, Y2] uint8_t array, or a uint8_t value pointer for grayscale images. Example colors: white = {127, 255, 127, 255}, green = {0, 127, 0, 127}; |
Definition at line 690 of file image.c.
References image_t::buf, idx, image_draw_crosshair(), IMAGE_YUV422, image_t::type, image_t::w, point_t::x, and point_t::y.
Referenced by image_show_points().
void image_subpixel_window | ( | struct image_t * | input, |
struct image_t * | output, | ||
struct point_t * | center, | ||
uint32_t | subpixel_factor, | ||
uint8_t | border_size | ||
) |
This outputs a subpixel window image in grayscale Currently only works with Grayscale images as input but could be upgraded to also support YUV422 images.
You can and should only ask a subpixel window of a center point that is w/2 pixels away from the edges
[in] | *input | Input image (grayscale only) |
[out] | *output | Window output (width and height is used to calculate the window size) |
[in] | *center | Center point in subpixel coordinates |
[in] | subpixel_factor | The subpixel factor per pixel |
[in] | border_size | - amount of padding around image. Padding is made by reflecting image elements at the edge Example: f e d c b a | a b c d e f | f e d c b a |
Definition at line 480 of file image.c.
References image_t::buf, image_t::h, image_t::w, point_t::x, and point_t::y.
Referenced by opticFlowLK(), and opticFlowLK_flat().
This will switch image *a and *b This is faster as image_copy because it doesn't copy the whole image buffer.
[in,out] | *a | The image to switch |
[in,out] | *b | The image to switch with |
Definition at line 112 of file image.c.
References b.
Referenced by calc_fast9_lukas_kanade().
Convert an image to grayscale.
Depending on the output type the U/V bytes are removed
[in] | *input | The input image (Needs to be YUV422) |
[out] | *output | The output image |
Definition at line 131 of file image.c.
References image_t::buf, dest, image_t::eulers, image_t::h, IMAGE_YUV422, image_t::pprz_ts, image_t::ts, image_t::type, and image_t::w.
Referenced by calc_fast9_lukas_kanade(), cv_window_func(), and detect_window().
uint16_t image_yuv422_colorfilt | ( | struct image_t * | input, |
struct image_t * | output, | ||
uint8_t | y_m, | ||
uint8_t | y_M, | ||
uint8_t | u_m, | ||
uint8_t | u_M, | ||
uint8_t | v_m, | ||
uint8_t | v_M | ||
) |
Filter colors in an YUV422 image.
[in] | *input | The input image to filter |
[out] | *output | The filtered output image |
[in] | y_m | The Y minimum value |
[in] | y_M | The Y maximum value |
[in] | u_m | The U minimum value |
[in] | u_M | The U maximum value |
[in] | v_m | The V minimum value |
[in] | v_M | The V maximum value |
Definition at line 166 of file image.c.
References image_t::buf, dest, image_t::h, image_t::ts, and image_t::w.
Referenced by colorfilter_func(), detect_gate_func(), and snake_gate_detection().
void image_yuv422_downsample | ( | struct image_t * | input, |
struct image_t * | output, | ||
uint8_t | downsample | ||
) |
Simplified high-speed low CPU downsample function without averaging downsample factor must be 1, 2, 4, 8 ...
2^X image of type UYVY expected. Only one color UV per 2 pixels
we keep the UV color of the first pixel pair and sample the intensity evenly 1-3-5-7-... or 1-5-9-...
input: u1y1 v1y2 u3y3 v3y4 u5y5 v5y6 u7y7 v7y8 ... downsample=1 u1y1 v1y2 u3y3 v3y4 u5y5 v5y6 u7y7 v7y8 ... downsample=2 u1y1v1 (skip2) y3 (skip2) u5y5v5 (skip2) y7 (skip2) ... downsample=4 u1y1v1 (skip6) y5 (skip6) ...
[in] | *input | The input YUV422 image |
[out] | *output | The downscaled YUV422 image |
[in] | downsample | The downsample factor (must be downsample=2^X) |
Definition at line 311 of file image.c.
References image_t::buf, dest, image_t::h, image_t::ts, image_t::type, and image_t::w.
Referenced by viewvideo_function().
void pyramid_build | ( | struct image_t * | input, |
struct image_t * | output_array, | ||
uint8_t | pyr_level, | ||
uint16_t | border_size | ||
) |
This function populates given array of image_t structs with wanted number of padded pyramids based on given input.
[in] | *input | - input image (grayscale only) |
[out] | *output | - array of image_t structs containing image pyiramid levels. Level zero contains original image, followed by pyr_level of pyramid. |
[in] | pyr_level | - number of pyramids to be built. If 0, original image is padded and outputed. |
[in] | border_size | - amount of padding around image. Padding is made by reflecting image elements at the edge Example: f e d c b a | a b c d e f | f e d c b a |
Definition at line 453 of file image.c.
References image_add_border(), image_free(), and pyramid_next_level().
Referenced by opticFlowLK().
This function takes previous padded pyramid level and outputs next level of pyramid without padding.
For calculating new pixel value 5x5 filter matrix suggested by Bouguet is used: [1/16 1/8 3/4 1/8 1/16]' x [1/16 1/8 3/4 1/8 1/16] To avoid decimal numbers, all coefficients are multiplied by 10000.
[in] | *input | - input image (grayscale only) |
[out] | *output | - the output image |
[in] | border_size | - amount of padding around image. Padding is made by reflecting image elements at the edge Example: f e d c b a | a b c d e f | f e d c b a |
Definition at line 406 of file image.c.
References image_t::buf, image_t::h, image_create(), image_t::type, and image_t::w.
Referenced by pyramid_build().
Sets Y,U,V for a single pixel.
[in] | im | The input image to filter |
[in] | x | The x-coordinate of the pixel |
[in] | y | The y-coordinate of the pixel |
[in] | Y | The Y-value. |
[in] | U | The U-value. |
[in] | V | The V value |
Definition at line 272 of file image.c.
References image_t::buf, image_t::h, image_t::w, and mesonh.mesonh_atmosphere::Y.