@startuml package "TrackerFeature package" #DDDDDD { class TrackerFeatureSet{ -vector<pair<string, Ptr<TrackerFeature> > > features -vector<Mat> responses ... TrackerFeatureSet(); ~TrackerFeatureSet(); -- +extraction(const std::vector<Mat>& images); +selection(); +removeOutliers(); +vector<Mat> response getResponses(); +vector<pair<string TrackerFeatureType, Ptr<TrackerFeature> > > getTrackerFeatures(); +bool addTrackerFeature(string trackerFeatureType); +bool addTrackerFeature(Ptr<TrackerFeature>& feature); -clearResponses(); } class TrackerFeature <<virtual>>{ static Ptr<TrackerFeature> = create(const string& trackerFeatureType); compute(const std::vector<Mat>& images, Mat& response); selection(Mat& response, int npoints); } note bottom: Can be specialized as in table II\nA tracker can use more types of features class TrackerFeatureFeature2D{ -vector<Keypoints> keypoints --- TrackerFeatureFeature2D(string detectorType, string descriptorType); ~TrackerFeatureFeature2D(); --- compute(const std::vector<Mat>& images, Mat& response); selection( Mat& response, int npoints); } class TrackerFeatureHOG{ TrackerFeatureHOG(); ~TrackerFeatureHOG(); --- compute(const std::vector<Mat>& images, Mat& response); selection(Mat& response, int npoints); } TrackerFeatureSet *-- TrackerFeature TrackerFeature <|-- TrackerFeatureHOG TrackerFeature <|-- TrackerFeatureFeature2D note "Per readability and simplicity in this diagram\n there are only two TrackerFeature but you\n can considering the implementation of the other TrackerFeature" as N1 TrackerFeatureHOG .. N1 TrackerFeatureFeature2D .. N1 } @enduml