00001 #include "Robots/SeaBeeIII/ColorSegmenterI.H"
00002
00003 #include "Component/ModelParam.H"
00004 #include "Component/ModelOptionDef.H"
00005
00006 #include "Raster/Raster.H"
00007
00008 #ifndef COLORSEGMENTERI_C
00009 #define COLORSEGMENTERI_C
00010
00011
00012 ColorSegmenterI::ColorSegmenterI(OptionManager& mgr,
00013 const std::string& descrName, const std::string& tagName) :
00014 VisionBrainComponentI(mgr, descrName, tagName), itsInit(false),
00015 itsBuoySegmenter(2), itsPipeSegmenter(2)
00016 {
00017
00018 }
00019
00020
00021 ColorSegmenterI::~ColorSegmenterI()
00022 {
00023 }
00024
00025 void ColorSegmenterI::registerTopics()
00026 {
00027 registerPublisher("RetinaMessageTopic");
00028 registerPublisher("BuoyColorSegmentMessageTopic");
00029 registerPublisher("PipeColorSegmentMessageTopic");
00030
00031
00032 registerVisionTopics();
00033 }
00034
00035 void ColorSegmenterI::updateFrame(Image<PixRGB<byte> > img, string cameraId)
00036 {
00037 bool isFwdCamera = false;
00038 if (cameraId == "FwdCamera")
00039 isFwdCamera = true;
00040
00041 updateFrame(img, isFwdCamera);
00042
00043 }
00044
00045 void ColorSegmenterI::updateFrame(Image<PixRGB<byte> > img, bool isFwdCamera)
00046 {
00047
00048
00049 if (img.initialized())
00050 {
00051
00052
00053
00054 if (!itsInit)
00055 {
00056 LINFO("here\n");
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068 itsBuoySegmenter.SIsetHue(352, 22, 0);
00069 itsBuoySegmenter.SIsetSat(55, 42, 0);
00070 itsBuoySegmenter.SIsetVal(128, 128, 0);
00071
00072
00073
00074
00075
00076
00077
00078
00079 itsPipeSegmenter.SIsetHue(22, 10, 0);
00080 itsPipeSegmenter.SIsetSat(55, 30, 0);
00081 itsPipeSegmenter.SIsetVal(128, 128, 0);
00082
00083
00084 itsBuoySegmenter.SIsetFrame(0, 0, img.getWidth(), img.getHeight(),
00085 img.getWidth(), img.getHeight());
00086 itsPipeSegmenter.SIsetFrame(0, 0, img.getWidth(), img.getHeight(),
00087 img.getWidth(), img.getHeight());
00088 itsInit = true;
00089 }
00090
00091 Image<PixRGB<float> > display(img);
00092
00093
00094 itsBuoySegmenter.SIsegment(display);
00095 itsPipeSegmenter.SIsegment(display);
00096
00097
00098 Image<bool> buoyCand = itsBuoySegmenter.SIreturnCandidates();
00099 Image<bool> pipeCand = itsPipeSegmenter.SIreturnCandidates();
00100
00101
00102
00103 Image<PixRGB<byte> > segImgDisp;
00104 segImgDisp.resize(buoyCand.getWidth(), buoyCand.getHeight());
00105
00106 for (int i = 0; i < buoyCand.getWidth(); ++i)
00107 {
00108 for (int j = 0; j < buoyCand.getHeight(); ++j)
00109 {
00110
00111
00112
00113
00114 if (buoyCand.getVal(i, j))
00115 {
00116 segImgDisp.setVal(i, j, PixRGB<byte> (255, 0, 0));
00117 }
00118 else if (pipeCand.getVal(i, j))
00119 {
00120 segImgDisp.setVal(i, j, PixRGB<byte> (255, 127, 0));
00121 }
00122 else
00123 {
00124 segImgDisp.setVal(i, j, PixRGB<byte> (0, 0, 255));
00125 }
00126 }
00127 }
00128
00129 itsOfs->writeRGB(concatLooseX(img, segImgDisp, PixRGB<byte> (0, 0, 0)),
00130 "Color Segmenter Image", FrameInfo("Color Segementer", SRC_POS));
00131
00132
00133
00134
00135 RobotSimEvents::RetinaMessagePtr msg =
00136 new RobotSimEvents::RetinaMessage;
00137 msg->img = Image2Ice(buoyCand);
00138 msg->cameraID = "BuoyColorSegmenter";
00139
00140 this->publish("RetinaMessageTopic", msg);
00141
00142 msg = new RobotSimEvents::RetinaMessage;
00143 msg->img = Image2Ice(pipeCand);
00144 msg->cameraID = "PipeColorSegmenter";
00145
00146 this->publish("RetinaMessageTopic", msg);
00147
00148
00149 itsBuoySegmenter.SIcalcMassCenter();
00150 itsPipeSegmenter.SIcalcMassCenter();
00151
00152
00153 int i = 0;
00154 vector<pair<float, pair<int, int> > > redBlobs(
00155 itsBuoySegmenter.SInumberBlobs());
00156 for (i = 0; i < itsBuoySegmenter.SInumberBlobs(); ++i)
00157 {
00158 redBlobs[i] = pair<float, pair<int, int> > (
00159 itsBuoySegmenter.SIgetMass(i), pair<int, int> (
00160 itsBuoySegmenter.SIgetCenterX(i),
00161 itsBuoySegmenter.SIgetCenterY(i)));
00162
00163
00164
00165
00166 }
00167 vector<pair<float, pair<int, int> > > yellowBlobs(
00168 itsPipeSegmenter.SInumberBlobs());
00169 for (i = 0; i < itsPipeSegmenter.SInumberBlobs(); ++i)
00170 {
00171 yellowBlobs[i] = pair<float, pair<int, int> > (
00172 itsPipeSegmenter.SIgetMass(i), pair<int, int> (
00173 itsPipeSegmenter.SIgetCenterX(i),
00174 itsPipeSegmenter.SIgetCenterY(i)));
00175
00176
00177
00178 }
00179 sort(redBlobs.begin(), redBlobs.end());
00180 sort(yellowBlobs.begin(), yellowBlobs.end());
00181
00182
00183 RobotSimEvents::BuoyColorSegmentMessagePtr msg2;
00184 for (i = itsBuoySegmenter.SInumberBlobs() - 1; i >= 0; --i)
00185 {
00186 msg2 = new RobotSimEvents::BuoyColorSegmentMessage;
00187 msg2->x = float(redBlobs[i].second.first) / float(img.getWidth());
00188 msg2->y = float(redBlobs[i].second.second) / float(img.getHeight());
00189 msg2->size = redBlobs[i].first;
00190
00191 this->publish("BuoyColorSegmentMessageTopic", msg2);
00192 }
00193 RobotSimEvents::PipeColorSegmentMessagePtr msg3;
00194
00195 for (i = itsPipeSegmenter.SInumberBlobs() - 1; i >= 0; --i)
00196 {
00197 msg3 = new RobotSimEvents::PipeColorSegmentMessage;
00198 msg3->x = float(yellowBlobs[i].second.first)
00199 / float(img.getWidth());
00200 msg3->y = float(yellowBlobs[i].second.second)
00201 / float(img.getHeight());
00202 msg3->size = yellowBlobs[i].first;
00203
00204
00205
00206
00207
00208 this->publish("PipeColorSegmentMessageTopic", msg3);
00209 }
00210
00211 }
00212 }
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235 #endif