Sample Application API - DigitalMediaProfessionals/dv-sdk GitHub Wiki
Here describes common API among the sample applications. This API enables us to implement an DNN application for an AI FPGA module. The concrete features of the API is as below.
- Load images for DNN input from a file or a camera
- Preprocessing images for DNN
- Drawing and outputing a result from DNN to a monitor.
The API can be used for not only DNN but also other purposes.
These APIs are declared in common/include/util_draw.h.
The below is an example of monitor output.
```c++
#include <iostream>
#include <cstdlib>
#include "util_draw.h"
using namespace std;
using namespace dmp;
using namespace util;
int main()
{
// 1st: Initialize framebuffer
if (!init_fb()) {
cerr << "Failed to init FrameBuffer" << endl;
return -1;
]
// 2nd: Create a COverlayRGB instance and allocate memory.
uint32_t width = get_screen_width();
uint32_t height = get_screen_height();
uint32_t image_w = 256;
uint32_t image_h = 256
COverlayRGB overlay(width, height);
overlay.alloc_mem_overlay(image_w, image_h);
// 3rd: Drawing to the memory
// Here the memory is filled with random pixels
for (uint32_t x = 0; x < image_w; x++) {
for (uint32_t y = 0; y < image_h; y++) {
bool s = overlay.set_pixel(x, y, rand(), rand(), rand());
if (!s) goto fin;
}
}
fin:
// 4th: draw the drawn to the framebuffer
uint32_t left_top_x = 10;
uint32_t left_top_y = 10;
overlay.print_to_display(left_top_x, left_top_y);
// 5th: Swap buffers (since framebuffer is double bufferred) and output the drawn to a monitor
swap_buffer();
// 6th: Finalization
shutdown();
}| Function | Description |
|---|---|
bool dmp::util::init_fb() |
Initializes framebuffer. |
void dmp::util::shutdown() |
Releases resources for framebuffer. |
bool dmp::util::swap_buffer() |
Swaps framebuffer which is double-bufferred. |
uint32_t dmp::util::get_screen_width() |
Returns a width of framebuffer in a unit of pixel. |
uint32_t dmp::util::get_screen_height() |
Returns a height of framebuffer in a unit of pixel. |
dmp::util::COverlayRGB class is responsible for drawing and monitor output.
To show something in a monitor, allocate a buffer for drawing by alloc_mem_overlay() method, draw it by each drawing method and output the drawn to a monitor by print_to_display() method. (After this, you have to call swap_buffer() function to switch framebuffer.)
The followings are a list of methods of COverlayRGB.
For more detail, see commnets in the source code.
| Method | Description |
|---|---|
COverlayRGB(uint32_t screen_width, uint32_t screen_height); |
This is a constructor. Please specify the screen size. |
void alloc_mem_overlay(uint32_t overlay_width, uint32_t overlay_height); |
Allocates a overlay buffer. |
uint32_t get_overlay_width(); |
Returns a width of the overlay buffer. |
uint32_t get_overlay_height(); |
Returns a height of the overlay buffer. |
uint8_t* get_overlay_buf_ref(); |
Returns a pointer of the overlay buffer. |
bool convert_to_overlay_pixel_format(uint32_t *imgview, uint32_t size_of_imgview); |
Loads data from RGB image and write the data to the overlay buffer. |
rbuf_type& get_ren_buf_ref(); |
Returns a reference of the rendering buffer. |
uint8_t* get_overlay_row_ptr_ref(uint32_t row); |
Returns a pointer of specified row in the rendering buffer. |
bool set_pixel(uint32_t xpos, uint32_t ypos, uint8_t red, uint8_t green, uint8_t blue); |
Draws a pixel. |
bool copy_overlay(COverlayRGB &src_overlay, uint32_t xpos, uint32_t ypos); |
Copies the given overlay to the specified position. |
void set_box_with_text(int32_t x0pos, int32_t y0pos, int32_t x1pos, int32_t y1pos, uint32_t color, string text); |
Draws a box with a text. |
void set_text(int32_t xpos, int32_t ypos, string text, uint32_t text_size, uint32_t color, double stroke_size = 1.5); |
Draws a text. |
void set_text_with_font(string path_to_ttf, string text, double xpos, double ypos, uint32_t text_size, uint32_t color); |
Draws a text with the specified font. |
void set_line(int32_t x0pos, int32_t y0pos, int32_t x1pos, int32_t y1pos, uint32_t color); |
Draws a line without text. color is argb format. |
void blend_from(COverlayRGB &overlay, double alpha=0.5); |
Blends self with the given overlay. |
void blend_from(COverlayRGB &overlay, double alpha=0.5); |
Blends self with the given overlay. |
bool load_ppm_img(string filename_wo_ext); |
Loads and draws an image from the ppm file. |
bool save_as_ppm_img(string filename_wo_ext); |
Save the rendering buffer to the ppm file. |
void draw_progress_bar(int32_t xpos, int32_t ypos, uint32_t w, uint32_t h, uint32_t color, uint8_t prog_0_to_100); |
Draws a progress bar. |
void print_to_display(uint32_t xpos, uint32_t ypos); |
Outputs a overlay to a display. |
void delete_overlay(); |
Deletes a overlay. |
static void capture_screen(std::string filename, uint32_t screen_width, uint32_t screen_height); |
Captures the screen and save it to a file. |
void set_mouse_cursor(uint32_t m_color); |
Draws a mouse cursor. |
void set_background_to_color(uint32_t m_color); |
Fills background with the given color. |
API for INPUT is declared in common/include/util_input.h.
To use a camera, open a camera by open_cam() and load an image by capture_cam().
Please close the camera by close_cam() when it is no longer in use.
int dmp::util::open_cam(int capture_w, int capture_h, int fps);Opens a camera.
- Arguments
-
capture_wWidth of an image from a camera -
capture_hHeight of an image from a camera -
fpsFPS of a camera
-
- Returned value
- 0 on success, non-zero value otherwise
int dmp::util::close_cam();Closes a camera.
int dmp::util::capture_cam(uint32_t* vImg, int capture_w, int capture_h,
int crop_xoffs, int crop_yoffs, int crop_w, int crop_h);Loads an image from a camera.
- Arguments
-
vImgBuffer for an image -
capture_wHeight of an image from a camera -
capture_hWidth of an image from a camera -
crop_xoffsx offset for cropping -
crop_yoffsy offset for cropping -
crop_wwidth of cropping -
crop_hheight of cropping
-
- Returned value
- 0 on success, non-zero value otherwise
void get_jpeg_image_names(const std::string &input_image_path, std::vector<std::string> &image_names);Searchs JPEG files recursively and get those paths.
This function is declared in demo_common.h.
- Arguments
-
input_image_pathDirectory to be searched in. -
image_namesBuffer to store the JPEG file paths.
-
int dmp::util::decode_jpg_file(const std::string &imgFileName, uint32_t *imgView,
int img_width, int img_height);Decodes a JPEG file into RGB data.
- Arguments
-
imgFileNamePath to a JPEG file. -
imgViewDestination buffer. -
img_widthWidth of the image. -
img_heightHeight of the image.
-
- Returned value
- 0 on success, non-zero value otherwise
void dmp::util::preproc_image(uint32_t *__restrict imgView, __fp16 *__restrict imgProc,
int img_width, int img_height, float r_offs, float g_offs,
float b_offs, float sf, bool transpose, bool is_bgr = true);
void dmp::util::preproc_image(uint32_t *__restrict imgView, __fp16 *__restrict imgProc,
int inimg_width, int inimg_height, int outimg_width,
int outimg_height, float r_offs, float g_offs, float b_offs,
float sf, bool transpose, bool is_bgr = true);Converts a RGB image to an input image for a DNN model.
- Arguments
-
imgViewa RGB image. -
imgProcDestination buffer. -
inimg_widthWidth of the RGB image. -
inimg_heightHeight of the RGB image. -
outimg_widthWidth of the input image for a DNN. -
outimg_heightHeight of the input image for a DNN. -
r_offsOffset of R channel. A value of R channel in the input image for a DNN is calculated by addingr_offsand a value or R channel in the RGB image. -
g_offsOffset of G channel. A value of G channel in the input image for a DNN is calculated by addingg_offsand a value or G channel in the RGB image. -
b_offsOffset of B channel. A value of B channel in the input image for a DNN is calculated by addingb_offsand a value or B channel in the RGB image. -
sfScale coefficient. The final value of each channel is determined by multiplyingsfafter applying*_offs. -
transposeIftrue, this function transposes the image. Please usetruesince SDK supposes that the input is transposed. -
is_bgrIftrue, this function converts the input image to a BGR image.
-
void handle_keyboard_input(int &exit_code, bool &pause);Configure exit_code or pause according to keyboard inputs.
If ESC key is pressed, exit_code will be 0.
If SPACE key is pressed, pause will be !pause.
This function is declared in demo_common.h.
