00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef SEGMENTATION_INTERFACE
00031 #define SEGMENTATION_INTERFACE
00032
00033 #include "object_segmentation_gui/ObjectSegmentationGuiAction.h"
00034 #include "object_segmentation_gui/utils.h"
00035
00036 #include "active_realtime_segmentation/fgbgsegment.h"
00037 #include "active_realtime_segmentation/pyra/tpimage.h"
00038
00039 #include <sensor_msgs/Image.h>
00040
00041 #include <boost/thread/mutex.hpp>
00042 #include <boost/thread/thread.hpp>
00043 #include <boost/thread/condition_variable.hpp>
00044 #include <deque>
00045
00046 namespace object_segmentation_gui {
00047
00048 typedef geometry_msgs::Point32 Point;
00049
00050 class ObjectSegmenter
00051 {
00052 public:
00053
00054 enum ActionType{PAUSE, RESET, CLICK, REGION, STOP, GRADCHANGE};
00055
00056 struct Box2D
00057 {
00058 Point p_tl_;
00059 Point p_br_;
00060 };
00061
00062 struct Action
00063 {
00064 ActionType type_;
00065 Box2D box_;
00066
00067
00068 bool with_colors_;
00069 bool with_color_holes_;
00070 bool uniform_;
00071 bool with_disparities_;
00072 bool with_surface_;
00073
00074 float grad_weight_;
00075
00076 };
00077
00078 ObjectSegmenter( float grad_weight, int n_iter,
00079 bool use_gpu, float w_size = 0.20f,
00080 float b_size = 0.20f);
00081 ~ObjectSegmenter();
00082
00083 void setNewData( const sensor_msgs::Image &image_,
00084 const stereo_msgs::DisparityImage &disparity_);
00085
00086 void queueAction( const Action &action);
00087
00088 bool getCurrentResult( sensor_msgs::Image &image);
00089 void getCurrentSurface(float &alpha, float &beta, float &gamma);
00090
00091 void getCurrentSegmFlags( bool &with_colors,
00092 bool &with_color_holes_,
00093 bool &uniform_,
00094 bool &with_disparities_,
00095 bool &with_surface_ );
00096
00097 void setCurrentSegmFlags( bool with_colors,
00098 bool with_color_holes,
00099 bool uniform,
00100 bool with_disparities,
00101 bool with_surface );
00102
00103 protected:
00104
00105 private:
00106
00107
00108 void doSegment();
00109
00110 void stopThread();
00111
00112 void setCurrentResult();
00113 bool dequeueAction( Action &action);
00114 void clearQueue();
00115
00116 void waitForAction();
00117
00118 void pause();
00119
00120
00121 template <typename Callable>
00122 void startThread( Callable f );
00123
00124
00125
00126
00127 void fillInitMask( Image<uint8_t> &init_mask, int start_x, int start_y, int stop_x, int stop_y);
00128
00129
00130 void fillImage( sensor_msgs::Image &image, const Image<uint8_t> &segm_mask);
00131
00132 bool validResult( const Image<uint8_t> &segm_mask);
00133
00134 int w_;
00135 int h_;
00136 int grad_weight_;
00137 int drange_;
00138
00139 float window_size_;
00140 float ball_size_;
00141
00142 bool use_gpu_;
00143 int n_iter_;
00144
00145 bool init_;
00146
00147 int num_fg_hypos_;
00148
00149 FgBgSegment *fgbgsegment;
00150
00151
00152 Image<uint8_t> gpu_image;
00153 Image<float> gpu_disparities;
00154
00155
00156 Image<uint8_t> init_mask;
00157
00158
00159 Image<uint8_t> segm_mask;
00160 float alpha_, beta_, gamma_;
00161
00162
00163 std::deque<Action> action_queue_;
00164
00165 boost::thread* thread_;
00166 boost::mutex queue_mutex_;
00167 boost::mutex image_mutex_;
00168
00169 boost::condition_variable cond_var_;
00170
00171 };
00172 }
00173
00174 #endif // SEGMENTATION_INTERFACE