123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- #pragma once
- #include <opencv.hpp>
- #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;
- RetinaDrop 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<Rect>&boxes);
- int detect_impl(cv::Mat& img, vector<Rect>&drop_regions, vector<Bbox> &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<cv::Point2f>& 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<cv::Point>& key_point, int n, cv::Mat& A);
- //double calc_fit_y(double x,cv::Mat& A);
- void line_fit(std::vector<cv::Point2f>& 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<Bbox> &drops);
- };
- };
|