//cut point recognization for rootstock plant #pragma once #include #include #include "data_def_api.h" #include "data_def.h" #include "logger.h" #include "imstorage_manager.h" //using namespace cv; namespace graft_cv{ class CRootStockCutPoint{ public: CRootStockCutPoint(ConfigParam&c,CGcvLogger*pLog=0); ~CRootStockCutPoint(); int up_point_detect(//上切割点,切前识别 ImgInfo*, cv::Mat&, PositionInfo& posinfo, map& img_cache ); //int up_point_reid( // 上切割点,切后重识别 // ImgInfo*, // Mat&, // double edge_length, // PositionInfo& posinfo // ); void set_image_saver(CImStoreManager** ppis){m_ppImgSaver=ppis;} private: cv::Mat m_binImg;// binary image cv::Mat m_grayImg;// gray image cv::Mat m_edgeImg; string m_imgId; CImStoreManager** m_ppImgSaver; //返回图片,用于调试 ImgInfo* m_pImginfoBinFork;//fork-y, right-x ImgInfo* m_pImgCorners;//corners, reference-point, candidate box ImgInfo* m_pImgCutPoint;//reference-point, cutpoint //global configure parameters ConfigParam& m_cparam; CGcvLogger * m_pLogger; // image segment void img_segment(cv::Mat&); // get_optimal_corner() // return 0--success, 1--error int get_optimal_corner( int ref_x, int ref_y, std::vector& corners, int stem_dia, double cand_corner_box_width_ratio, double cand_corner_box_xoffset_ratio, double opt_corner_xoffset_ratio, double opt_corner_yoffset_ratio, double corner_mask_radius_ratio, cv::Point2f& cut_pt); void get_default_cutpoint( int fork_cent_x, int fork_cent_y, int fork_stem_dia, cv::Point2f& cut_pt); void clear_imginfo(); /// pre-cut calculationo //# 通过砧木切前切割点识别结果(切割点)、二值图像,茎根y值,刀角度 //# 输出切割点到根部的边缘曲线长度 double get_cut_edge_length( cv::Mat& bin_img, cv::Mat& edge_img, gcv_point& start_pt, //up cut point gcv_point& lower_cut_pt,//output gcv_point& root_pt,//output double cut_angle, int y_max, int stem_dia, clock_t t0 ); void find_lower_cut_point( cv::Mat& bin_img, gcv_point&start_pt, gcv_point&end_pt,//output double cut_angle, int stem_dia); double calculate_edge_length( cv::Mat& edge_img, gcv_point&lower_cut_pt, gcv_point&root_pt,//output int y_max, clock_t t0 ); //corner evluation void corner_magnificence( const vector& cand_pts, int stem_dia, double corner_mask_radius_ratio, vector& scores ); //functions for reid int get_root_point_reid( int x0, int x1, int stem_end_y, bool is_right //是否右侧根部点, true-右侧,false-左侧 ); void find_upper_cut_point_reid( cv::Mat& edge_img, gcv_point&start_pt, gcv_point&end_pt,//output double curve_length ); void get_stem_root_y( vector&hist_row, double rs_stem_dia_min, int &stem_end_y); }; };