00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #if !defined(_OUTLET_MODEL_H)
00015 #define _OUTLET_MODEL_H
00016
00017 #include <vector>
00018 #include <map>
00019
00020 #include <cv.h>
00021 #include <ml.h>
00022
00023 #include "outlet_pose_estimation/detail/outlet_tuple.h"
00024
00025 typedef struct
00026 {
00027 CvRect bbox;
00028 float weight;
00029 } outlet_feature_t;
00030
00031 inline CvPoint feature_center(outlet_feature_t feature)
00032 {
00033 return cvPoint(feature.bbox.x + feature.bbox.width/2, feature.bbox.y + feature.bbox.height/2);
00034 }
00035
00036 struct outlet_t
00037 {
00038 CvSeq* outlet;
00039 CvPoint hole1;
00040 CvPoint hole2;
00041 CvPoint ground_hole;
00042 outlet_feature_t feature1;
00043 outlet_feature_t feature2;
00044 CvPoint3D32f coord_hole1;
00045 CvPoint3D32f coord_hole2;
00046 CvPoint3D32f coord_hole_ground;
00047 float weight;
00048 float weight_orient;
00049 bool hole1_detected;
00050 bool hole2_detected;
00051 bool ground_hole_detected;
00052
00053 cv::Point2f hole1f;
00054 cv::Point2f hole2f;
00055 cv::Point2f hole_groundf;
00056 bool is_subpixel;
00057
00058 outlet_t() : is_subpixel(false) {};
00059 };
00060
00061 inline float outlet_size(outlet_t outlet);
00062 CvRect outlet_rect(outlet_t outlet);
00063
00064 #define __max MAX
00065 #define __min MIN
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076 void detect_outlets(IplImage* src, std::vector<outlet_feature_t>& features, std::vector<outlet_t>& outlets,
00077 outlet_tuple_t* outlet_tuple, const char* output_path = 0, const char* filename = 0);
00078
00079 inline void cvRectangle(IplImage* img, CvRect rect, CvScalar color, int thickness)
00080 {
00081 cvRectangle(img, cvPoint(rect.x, rect.y), cvPoint(rect.x + rect.width, rect.y + rect.height),
00082 color, thickness);
00083 }
00084
00085 inline CvRect fit_rect_roi(CvRect rect, CvRect roi)
00086 {
00087 CvRect fit = rect;
00088 fit.x = MAX(fit.x, roi.x);
00089 fit.y = MAX(fit.y, roi.y);
00090 fit.width = MIN(fit.width, roi.x + roi.width - fit.x - 1);
00091 fit.height = MIN(fit.height, roi.y + roi.height - fit.y - 1);
00092 assert(fit.width > 0);
00093 assert(fit.height > 0);
00094 return(fit);
00095 }
00096
00097 inline CvRect fit_rect(CvRect rect, IplImage* img)
00098 {
00099 CvRect roi = cvGetImageROI(img);
00100 return fit_rect_roi(rect, roi);
00101 }
00102
00103 inline CvRect double_rect(CvRect small_rect)
00104 {
00105 return cvRect(small_rect.x - small_rect.width/2, small_rect.y - small_rect.height/2,
00106 small_rect.width*2, small_rect.height*2);
00107 }
00108
00109 inline int is_point_inside_rect(CvRect rect, CvPoint point)
00110 {
00111 if(point.x >= rect.x && point.y >= rect.y &&
00112 point.x <= rect.x + rect.width && point.y <= rect.y + rect.height)
00113 {
00114 return 1;
00115 }
00116 else
00117 {
00118 return 0;
00119 }
00120 }
00121
00122 CvRect getOutletROI(const std::vector<outlet_t>& outlets);
00123
00124 int is_point_incenter_roi(const std::vector<CvRect>& rects, CvPoint point);
00125
00126
00127 void DrawKeypoints(IplImage* img, std::vector<outlet_feature_t> features);
00128
00129 typedef std::map<std::string, std::vector<CvRect> > outlet_roi_t;
00130 CvMat* vector2mat(const std::vector<int>& vec);
00131 void read_outlet_roi(const char* filename, outlet_roi_t& outlet_roi);
00132 void extract_intensity_features(IplImage* grey, const std::vector<outlet_feature_t>& keypts, CvMat** mat,
00133 int equalize_hist = 0,
00134 const std::vector<int>& labels = std::vector<int>(), const char* buf = 0);
00135
00136 void calc_labels(const std::vector<CvRect>& rects, const std::vector<outlet_feature_t>& keypts, std::vector<int>& labels);
00137 void FilterPoints(IplImage* grey, std::vector<outlet_feature_t>& keypts, const CvRTrees* rtrees);
00138 void filter_outlets(IplImage* grey, std::vector<outlet_t>& outlets, CvRTrees* rtrees);
00139
00140
00141
00142
00143 void find_outlet_features(IplImage* src, std::vector<outlet_feature_t>& features, const char* filename);
00144 void find_outlet_features_fast(IplImage* src, std::vector<outlet_feature_t>& features, float hole_contrast,
00145 const char* output_path, const char* filename);
00146
00147
00148
00149 int generate_outlet_samples(IplImage* grey, outlet_t outlet, int count, CvMat** predictors, const char* filename = 0);
00150
00151
00152 void train_outlet_model(const char* path, const char* config_filename,
00153 const char* roi_filename, const char* forest_filename);
00154
00155 void write_pr(const char* pr_filename, const char* image_filename, const outlet_roi_t& outlet_roi,
00156 const std::vector<outlet_t>& outlets);
00157
00158 void filter_negative_samples(const std::vector<CvRect>& rects, std::vector<outlet_feature_t>& keypts, float fraction);
00159 void calc_contrast_factor(IplImage* grey, CvRect rect, float& contrast, float& variation);
00160
00161 void select_central_outlets(std::vector<outlet_t>& outlets, int count);
00162 void select_orient_outlets(CvPoint2D32f orientation, std::vector<outlet_t>& outlets, int count = 0);
00163 int select_orient_outlets_ex(IplImage* grey, std::vector<outlet_t>& outlets, const char* filename = 0);
00164
00165 void draw_outlets(IplImage* temp, const std::vector<outlet_t>& outlets);
00166 void filter_canny(IplImage* grey, std::vector<outlet_feature_t>& features);
00167
00168
00169 int load_homography_map(const char* filename, CvMat** map_matrix);
00170 IplImage* load_match_template_mask(const char* filename);
00171
00172 CvMat* calc_image_homography(IplImage* src);
00173
00174
00175
00176 void filter_outlets_templ_ex(std::vector<outlet_t>& outlets, CvMat* map_matrix, IplImage* mask);
00177 int filter_outlets_templ(std::vector<outlet_t>& outlets, const char* filename);
00178 int filter_outlets_templmatch(IplImage* src, std::vector<outlet_t>& outlets, IplImage* templ, const char* output_path,
00179 const char* filename = 0, CvMat** homography = 0, CvPoint3D32f* origin = 0, CvPoint2D32f* scale = 0);
00180
00181 IplImage* calc_tuple_distance_map(IplImage* tuple_mask);
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194 int calc_outlet_coords(std::vector<outlet_t>& outlets, CvMat* map_matrix, CvPoint3D32f origin, CvPoint2D32f scale,
00195 CvMat* rotation_vector, CvMat* translation_vector, CvMat* inv_map_matrix = 0);
00196
00197 void calc_outlet_coords(std::vector<outlet_t>& outlets, const outlet_template_t& outlet_template,
00198 CvMat* intrinsic_matrix, CvMat* distortion_params);
00199 void calc_outlet_coords_ground(std::vector<outlet_t>& outlets, const outlet_template_t& outlet_template,
00200 CvMat* intrinsic_matrix, CvMat* distortion_params);
00201
00202
00203 void calc_outlet_dist_stat(const std::vector<outlet_t>& outlets, float& mean, float& stddev);
00204 void calc_outlet_tuple_dist_stat(const std::vector<outlet_t>& outlets, float& ground_dist_x1,
00205 float& ground_dist_x2, float& ground_dist_y);
00206 void calc_outlet_coords(CvMat* rotation_vector, CvMat* translation_vector, const std::vector<cv::Point3f>& object_points, std::vector<outlet_t>& outlets);
00207
00208 void filter_features_mask(std::vector<outlet_feature_t>& features, IplImage* mask);
00209 void filter_outlets_mask(std::vector<outlet_t>& outlets, IplImage* mask);
00210 void filter_outlets_size(std::vector<outlet_t>& outlets);
00211
00212 void filter_features_distance_mask(std::vector<outlet_feature_t>& features, IplImage* distance_map);
00213
00214 int find_origin_chessboard(IplImage* src, CvMat* map_matrix, CvPoint3D32f& origin, float bar_length);
00215
00216
00217
00218
00219
00220
00221 void filter_outlets_tuple(std::vector<outlet_t>& outlets, IplImage* tuple_mask, CvPoint2D32f hor_dir);
00222
00223
00224
00225 void get_outlet_coordinates(const outlet_t& outlet, CvPoint3D32f* points);
00226
00227 void move_features(std::vector<outlet_feature_t>& features, CvPoint origin);
00228
00229 void estimateCameraPosition(const std::vector<KeyPointEx>& image_points, const std::vector<cv::Point3f>& object_points,
00230 CvMat* intrinsic_matrix, CvMat* distortion_params, CvMat* rotation_vector, CvMat* translation_vector);
00231
00232 void getImagePoints(const std::vector<outlet_t>& outlets, std::vector<cv::Point2f>& image_points, std::vector<bool>& is_detected);
00233
00234
00235 void findPrecisePowerHoleLocation(IplImage* grey, cv::Point2f center, cv::Point2f dir, cv::Point2f dir_perp, cv::Point2f& hole);
00236 void findPreciseGroundHoleLocation(IplImage* grey, cv::Point2f center, cv::Point2f& hole);
00237 void findPreciseOutletLocations(IplImage* grey, const outlet_template_t& outlet_template, std::vector<outlet_t>& outlets);
00238 void findPreciseOutletLocationsAvg(IplImage* grey, const outlet_template_t& outlet_template, std::vector<outlet_t>& outlets);
00239
00240 void flipOutlet(std::vector<outlet_t>& outlets);
00241
00242 #endif //_OUTLET_MODEL_H