#ifndef _PL_BlockGrouping_H_ #define _PL_BlockGrouping_H_ #include "PipeLine.h" #include "MaterialBuffer.h" #include "GraphicHelper.h" #include #include typedef bool (*user_test_grouping_func_t)(); typedef float (*user_score_func_t)(const MB_Frame* ptr_frame, const PLGH_Rect& rects, uint8_t* croppedData); #define PLBG_MAX_CACHE_FRAMES 10//#todo #define PLBG_MAX_GROUPS 10 struct RectWrapper { PLGH_Rect rect; float user_score_1; void* userData; typedef void (*user_data_deleter_func_t)(RectWrapper& rw); user_data_deleter_func_t user_data_deleter; RectWrapper() : rect(), user_score_1(0.0f), userData(nullptr), user_data_deleter(nullptr) { } }; typedef void (*plbg_get_rect_func_t)(const PipeMaterial& ptr_pm, const MB_Frame& data_frame, std::list& rects); struct PLBG_Output { uint16_t groupID; uint16_t blockID; RectWrapper rectInOriginFrame; MB_Frame* originframe; float score; uint8_t* croppedData; size_t croppedDataSize; PLBG_Output() : groupID(0), blockID(0), rectInOriginFrame(), originframe(nullptr), score(0.0f), croppedData(nullptr), croppedDataSize(0) { } }; typedef std::vector plbg_output_vec_t; struct PL_BlockGrouping_Config { bool copyData; int precfg_fps; int precfg_interval; int precfg_delay; plbg_get_rect_func_t get_rect_func; int group_size_min; // group内数量需要产生输出,但数量小于group_size_min时,丢弃组 int group_size_max; // 一组block的数量,当测试组中累积block数量大于等于group_size_max时,产生输出 int frame_count_max; // 对于一组block,当输入帧数量大于此值时,产生输出 int group_top_n; // 对于不容忍的变化,组内产生group_top_n个输出 // tolerance for grouping int block_center_x_diff; // block中心X容忍的移动距离 int block_center_y_diff; // block中心Y容忍的移动距离 int block_area_diff; // block面积容忍的变化 int continuity_max; // 输入连续性的最大间隔 int accept_blocks_max_per_frame; // 每帧每组接受的最大block数量 user_test_grouping_func_t user_test_group_accept_rect; // scoring // user_score_rate = 1 - canny_focus - histogram_uniformy; // score = canny_focus * canny(image) + // histogram_uniformy * histogram(image) + // user_score_rate * user_score_func(image) float canny_focus; // 对焦度(模糊度)评分所占比例,返回0~1.0得分(边缘锐度) float histogram_uniformy; // 直方图幅度???? float user_score_1_rate; user_score_func_t user_score_2_func; // 用户评分函数评分,返回0~1.0得分 PL_BlockGrouping_Config() : //copyData(false), //get_rect_func(nullptr), //group_size_max(10), frame_count_max(10), group_top_n(2), //block_center_x_diff(5), block_center_y_diff(5), //block_area_diff(500), continuity_max(2), accept_blocks_max_per_frame(1), //canny_focus(0.4), histogram_uniformy(0.0), user_score_func(nullptr) // camera 640x480,fps=30,dist=1(meter),interval=25 //copyData(false), //get_rect_func(nullptr), //group_size_min(2), group_size_max(20), frame_count_max(fps * 6), group_top_n(1), //block_center_x_diff(100), block_center_y_diff(100), //block_area_diff(20000), continuity_max(2.0 * rect_interval), accept_blocks_max_per_frame(1), user_test_group_accept_rect(), //canny_focus(0.3), user_score_1_rate(0.4), histogram_uniformy(0.0), user_score_2_func(nullptr) // dahua 1920x1080,fps=25,dist=3,i=10 precfg_fps(25), precfg_interval(2), precfg_delay(4), copyData(false), get_rect_func(nullptr), group_size_min(1 + precfg_interval), group_size_max(2 * (precfg_fps * precfg_delay) / precfg_interval), frame_count_max(precfg_fps * precfg_delay), group_top_n(1), block_center_x_diff(100), block_center_y_diff(100), block_area_diff(20000), continuity_max(8.0 * precfg_interval), accept_blocks_max_per_frame(1), user_test_group_accept_rect(), canny_focus(0.3), user_score_1_rate(0.4), histogram_uniformy(0.0), user_score_2_func(nullptr) { } }; class PL_BlockGrouping : public PipeLineElem { public: PL_BlockGrouping(); virtual ~PL_BlockGrouping(); virtual bool init(void* args); virtual void finit(); virtual bool pay(const PipeMaterial& pm); virtual bool gain(PipeMaterial& pm); private: static bool pay_breaker_MBFT_YUV(const PipeMaterial* pm, void* args); private: void* internal; }; PipeLineElem* create_PL_BlockGrouping(); #endif