#ifndef __sva_lib_h__ #define __sva_lib_h__ #ifndef _CRT_SECURE_NO_WARNINGS # define _CRT_SECURE_NO_WARNINGS #endif #include #ifdef SVA_EXPORTS #define SVA_API __declspec(dllexport) #else #define SVA_API __declspec(dllimport) #endif #ifdef __cplusplus extern "C" { #endif // Типы, структуры #ifndef __sva_handle__ /*! * \typedef void * sva_handle * * \brief Дескриптор, используемый для доступа к видеоанализатору. */ typedef void * sva_handle; #endif // Коды ошибок #define SVA_OK 0 #define SVA_OK_FALSE 1 #define SVA_ERR_UNKNOWN 1001 #define SVA_ERR_BAD_ARGUMENT 1002 #define SVA_ERR_INCOMPATIBLE_MODEL 1003 #define SVA_ERR_BUFFER_TOO_SHORT 1004 #define SVA_ERR_NO_MESSAGE_FOUND 1005 #define SVA_ERR_NOT_CALIBRATED 1006 #define SVA_ERR_NOT_IMPLEMENTED 1007 /*! * \typedef int sva_result * * \brief Статус выполнения функций библиотеки. Принимает значения SVA_OK, SVA_OK_FALSE, SVA_ERR_*. */ typedef int sva_result; /*! * \brief Вектор или точка */ typedef struct sva_point_s { /// X-координата. int x; /// Y-координата. int y; } sva_point_t; /*! * \brief Вектор или точка */ typedef struct sva_fpoint_s { /// X-координата. float x; /// Y-координата. float y; } sva_fpoint_t; /*! * \struct sva_position_s * * \brief Точка на изображении. * */ typedef struct sva_position_s { /// X-координата. int x; /// Y-координата. int y; /// Время в секундах. double time; //secs } sva_position_t; /*! * \struct sva_rect_s * * \brief Прямоугольная область на изображении. * */ typedef struct sva_rect_s { /// X-координата левого верхнего угла. int x1; /// Y-координата левого верхнего угла. int y1; /// X-координата правого нижнего угла. int x2; /// Y-координата правого нижнего угла. int y2; } sva_rect_t; /*! * \struct sva_trajectory_s * * \brief Траектория объекта. * */ typedef struct sva_trajectory_s { /// Количество точек траектории. size_t points_count; /*! * Массив точек траектории. Указывает на внутренний буфер, который действителен * до следующего вызова функций sva_create, sva_release или sva_next_frame. */ sva_position_t * points; } sva_trajectory_t; #define SVA_OBJECT_LABEL_EMPTY 0 #define SVA_OBJECT_LABEL_STATIC 1 #define SVA_OBJECT_LABEL_MOVING 2 #define SVA_OBJECT_LABEL_ABANDONED 3 #define SVA_OBJECT_LABEL_BIGOBJECT 4 #define SVA_OBJECT_LABEL_TOTAL 6 /*! * \struct sva_object_s * * \brief Объект на изображении. * */ typedef struct sva_object_s { /// Идентификатор объекта. int id; /*! * Тип объекта, например, оставленный предмет, движущийся объект и др. * Принимает значения SVA_OBJECT_LABEL_*. */ //int label; // see ClassificationDetails::Label /// Положение объекта на изображении в текущий момент времени. sva_position_t position; /// Рамка, обрамляющая объект. sva_rect_t rect; /// Положение объекта в момент его обнаружения. sva_position_t start_position; /// Траектория объекта. sva_trajectory_t trajectory; /// Индекс региона в маске unsigned char region_index; //TODO translate /// averaging time for object velocity estimation float averaging_time; /// velocity estimation average error float average_error; /// expected object position sva_fpoint_t expected_position; /// object velocity on screen sva_fpoint_t screen_velocity; /// object physical velocity sva_fpoint_t plane_velocity; /// object physical speed (speed = |velocity|) float plane_speed; /// average object screen area float average_screen_area; /// average object physical area float average_plane_area; } sva_object_t; //#define SVA_IMAGE_UNDEFINED -1 //#define SVA_IMAGE_BGR 1 //#define SVA_IMAGE_BGRA 2 //#define SVA_IMAGE_RGB 3 //#define SVA_IMAGE_RGB_FLIPPED 4 //#define SVA_IMAGE_BGR_FLIPPED 5 //#define SVA_IMAGE_YUV420P 6 //#define SVA_IMAGE_MONOCHROME 7 // //#define SVA_IMAGE_FFMPEG_PIX_FMT_BEGIN 10 //#define SVA_IMAGE_FFMPEG_PIX_FMT_END (SVA_IMAGE_FFMPEG_PIX_FMT_BEGIN + 1000) //... /*! * \struct sva_input_plane_s * * \brief Цветовая плоскость изображения. * */ typedef struct sva_frame_plane_s { /// Указатель на данные цветовой плоскости. unsigned char * bytes; /// Количество байт в строке. size_t stride; /// Размер кадра, байты. size_t size; } sva_frame_plane_t; /*! * \struct sva_frame_s * * \brief Структура описывает изображение. * */ typedef struct sva_frame_s { /// Формат изображения. Должно принимать значения SVA_IMAGE_*. int format; /// Разрешение кадра Ширина Х Высота. int width; int height; /// Цветовые плоскости изображения. sva_frame_plane_t planes[4]; /// Время кадра. double time; // secs } sva_frame_t; #define SVA_EVENT_LEVEL_INFO 0 #define SVA_EVENT_LEVEL_ALERT 1 #define SVA_EVENT_TYPE_EMPTY 0 // Level=Info #define SVA_EVENT_TYPE_STABLE 1 #define SVA_EVENT_TYPE_OBJECT_IN 2 #define SVA_EVENT_TYPE_OBJECT_OUT 3 #define SVA_EVENT_TYPE_FEATURE_UPDATE 4 // Level=Alert #define SVA_EVENT_TYPE_INTRUSION 5 #define SVA_EVENT_TYPE_SABOTAGE 6 #define SVA_EVENT_TYPE_LONG_UNSTABLE 7 // Bad illuminance: #define SVA_EVENT_TYPE_BLACKOUT 8 #define SVA_EVENT_TYPE_OVEREXPOSURE 9 #define SVA_EVENT_TYPE_DEFOCUSING 10 // Antishaker2: #define SVA_EVENT_TYPE_UNSTABILIZABLE 11 // NoiseFilter: #define SVA_EVENT_TYPE_TOO_LARGE_NOISE 12 // RuleEngine: #define SVA_EVENT_TYPE_OBJECT_ENTER 13 #define SVA_EVENT_TYPE_OBJECT_ESCAPE 14 #define SVA_EVENT_TYPE_OBJECT_ILLEGAL_DIRECTION 15 #define SVA_EVENT_TYPE_OBJECT_STAY_OVER_TIME 16 #define SVA_EVENT_TYPE_OBJECT_RUNNING 17 #define SVA_EVENT_TYPE_OBJECT_LOITERING 18 #define SVA_EVENT_TYPE_TRIPWIRE_ALARM 19 // AbandonedDetector: #define SVA_EVENT_TYPE_ABANDONED 20 // BigObjectClassifier: #define SVA_EVENT_TYPE_BIG_OBJECT 21 /*! * \struct sva_event_s * * \brief Событие, возникшее в процессе видеоанализа. * */ typedef struct sva_event_s { /// Тип события. Принимает значения SVA_EVENT_TYPE_*. unsigned char type; /// Уровень. Принимает значения SVA_EVENT_LEVEL_*. unsigned char level; /// Время в секундах. double time; //secs /// Идентификатор объекта, связанного с событием. int object_id; /// Идентификатор правила, которое сгенерировало событие. int rule_id; /// Название правила. const char * rule_name; /// Текст. const char * text; /*! * Аннотированное изображение (кадр). * Хранится во внутреннем буфере. Буфер действителен до следующего вызова функций * sva_create, sva_release или sva_next_frame. */ sva_frame_t image; } sva_event_t; /*! * \struct sva_input_s * * \brief Входные данные для видеоанализа. * */ typedef struct sva_input_s { //TODO int version; /// Входное изображения. sva_frame_t frame; } sva_input_t; /*! * \struct sva_output_s * * \brief Выходные данные от видеоанализа. * */ typedef struct sva_output_s { //int version; /// Входное серое изображение sva_frame_t input_frame; /// Выходное изображение. Может отсутствовать. sva_frame_t frame; /// Количество объектов, обнаруженных на кадре. size_t objects_count; /*! * Массив объектов, обнаруженных на кадре. * Указывает на внутренний буфер. Буфер действителен до следующего вызова функций * sva_create, sva_release или sva_next_frame. */ sva_object_t * objects; /*! Указатель на внутренний буфер. * Значение элемента соответствует индексу региона. * Буфер действителен до следующего вызова функций sva_create, sva_release или sva_next_frame. */ sva_frame_t mask; /// Количество событий, которые возникли на текущем кадре. size_t events_count; /*! * Массив событий, которые возникли на текущем кадре. * Указывает на внутренний буфер. Буфер действителен до следующего вызова функций * sva_create, sva_release или sva_next_frame. */ sva_event_t * events; } sva_output_t; /*! * \typedef void (*sva_notifier_callback_t)(const sva_event_t * e, void * user_data) * * \brief Функция обратного вызова для получения событий. * * \param sva_event_t Событие. * \param user_data Пользовательские данные, переданные в функцию sva_set_notifier. * * Предпочитетельней использовать события из output структуры после вызова next_frame функции. */ typedef void (*sva_notifier_callback_t)(const sva_event_t * e, void * user_data); /*! * \struct sva_notifier_s * * \brief Обработчик событий. * */ typedef struct sva_notifier_s { //TODO int level; /// Функция обратного вызова для получения событий. sva_notifier_callback_t callback; /// Пользовательские данные. void * user_data; } sva_notifier_t; /*! * \typedef void (*sva_logger_callback_t)(const char * msg, void * user_data) * * \brief Функция обратного вызова для получения сообщений об ошибках, предупреждения и другие * информационные сообщения от регистратора. */ typedef void (*sva_logger_callback_t)(const char * msg, void * user_data); #define SVA_LOGGER_LEVEL_SILENT 0 #define SVA_LOGGER_LEVEL_ERROR 1 #define SVA_LOGGER_LEVEL_WARNING 2 #define SVA_LOGGER_LEVEL_INFO 3 #define SVA_LOGGER_LEVEL_VERBOSE 4 /*! * \struct sva_logger_s * * \brief Регистратор. * */ typedef struct sva_logger_s { /// Уровень сообщений, которые следует регистрировать. int level; /// Функция обратного вызова для получения сообщений. sva_logger_callback_t callback; /// Пользовательские данные. void * user_data; /// Включить в сообщение идентификатор потока. int enable_thread_id; /// Включить в сообщение время. int enable_timestamp; /// Включить в сообщение префикс, например, 'E' (ошибка) или 'W' (предупреждение). int enable_prefix; } sva_logger_t; // Функции /*! * \fn sva_result sva_create(sva_handle * ph); * * \brief Создать видеоанализатор. * * \param [in,out] ph Дескриптор видеоанализатора. * */ sva_result SVA_API sva_create(sva_handle * ph); /*! * \fn sva_result sva_release(sva_handle h); * * \brief Освободить видеоанализатор. * * \param h Дескриптор видеоанализатора. * */ sva_result SVA_API sva_release(sva_handle h); /* * Чтение/установка параметров видеоаналитики, например: * sva_set_int(h, "processor1.param1", 12); * */ /*! * \fn sva_result sva_get_bool(sva_handle h, const char * name, int * value); * * \brief Получить параметр видеоаналитики. * * \param h Дескриптор видеоанализатора. * \param name Название параметра. * \param [in,out] value Значение параметра. * */ sva_result SVA_API sva_get_bool(sva_handle h, const char * name, int * value); // bool /*! * \fn sva_result sva_get_int(sva_handle h, const char * name, int * value); * * \brief Получить параметр видеоаналитики. * * \param h Дескриптор видеоанализатора. * \param name Название параметра. * \param [in,out] value Значение параметра. * */ sva_result SVA_API sva_get_int(sva_handle h, const char * name, int * value); /*! * \fn sva_result sva_get_double(sva_handle h, const char * name, double * value); * * \brief Получить параметр видеоаналитики. * * \param h Дескриптор видеоанализатора. * \param name Название параметра. * \param [in,out] value Значение параметра. * */ sva_result SVA_API sva_get_double(sva_handle h, const char * name, double * value); /*! * \fn sva_result sva_get_float(sva_handle h, const char * name, float * value); * * \brief Получить параметр видеоаналитики. * * \param h Дескриптор видеоанализатора. * \param name Название параметра. * \param [in,out] value Значение параметра. */ sva_result SVA_API sva_get_float(sva_handle h, const char * name, float * value); /*! * \fn sva_result sva_get_unsigned(sva_handle h, const char * name, unsigned int * value); * * \brief Получить параметр видеоаналитики. * * \param h Дескриптор видеоанализатора. * \param name Название параметра. * \param [in,out] value Значение параметра. */ sva_result SVA_API sva_get_unsigned(sva_handle h, const char * name, unsigned int * value); /*! * \fn sva_result sva_get_string(sva_handle h, const char * name, char * value, size_t * plen); * * \brief Получить параметр видеоаналитики. * * \param h Дескриптор видеоанализатора. * \param name Название параметра. * \param [in] value Внешний буфер. Игнорируется, если равен 0. * \param [out] value Значение параметра. * \param [in] plen Длина буфера в байтах. * \param [out] plen Длина значения в байтах, если статус SVA_OK или SVA_ERR_BUFFER_TOO_SHORT. * */ sva_result SVA_API sva_get_string(sva_handle h, const char * name, char * value, size_t * plen); /*! * \fn sva_result sva_get_as_string(sva_handle h, const char * name, char * value, * size_t * plen); * * \brief Получить параметр видеоаналитики в строковом виде. * * \param h Дескриптор видеоанализатора. * \param name Название параметра. * \param [in] value Внешний буфер. Игнорируется, если равен 0. * \param [out] value Значение параметра. * \param [in] plen Длина буфера в байтах. * \param [out] plen Длина значения в байтах, если статус SVA_OK или SVA_ERR_BUFFER_TOO_SHORT. * */ sva_result SVA_API sva_get_as_string(sva_handle h, const char * name, char * value, size_t * plen); /*! * \fn sva_result sva_set_bool(sva_handle h, const char * name, int value); * * \brief Установить параметр видеоаналитики. * * \param h Дескриптор видеоанализатора. * \param name Название параметра. * \param value Значение параметра. * */ sva_result SVA_API sva_set_bool(sva_handle h, const char * name, int value); /*! * \fn sva_result sva_set_int(sva_handle h, const char * name, int value); * * \brief Установить параметр видеоаналитики. * * \param h Дескриптор видеоанализатора. * \param name Название параметра. * \param value Значение параметра. * */ sva_result SVA_API sva_set_int(sva_handle h, const char * name, int value); /*! * \fn sva_result sva_set_double(sva_handle h, const char * name, double value); * * \brief Установить параметр видеоаналитики. * * \param h Дескриптор видеоанализатора. * \param name Название параметра. * \param value Значение параметра. * */ sva_result SVA_API sva_set_double(sva_handle h, const char * name, double value); /*! * \fn sva_result sva_set_float(sva_handle h, const char * name, float value); * * \brief Установить параметр видеоаналитики. * * \param h Дескриптор видеоанализатора. * \param name Название параметра. * \param value Значение параметра. * */ sva_result SVA_API sva_set_float(sva_handle h, const char * name, float value); /*! * \fn sva_result sva_set_unsigned(sva_handle h, const char * name, unsigned int value); * * \brief Установить параметр видеоаналитики. * * \param h Дескриптор видеоанализатора. * \param name Название параметра. * \param value Значение параметра. * */ sva_result SVA_API sva_set_unsigned(sva_handle h, const char * name, unsigned int value); /*! * \fn sva_result sva_set_string(sva_handle h, const char * name, const char * value, * size_t len); * * \brief Установить параметр видеоаналитики. * * \param h Дескриптор видеоанализатора. * \param name Название параметра. * \param value Значение параметра. * \param len Длина значения в байтах. * */ sva_result SVA_API sva_set_string(sva_handle h, const char * name, const char * value, size_t len); /*! * \fn sva_result sva_set_as_string(sva_handle h, const char * name, const char * value, * size_t len); * * \brief Установить параметр видеоаналитики в строковом виде. * * \param h Дескриптор видеоанализатора. * \param name Название параметра. * \param value Значение параметра. * \param len Длина значения в байтах. * */ sva_result SVA_API sva_set_as_string(sva_handle h, const char * name, const char * value, size_t len); /*! * \fn sva_result sva_save_model(sva_handle h, char * xml, size_t * plen); * * \brief Сохранить модель. * * \param h Дескриптор видеоанализатора. * \param [in] xml Внешний буфер для сохранения модели. Игнорируется, если равен 0. * \param [out] xml Модель, описанная на XML. Модель содержит калибровочную информацию. * \param [in] plen Длина буфера в байтах. * \param [out] plen Длина описания модели в байтах, если статус SVA_OK или SVA_ERR_BUFFER_TOO_SHORT. * */ sva_result SVA_API sva_save_model(sva_handle h, char * xml, size_t * plen); /*! * \fn sva_result sva_load_model(sva_handle h, const char * xml, size_t len); * * \brief Загрузить модель. * * \param h Дескриптор видеоанализатора. * \param xml Модель, описанная на XML. Если равен 0, то устанавливается модель по умолчанию. * \param len Длина описания модели в байтах. * */ sva_result SVA_API sva_load_model(sva_handle h, const char * xml, size_t len); /*! * \fn sva_result sva_save_options(sva_handle h, char * xml, size_t * plen); * * \brief Сохранить параметры видеоаналитики. * * \param h Дескриптор видеоанализатора. * \param [in] xml Внешний буфер. Игнорируется, если равен 0. * \param [out] xml Параметры видеоаналитики, описанные на XML. * \param [in] plen Длина буфера в байтах. * \param [out] plen Длина описания в байтах, если статус SVA_OK или SVA_ERR_BUFFER_TOO_SHORT. * */ sva_result SVA_API sva_save_options(sva_handle h, char * xml, size_t * plen); /*! * \fn sva_result sva_load_options(sva_handle h, const char * xml, size_t len); * * \brief Загрузить параметры видеоаналитики. * * \param h Дескриптор видеоаналитики. * \param xml Описание параметров на XML. Если равен 0, то устанавливаются параметры по умолчанию. * \param len Длина описания в байтах. * */ sva_result SVA_API sva_load_options(sva_handle h, const char * xml, size_t len); /*! * \fn sva_result sva_set_notifier(sva_handle h, sva_notifier_t notifier); * * \brief Установить обработчик событий. * * \param h Дескриптор видеоанализатора. * \param notifier Обработчик событий. * */ sva_result SVA_API sva_set_notifier(sva_handle h, const sva_notifier_t * notifier); /*! * \fn sva_result sva_calibrate(sva_handle h, int width, int height); * * \brief Откалибровать видеоанализатор. * * \param h Дескриптор видеоанализатора. * \param width Ширина кадра в пикселях. * \param height Высота кадра в пикселях. * */ sva_result SVA_API sva_calibrate(sva_handle h, int width, int height); /*! * \fn sva_result sva_next_frame(sva_handle h, sva_input_t * input, sva_output_t * output); * * \brief Обработать следующий кадр. * * Перед серией вызовов sva_next_frame должна быть выполнена калибровка. * * \param h Дескриптор видеоанализатора. * \param [in,out] input Входные данные. * \param [in,out] output Выходные данные. * */ sva_result SVA_API sva_next_frame(sva_handle h, sva_input_t * input, sva_output_t * output); // Другое /*! * \fn sva_result sva_get_error_message(sva_result r, char * buffer, size_t * plen); * * \brief Получить описание ошибки. * * \param r Код ошибки. * \param [in] buffer Внешний буфер. Игнорируется, если равен 0. * \param [out] buffer Описание ошибки. Если длины буфера не достаточно, то описание обрезается. * \param [in] plen Длина буфера в байтах. * \param [out] plen Длина описания в байтах. * * \return SVA_ERR_BUFFER_TOO_SHORT, если буфер короткий или указатель на буфер нулевой. */ sva_result SVA_API sva_get_error_message(sva_result r, char * buffer, size_t * plen); /*! * \fn sva_result sva_set_logger(sva_handle h, sva_logger_t logger); * * \brief Установить регистратор. * * \param h Дескриптор видеоанализатора. * \param logger Регистратор. * */ sva_result SVA_API sva_set_logger(sva_handle h, sva_logger_t logger); /*! * \brief Получить физическую высоту объекта. * * \param h Дескриптор видеоанализатора. * \param screen_point Точка касания объекта плоскости земли на кадре. Должна находиться ниже линии горизонта. * \param screen_height Высота объекта на кадре. * \param [out] plane_height Физическая высота объекта. */ sva_result SVA_API sva_get_height(sva_handle h, sva_point_t screen_point, float screen_height, float * plane_height); /*! * \brief Получить физическую площадь объекта. * * \param h Дескриптор видеоанализатора. * \param screen_point Точка касания объекта плоскости земли на кадре. Должна находиться ниже линии горизонта. * \param screen_area Площадь объекта на кадре. * \param [out] plane_area Физическая площадь объекта. */ sva_result SVA_API sva_get_area(sva_handle h, sva_point_t screen_point, float screen_area, float * plane_area); /*! * \brief Получить физическую координату. * * \param h Дескриптор видеоанализатора. * \param screen_point Точка на кадре. * \param [out] plane_point Точка на плоскости земли. Если screen_point на или выше линии горизонта, * то принимает значение (0, 0). */ sva_result SVA_API sva_get_coordinate(sva_handle h, sva_point_t screen_point, sva_fpoint_t * plane_point); #ifdef __cplusplus } #define SVAL_DECLARE(RET, NAME, ARGS) \ typedef RET (*NAME##_fn)ARGS; \ NAME##_fn NAME; #define SVAL_LOAD(NAME) \ NAME = (NAME##_fn)loader(#NAME); \ if (!NAME) return false; struct sva_dll { SVAL_DECLARE(sva_result, sva_create, (sva_handle * ph)); SVAL_DECLARE(sva_result, sva_release, (sva_handle h)); SVAL_DECLARE(sva_result, sva_save_model, (sva_handle h, char * xml, size_t * plen)); SVAL_DECLARE(sva_result, sva_load_model, (sva_handle h, const char * xml, size_t len)); SVAL_DECLARE(sva_result, sva_save_options, (sva_handle h, char * xml, size_t * plen)); SVAL_DECLARE(sva_result, sva_load_options, (sva_handle h, const char * xml, size_t len)); SVAL_DECLARE(sva_result, sva_get_error_message, (sva_result r, char * buffer, size_t * plen)); SVAL_DECLARE(sva_result, sva_set_as_string, (sva_handle h, const char * name, const char * value, size_t len)); SVAL_DECLARE(sva_result, sva_get_as_string, (sva_handle h, const char * name, char * value, size_t * plen)); SVAL_DECLARE(sva_result, sva_calibrate, (sva_handle h, int width, int height)); SVAL_DECLARE(sva_result, sva_next_frame, (sva_handle h, sva_input_t * input, sva_output_t * output)); #ifdef __WarehouseLib_h__ SVAL_DECLARE(sva_result, sva_next_frame2, (sva_handle h, WarehouseData_h input_, WarehouseData_h output_)); #endif // __WarehouseLib_h__ template bool Load(T loader) { SVAL_LOAD(sva_create); SVAL_LOAD(sva_release); SVAL_LOAD(sva_save_model); SVAL_LOAD(sva_load_model); SVAL_LOAD(sva_save_options); SVAL_LOAD(sva_load_options); SVAL_LOAD(sva_get_as_string); SVAL_LOAD(sva_set_as_string); SVAL_LOAD(sva_get_error_message); SVAL_LOAD(sva_calibrate); SVAL_LOAD(sva_next_frame); #ifdef __WarehouseLib_h__ SVAL_LOAD(sva_next_frame2); #endif // __WarehouseLib_h__ return true; } }; #endif // __cplusplus #endif // __sva_lib_h__