18 #include <yarp/cv/Cv.h>
19 #include "dispBlobberModule.hpp"
23 using namespace yarp::os;
24 using namespace yarp::sig;
25 using namespace yarp::cv;
28 bool DispBlobberModule::configure(yarp::os::ResourceFinder &rf)
30 moduleName = rf.check(
"name", Value(
"dispBlobber"),
"module name (string)").asString();
32 setName(moduleName.c_str());
34 handlerPortName =
"/";
35 handlerPortName += getName();
36 handlerPortName +=
"/rpc:i";
38 if (!handlerPort.open(handlerPortName)) {
39 fprintf(stdout,
"%s : Unable to open RPC port %s\n", getName().c_str(), handlerPortName.c_str());
44 blobPort =
new DispBlobberPort( moduleName, rf );
53 bool DispBlobberModule::interruptModule()
57 handlerPort.interrupt();
59 blobPort->interrupt();
64 bool DispBlobberModule::close()
68 fprintf(stdout,
"starting the shutdown procedure\n");
72 fprintf(stdout,
"deleting thread\n");
74 fprintf(stdout,
"done deleting thread\n");
79 bool DispBlobberModule::updateModule()
84 bool DispBlobberModule::respond(
const Bottle &command, Bottle &reply)
90 string receivedCmd = command.get(0).asString();
94 if (receivedCmd ==
"margin")
96 bool ok = blobPort->setMargin(command.get(1).asInt32());
98 responseCode = Vocab32::encode(
"ack");
101 fprintf(stdout,
"Margin for ROI cannot be set. \n");
102 responseCode = Vocab32::encode(
"nack");
104 reply.addVocab32(responseCode);
107 if (receivedCmd ==
"thresh")
109 bool ok = blobPort->setThresh(command.get(1).asInt32());
111 responseCode = Vocab32::encode(
"ack");
113 fprintf(stdout,
"Threshold cannot be set. \n");
114 responseCode = Vocab32::encode(
"nack");
116 reply.addVocab32(responseCode);
119 else if (receivedCmd ==
"help")
121 reply.addVocab32(
"many");
123 responseCode = Vocab32::encode(
"ack");
125 reply.addString(
"Available commands are:");
126 reply.addString(
"margin (int) - sets the margin (in pixels) that the ROI keeps around the closest blob.");
127 reply.addString(
"thresh (int) - sets lower luminosity limit (0-255) that is considered. Objects with luminosity lower than the boundary wont be considered.");
128 reply.addString(
"help - produces this help.");
129 reply.addString(
"quit - closes the module.");
131 reply.addVocab32(responseCode);
134 else if (receivedCmd ==
"quit")
136 responseCode = Vocab32::encode(
"ack");
138 reply.addVocab32(responseCode);
144 reply.addString(
"Invalid command, type [help] for a list of accepted commands.");
149 double DispBlobberModule::getPeriod()
154 DispBlobberPort::DispBlobberPort(
const string &_moduleName, ResourceFinder &rf)
157 this->moduleName = _moduleName;
161 fprintf(stdout,
"Parsing parameters...\n");
163 int imH = moduleRF->check(
"imH", Value(240)).asInt32();
164 int imW = moduleRF->check(
"imW", Value(320)).asInt32();
166 int bufferSize = moduleRF->check(
"bufferSize", Value(1)).asInt32();
168 int margin = moduleRF->check(
"margin", Value(20)).asInt32();
171 if (rf.check(
"cropSize"))
173 Value &vCropSize=rf.find(
"cropSize");
175 if (!vCropSize.isString())
177 cropSize = vCropSize.asInt32();
183 int backgroundThresh = moduleRF->check(
"backgroundThresh", Value(30)).asInt32();
185 int minBlobSize = moduleRF->check(
"minBlobSize", Value(300)).asInt32();
186 int maxBlobSize = moduleRF->check(
"maxBlobSize", Value(2000)).asInt32();
188 int gaussSize = moduleRF->check(
"gaussSize", Value(5)).asInt32();
190 int imageThreshRatioLow = moduleRF->check(
"imageThreshRatioLow", Value(10)).asInt32();
191 int imageThreshRatioHigh = moduleRF->check(
"imageThreshRatioHigh", Value(20)).asInt32();
193 blobExtractor = NULL;
195 blobExtractor =
new dispBlobber(imH, imW, bufferSize,
198 minBlobSize, maxBlobSize, gaussSize,
199 imageThreshRatioLow, imageThreshRatioHigh);
202 bool DispBlobberPort::open()
207 fprintf(stdout,
"Opening ports...\n");
211 imgInPortName =
"/" + moduleName +
"/img:i";
212 BufferedPort<ImageOf<PixelBgr> >::open( imgInPortName );
216 blobsOutPortName =
"/" + moduleName +
"/blobs/left:o";
217 blobsOutPort.open(blobsOutPortName);
219 blobsOutPortRightName =
"/" + moduleName +
"/blobs/right:o";
220 blobsOutPortRight.open(blobsOutPortRightName);
222 points3dOutPortName =
"/" + moduleName +
"/points3d:o";;
223 points3dOutPort.open(points3dOutPortName);
225 roiOutPortName =
"/" + moduleName +
"/roi/left:o";
226 roiOutPort.open(roiOutPortName);
228 roiOutPortRightName =
"/" + moduleName +
"/roi/right:o";
229 roiOutPortRight.open(roiOutPortRightName);
231 optOutPortName =
"/" + moduleName +
"/opt:o";
232 optOutPort.open(optOutPortName);
234 cropOutPortName =
"/" + moduleName +
"/crop:o";
235 cropOutPort.open(cropOutPortName);
237 sfmRpcPort.open(
"/" + moduleName +
"/sfm/rpc");
242 void DispBlobberPort::close()
244 fprintf(stdout,
"Closing ports...\n");
246 blobsOutPort.close();
247 blobsOutPortRight.close();
248 points3dOutPort.close();
251 roiOutPortRight.close();
258 BufferedPort<ImageOf<PixelBgr> >::close();
260 fprintf(stdout,
"Finished closing ports...\n");
263 void DispBlobberPort::interrupt()
266 fprintf(stdout,
"Attempting to interrupt ports...\n");
268 blobsOutPort.interrupt();
269 blobsOutPortRight.interrupt();
270 points3dOutPort.interrupt();
272 roiOutPort.interrupt();
273 roiOutPortRight.interrupt();
275 optOutPort.interrupt();
276 cropOutPort.interrupt();
278 sfmRpcPort.interrupt();
280 BufferedPort<ImageOf<PixelBgr> >::interrupt();
282 fprintf(stdout,
"Finished interrupting ports...\n");
285 bool DispBlobberPort::setThresh(
int low)
287 return blobExtractor->setThresh(low);
291 bool DispBlobberPort::setMargin(
int mrg)
293 return blobExtractor->setMargin(mrg);
296 void DispBlobberPort::onRead(ImageOf<PixelBgr> &input)
298 lock_guard<mutex> lg(mtx);
303 BufferedPort<ImageOf<PixelBgr> >::getEnvelope(stamp);
307 std::vector<int> centroid;
308 std::vector<int> roi;
313 cv::Mat inputMat=toCvMat(input);
314 imagesMatBuffer.push_back(inputMat);
316 double blobSize = blobExtractor->extractBlob(imagesMatBuffer, roi, centroid, blobMat);
321 if (optOutPort.getOutputCount()>0)
323 yarp::sig::ImageOf<yarp::sig::PixelMono> &blobImage = optOutPort.prepare();
324 blobImage.resize(blobMat.cols, blobMat.rows);
326 cv::Mat blobImageMat=toCvMat(blobImage);
327 blobMat.copyTo(blobImageMat);
329 optOutPort.setEnvelope(stamp);
336 int dx = ( (cropSize>0) ? cropSize : (roi[2]-roi[0]) );
337 int dy = ( (cropSize>0) ? cropSize : (roi[3]-roi[1]) );
342 int tlx = std::max(x-dx2,0);
343 int tly = std::max(y-dy2,0);
344 int brx = std::min(x+dx2,blobMat.cols-1);
345 int bry = std::min(y+dy2,blobMat.rows-1);
347 if (cropOutPort.getOutputCount()>0)
349 cv::Rect roiRegion = cv::Rect(cv::Point( tlx, tly ), cv::Point( brx, bry ));
351 yarp::sig::ImageOf<yarp::sig::PixelBgr> &cropImage = cropOutPort.prepare();
352 cropImage.resize(roiRegion.width, roiRegion.height);
354 cv::Mat cropImageMat=toCvMat(cropImage);
355 imagesMatBuffer.back()(roiRegion).copyTo(cropImageMat);
357 cropOutPort.setEnvelope(stamp);
361 if (roiOutPort.getOutputCount()>0)
365 Bottle &roiBottle = roisBottle.addList();
366 roiBottle.addInt32(tlx);
367 roiBottle.addInt32(tly);
368 roiBottle.addInt32(brx);
369 roiBottle.addInt32(bry);
371 roiOutPort.prepare() = roisBottle;
373 roiOutPort.setEnvelope(stamp);
377 if (blobsOutPort.getOutputCount()>0)
381 Bottle &blobBottle = blobsBottle.addList();
382 blobBottle.addInt32(centroid[0]);
383 blobBottle.addInt32(centroid[1]);
384 blobBottle.addInt32((
int)(blobSize+0.5f));
386 blobsOutPort.prepare() = blobsBottle;
388 blobsOutPort.setEnvelope(stamp);
389 blobsOutPort.write();
392 if (roiOutPortRight.getOutputCount()>0)
394 Bottle cmd_sfm, reply_sfm;
396 cmd_sfm.addInt32(tlx);
397 cmd_sfm.addInt32(tly);
398 sfmRpcPort.write(cmd_sfm,reply_sfm);
401 Bottle &roiBottle = roisBottle.addList();
403 if (reply_sfm.size()>0)
405 double tlX = reply_sfm.get(0).asFloat64();
406 double tlY = reply_sfm.get(1).asFloat64();
407 double tlZ = reply_sfm.get(2).asFloat64();
409 if (!(tlX==0 && tlY==0 && tlZ==0))
411 int tlur = reply_sfm.get(3).asInt32();
412 int tlvr = reply_sfm.get(4).asInt32();
414 roiBottle.addInt32(tlur);
415 roiBottle.addInt32(tlvr);
422 cmd_sfm.addInt32(brx);
423 cmd_sfm.addInt32(bry);
424 sfmRpcPort.write(cmd_sfm,reply_sfm);
426 if (reply_sfm.size()>0)
428 double brX = reply_sfm.get(0).asFloat64();
429 double brY = reply_sfm.get(1).asFloat64();
430 double brZ = reply_sfm.get(2).asFloat64();
432 if (!(brX==0 && brY==0 && brZ==0))
434 int brur = reply_sfm.get(3).asInt32();
435 int brvr = reply_sfm.get(4).asInt32();
437 roiBottle.addInt32(brur);
438 roiBottle.addInt32(brvr);
442 if (roiBottle.size()>0)
444 roiOutPortRight.prepare() = roisBottle;
445 roiOutPortRight.setEnvelope(stamp);
446 roiOutPortRight.write();
451 if (blobsOutPortRight.getOutputCount()>0 || points3dOutPort.getOutputCount()>0)
453 Bottle cmd_sfm, reply_sfm;
455 cmd_sfm.addInt32(centroid[0]);
456 cmd_sfm.addInt32(centroid[1]);
457 sfmRpcPort.write(cmd_sfm,reply_sfm);
459 if (reply_sfm.size()>0)
461 double X = reply_sfm.get(0).asFloat64();
462 double Y = reply_sfm.get(1).asFloat64();
463 double Z = reply_sfm.get(2).asFloat64();
465 if (points3dOutPort.getOutputCount()>0)
467 Bottle points3dBottle;
468 Bottle &point3dBottle = points3dBottle.addList();
470 point3dBottle.addFloat64(X);
471 point3dBottle.addFloat64(Y);
472 point3dBottle.addFloat64(Z);
474 points3dOutPort.prepare() = points3dBottle;
475 points3dOutPort.setEnvelope(stamp);
476 points3dOutPort.write();
479 if (blobsOutPort.getOutputCount()>0)
481 if (!(X==0.0 && Y==0.0 && Z==0.0))
483 int ur = reply_sfm.get(3).asInt32();
484 int vr = reply_sfm.get(4).asInt32();
487 Bottle &blobBottle = blobsBottle.addList();
489 blobBottle.addInt32(ur);
490 blobBottle.addInt32(vr);
492 blobsOutPortRight.prepare() = blobsBottle;
493 blobsOutPortRight.setEnvelope(stamp);
494 blobsOutPortRight.write();
502 imagesMatBuffer.erase(imagesMatBuffer.begin());