SaliencyModuleI.C
00001 #include "Robots/SeaBeeIII/SaliencyModuleI.H"
00002 #include "Robots/RobotBrain/RobotBrainComponent.H"
00003 #include "Component/ModelParam.H"
00004 #include "Component/ModelOptionDef.H"
00005 #include "Image/MathOps.H"
00006
00007 #ifndef SALIENCYMODULEI_C
00008 #define SALIENCYMODULEI_C
00009
00010 const ModelOptionCateg MOC_SaliencyModule = {
00011 MOC_SORTPRI_3, "SeaBee Saliency Computer Related Options"
00012 };
00013
00014 const ModelOptionDef OPT_ImageDescr =
00015 { MODOPT_ARG(std::string), "ImageDescr", &MOC_SaliencyModule, OPTEXP_CORE,
00016 "Description of the image on which we are computing saliency.\n"
00017 "(Generally, use Camera0, Camera1, etc...)",
00018 "image-descr", '\0', "<string>", "Camera0" };
00019
00020
00021
00022 SaliencyModuleI::SaliencyModuleI(OptionManager& mgr,
00023 const std::string& descrName, const std::string& tagName) :
00024 VisionBrainComponentI(mgr, descrName, tagName),
00025 itsEvc(new EnvVisualCortex(mgr)),
00026 itsImageDescr(&OPT_ImageDescr, this, 0),
00027 itsRunning(true)
00028 {
00029
00030 addSubComponent(itsEvc);
00031 }
00032
00033
00034 void SaliencyModuleI::registerTopics()
00035 {
00036 LINFO("Registering Saliency Point Message");
00037 this->registerPublisher("SalientPointMessageTopic");
00038 registerVisionTopics();
00039 }
00040
00041
00042 void SaliencyModuleI::updateFrame(Image<PixRGB<byte> > img, string cameraId)
00043 {
00044 bool isFwdCamera = false;
00045 if(cameraId == "FwdCamera")
00046 isFwdCamera = true;
00047
00048 updateFrame(img, isFwdCamera);
00049
00050 }
00051
00052
00053 void SaliencyModuleI::updateFrame(Image<PixRGB<byte> > img, bool isFwdCamera)
00054 {
00055 if(itsRunning)
00056 {
00057 if(img.initialized())
00058 {
00059
00060 itsEvc->input(img);
00061
00062 Image<byte> vcxMap = itsEvc->getVCXmap();
00063 Point2D<int> pt;
00064 byte saliency;
00065 findMax(vcxMap, pt, saliency);
00066 pt.i = pt.i << itsEvc->getMapLevel();
00067 pt.j = pt.j << itsEvc->getMapLevel();
00068
00069 Point2D<int> imgCenter = Point2D<int>(img.getWidth(),img.getHeight());
00070 Point2D<int> err = pt - imgCenter;
00071
00072 if(!itsOfs->isVoid())
00073 {
00074 drawCircle(img,pt,5,PixRGB<byte>(0,0,255));
00075 itsOfs->writeRGB(img, "Saliency Module Image",
00076 FrameInfo("Saliency Module Image", SRC_POS));
00077
00078 itsOfs->updateNext();
00079 }
00080
00081 RobotSimEvents::SalientPointMessagePtr msg = new RobotSimEvents::SalientPointMessage;
00082 msg->x = float(pt.i)/float(img.getWidth());
00083 msg->y = float(pt.j)/float(img.getHeight());
00084 msg->saliency = saliency;
00085 msg->imageDescr = itsImageDescr.getVal();
00086
00087 LINFO("Calculated Saliency");
00088 this->publish("SalientPointMessageTopic", msg);
00089
00090 }
00091 else
00092 {
00093 LERROR("Image Not Initialized!");
00094 }
00095
00096 }
00097 }
00098
00099 #endif
00100