#ifndef CV_COMMON_H_ #define CV_COMMON_H_ /// @defgroup cv_common cv common /// @brief common definitions & API for cv libs /// @{ #include #ifdef __cplusplus # define CV_SDK_API extern "C" CV_SDK_API_ #else # define CV_SDK_API CV_SDK_API_ #endif /// cv handle declearation typedef void *cv_handle_t; /// cv result declearation typedef cv_errcode cv_result_t; /// cv rectangle definition typedef struct cv_rect_t { int left; ///< 矩形最左边的坐标 int top; ///< 矩形最上边的坐标 int right; ///< 矩形最右边的坐标 int bottom; ///< 矩形最下边的坐标 } cv_rect_t; /// cv float type point definition typedef struct cv_pointf_t { float x; ///< 点的水平方向坐标, 为浮点数 float y; ///< 点的竖直方向坐标, 为浮点数 } cv_pointf_t; /// cv integer type point definition typedef struct cv_pointi_t { int x; ///< 点的水平方向坐标, 为整数 int y; ///< 点的竖直方向坐标, 为整数 } cv_pointi_t; /// cv object struct typedef struct cv_object_t { cv_pointi_t *corner; int corner_count; } cv_object_t; /// cv landmark array struct typedef struct cv_landmarks_t { cv_pointf_t *points_array; int points_count; } cv_landmarks_t; /// @brief 关键点跟踪结果结构体 typedef struct cv_target_t { cv_rect_t rect; ///< 代表面部的矩形区域 cv_pointf_t *points_array; ///< 目标关键点坐标 int points_count; ///< 目标关键点长度 float score; ///< 目标置信度 int id; ///< 目标ID, 用于表示在目标跟踪中的相同目标在不同帧多次出现 } cv_target_t; typedef struct cv_feature_header_t { int ver; ///< 版本信息 int idx; ///< 数组下标索引 int len; ///< CV_FEATURE全部内容的长度, 包括feature_header和特征数组, 按字节计算, 与sizeof(cv_feature_header_t)定义不同 } cv_feature_header_t; /// @brief 特征格式定义 typedef struct cv_feature_t { int ver; ///< 特征版对应模型本号 int idx; ///< 特征索引序号 int len; ///< CV_FEATURE全部内容的长度, 包括feature_header和特征数组, 按字节计算, 与sizeof(cv_feature_header_t)定义不同 float feat[0]; ///< 特征数组 } cv_feature_t; #define CV_FEATURE_HEADER(pf) ((cv_feature_header_t*)(pf)) #define CV_FEATURE_SIZE(pf) (CV_FEATURE_HEADER(pf)->len) #define CV_FEATURE_LENGTH(pf) ((CV_FEATURE_HEADER(pf)->len-sizeof(cv_feature_header_t))/sizeof(float)) #define CV_ENCODE_FEATURE_SIZE(pf) ((CV_FEATURE_HEADER(pf)->len+2)/3*4 + 1) /// cv pixel format definition typedef enum { CV_PIX_FMT_GRAY8, ///< Y 1 8bpp ( 单通道8bit灰度像素 ) CV_PIX_FMT_YUV420P, ///< YUV 4:2:0 12bpp ( 3通道, 一个亮度通道, 另两个为U分量和V分量通道, 所有通道都是连续的 ) CV_PIX_FMT_NV12, ///< YUV 4:2:0 12bpp ( 2通道, 一个通道是连续的亮度通道, 另一通道为UV分量交错 ) CV_PIX_FMT_NV21, ///< YUV 4:2:0 12bpp ( 2通道, 一个通道是连续的亮度通道, 另一通道为VU分量交错 ) CV_PIX_FMT_BGRA8888, ///< BGRA 8:8:8:8 32bpp ( 4通道32bit BGRA 像素 ) CV_PIX_FMT_BGR888 ///< BGR 8:8:8 24bpp ( 3通道24bit BGR 像素 ) } cv_pixel_format; /// @brief 时间戳定义 typedef struct cv_time_t { long int tv_sec; ///< 秒 long int tv_usec; ///< 微妙 }cv_time_t; /// 图像格式定义 typedef struct cv_image { unsigned char *data; ///< 图像数据指针 cv_pixel_format pixel_format; ///< 像素格式 int width; ///< 宽度(以像素为单位) int height; ///< 高度(以像素为单位) int stride; ///< 跨度, 即每行所占的字节数 cv_time_t time_stamp; ///< 时间戳 } cv_image; typedef struct cv_clustering_result_t { unsigned int count; ///< 目标数量 int *idxs; ///< 目标索引数组 unsigned int group_flags; ///< 保留参数 } cv_clustering_result_t; /// @brief 图像分类标签结果 typedef struct cv_classifier_result_t { int id; ///标签 float score; /// 置信度 } cv_classifier_result_t; // ====================== image utilities ======================== /// @brief 创建图像指针并分配内存 /// @param[in] width 输入宽度 /// @param[in] height 输入高度 /// @param[in] pixel_format 输入像素格式 /// @param[out] image 输出图像指针所在地址 /// @return 成功返回CV_OK, 否则返回错误码 CV_SDK_API cv_result_t cv_image_allocate( int width, int height, cv_pixel_format pixel_format, cv_image ** image ); /// @brief 释放图像数据 /// @param[in] image 图像指针 CV_SDK_API void cv_image_release(cv_image* image); /// @brief 进行颜色格式转换 /// @param[in] image_src 用于待转换的图像数据 /// @param[out] image_dst 转换后的图像数据, 目标图像由用户分配内存, 需提前定义宽, 高, PixelFormat等信息, 像素值初始化为0 /// @return 正常返回CV_OK, 否则返回错误类型 CV_SDK_API cv_result_t cv_common_color_convert( const cv_image* image_src, cv_image* image_dst ); /// @brief 进行仿射变换 /// @param[in] image_src 用于待转换的图像数据 /// @param[in] src_points_array 源图的仿射点数组 /// @param[in] src_points_count 源图仿射点的数目 /// @param[in] dst_points_array 目标图的仿射点数组 /// @param[in] dst_points_count 目标图仿射点的数目 /// @param[out] image_dst 转换后的图像数据, 必须是BGR格式图像,目标图像需要由用户分配内存, 需提前定义宽, 高, PixelFormat等信息 /// @return 正常返回CV_OK, 否则返回错误类型 CV_SDK_API cv_result_t cv_common_image_affine_transfer( const cv_image *image_src, const cv_pointf_t *src_points_array, const int src_points_count, const cv_pointf_t *dst_points_array, const int dst_points_count, cv_image *image_dst ); /// @brief 图片调整方法 typedef enum { CV_IMAGE_RESIZE_BILINEAR, ///< 双线性插值 CV_IMAGE_RESIZE_AREA ///< 区域插值 } cv_image_resize_method; /// @brief 进行缩放变换 /// @note 该函数目前不支持stride参数, 所以stride参数应等于 width * elemSize /// @param[in] image_src 用于待转换的图像数据 /// @param[out] image_dst 转换后的图像数据, 目标图像由用户分配内存, 需提前定义宽, 高, PixelFormat等信息 /// @param[in] method 缩放转换的方法 /// @return 正常返回CV_OK, 否则返回错误类型 CV_SDK_API cv_result_t cv_common_image_resize( const cv_image *image_src, cv_image *image_dst, cv_image_resize_method method ); /// @brief 进行图像裁剪 /// @param[in] image_src 用于待裁剪的图像数据 /// @param[in] crop_area 图像裁剪的区域 /// @param[out] image_dst 裁剪后的图像数据, 目标图像由用户分配内存, 需提前定义宽, 高, PixelFormat等信息 /// @return 正常返回CV_OK, 否则返回错误类型 CV_SDK_API cv_result_t cv_common_image_crop( const cv_image *image_src, const cv_rect_t *crop_area, cv_image *image_dst ); /// @brief 进行图像旋转 /// @note 该函数目前不支持stride参数, 所以stride参数应等于 width * elemSize /// @param[in] image_src 用于待旋转的图像数据 /// @param[out] image_dst 旋转后的图像数据, 目标图像由用户分配内存, 需提前定义宽, 高, PixelFormat等信息 /// @param[in] rotate_degree 图像顺时针旋转的角度, 现在只支持0, 90, 180, 270 /// @return 正常返回CV_OK, 否则返回错误类型 CV_SDK_API cv_result_t cv_common_image_rotate( const cv_image *image_src, cv_image *image_dst, unsigned int rotate_degree ); // ====================== model loader ======================== /// 模型指针 typedef void * cv_model_t; /// 组合模型指针 typedef void * cv_composite_model_t; /// @brief 加载外部模型 /// @param[in] file 输入模型文件路径 /// @param[out] model 输出已初始化的模型指针 /// @return 成功返回CV_OK CV_SDK_API cv_result_t cv_common_load_model( const char *file, cv_model_t *model ); /// @brief 销毁已加载的模型 /// @param[in] model 模型指针 CV_SDK_API void cv_common_unload_model( cv_model_t model ); /// @brief 加载内部模型 /// @param[in] model_start 内部模型指针头 /// @param[in] model_end 内部模型指针尾 /// @param[out] model 输出已初始化的模型指针 /// @return 成功返回CV_OK CV_SDK_API cv_result_t cv_common_load_resource( const unsigned char *model_start, const unsigned char *model_end, cv_model_t *model ); /// @brief 加载组合模型 /// @param[in] file 组合模型文件路径, 文件是由多个子模型文件组成tar包 /// @param[out] model 输出已初始化的组合模型指针 /// @return 成功返回CV_OK CV_SDK_API cv_result_t cv_common_load_composite_model( const char *file, cv_composite_model_t *model ); /// @brief 销毁已加载的组合模型 /// @param[in] model 将销毁的模型 CV_SDK_API cv_result_t cv_common_unload_composite_model( cv_composite_model_t model ); /// @brief 获取子模型 /// @param[in] model 组合模型 /// @param[in] name 子模型名字 /// @param[in] 成功返回CV_OK CV_SDK_API cv_result_t cv_common_composite_model_get_submodel( cv_composite_model_t model, const char *name, cv_model_t *submodel ); /// @} #endif // INCLUDE_CV_COMMON_H_