#pragma once #include #include "data_def_api.h" #include "data_def.h" #include "logger.h" #include "tea_detect.h" #include "imstorage_manager.h" using namespace cv; namespace graft_cv{ class CTeaSort{ public: CTeaSort( ConfigParam& ap, img_type dtype, CGcvLogger*pLog = 0 ); ~CTeaSort(); int detect( ImgInfo*, PositionInfo& posinfo, const char* fn = 0); int load_data( ImgInfo*imginfo, const char* fn = 0); int load_model(); void set_image_saver(CImStoreManager** ppis) { m_ppImgSaver = ppis; } private: img_type m_dtype; // data type: tea_grab, tea_cut string m_imgId; string m_dtype_str; Mat m_raw_img; Mat m_raw_gray_img; ConfigParam& m_cp; YoloDrop m_drop_detector; CImStoreManager** m_ppImgSaver; CGcvLogger* m_pLogger; ImgInfo* m_pImginfoRaw; ImgInfo* m_pImginfoDetected; void img_rgb2bgr(cv::Mat&img); int generate_detect_windows(vector&boxes); int detect_impl(cv::Mat& img, vector&drop_regions, vector &droplets_raw); void clear_imginfo(); double calculate_angle(Bbox&b, double& grab_x, double&grab_y); //// --- disused //void calculate_stem_grab_position(Bbox&b, double& grab_x, double&grab_y, double& grab_angle); void calculate_stem_grab_position_opt(Bbox&b, double& grab_x, double&grab_y, double& grab_angle); void calculate_stem_cut_position_opt(Bbox&b, double& grab_x, double&grab_y, double& grab_angle); //thinning void thinningIteration(cv::Mat& img, int iter); void thinning(const cv::Mat& src, cv::Mat& dst); //// --- disused //void distance_thinning(const cv::Mat& src, cv::Mat& dst); void part_thinning(const cv::Mat& src, cv::Mat& dst); //find grab position double get_grab_position(const std::vector& inner_pixels, const cv::Mat& skele_img, cv::Point&vertex, double ref_angle); void calc_bottom_vertex(cv::Point&vertex, double ref_angle, double delta_angle, double radius, cv::Point&bpt0, cv::Point&bpt1); //// --- disused //bool poly_fit_cv(std::vector& key_point, int n, cv::Mat& A); //double calc_fit_y(double x,cv::Mat& A); void line_fit(std::vector& key_point, cv::Vec4f& lines); /** 计算 [-pi,pi]间的两个角间的夹角 */ double intersection_angle(double ref_angle, double angle_to_p3); /** 计算灰度图是否为空(料盘是否为空) */ bool is_empty_feeder(cv::Mat& raw_img, double th=20.0); /** 计算框图中单例概率 */ double singleten_ratio(Bbox& region); /** 计算框图方向系数, 针对抓取 */ double direction_ratio(Bbox& box); /** 计算综合得分,并排序, 针对抓取 */ void calculate_overall_score_grab(std::vector &drops); }; };