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
00031
00032
00033
00034
00035
00036 #include "Component/ModelManager.H"
00037
00038 #include "Media/FrameSeries.H"
00039 #include "Transport/FrameIstream.H"
00040 #include "Media/MediaOpts.H"
00041 #include "Raster/GenericFrame.H"
00042
00043 #include "Image/CutPaste.H"
00044 #include "Image/Image.H"
00045 #include "Image/Pixels.H"
00046 #include "Raster/Raster.H"
00047
00048 #include "Image/DrawOps.H"
00049 #include "Image/ColorOps.H"
00050 #include "BeoSub/IsolateColor.H"
00051
00052 #include "GUI/XWinManaged.H"
00053
00054 #include "SeaBee/CrossRecognizer.H"
00055
00056
00057
00058
00059 #define BOOSTBLURFACTOR 90.0
00060 #define FREE_ARG char*
00061
00062 #define FILLBLEED 4
00063 #define INITIAL_TEMPERATURE 30.0
00064 #define FINAL_TEMPERATURE 0.5
00065 #define ALPHA 0.98
00066 #define STEPS_PER_CHANGE 1000
00067
00068 #define BIN_ANGLE 0.588001425
00069
00070 int main(int argc, char* argv[])
00071 {
00072 MYLOGVERB = LOG_INFO;
00073
00074 ModelManager manager("CrossRecognizer Tester");
00075
00076 nub::soft_ref<InputFrameSeries> ifs(new InputFrameSeries(manager));
00077 manager.addSubComponent(ifs);
00078
00079 manager.exportOptions(MC_RECURSE);
00080
00081
00082 if (manager.parseCommandLine(argc, argv,
00083 "[image {*.ppm}]",
00084 0, 1)
00085 == false) return(1);
00086
00087 int w = ifs->getWidth(), h = ifs->getHeight();
00088 std::string dims = convertToString(Dims(w, h));
00089 LINFO("image size: [%dx%d]", w, h);
00090 manager.setOptionValString(&OPT_InputFrameDims, dims);
00091
00092 manager.setModelParamVal("InputFrameDims", Dims(w, h),
00093 MC_RECURSE | MC_IGNORE_MISSING);
00094
00095 manager.start();
00096
00097 bool goforever = true;
00098
00099 rutz::shared_ptr<XWinManaged> dispWin;
00100 dispWin.reset(new XWinManaged(Dims(w*2,h*2), 0, 0, "Cross Recognizer Display"));
00101
00102 rutz::shared_ptr<CrossRecognizer> crossRecognizer(new CrossRecognizer());
00103
00104 Image< PixRGB<byte> > img(w,h, ZEROS);
00105
00106
00107
00108 rutz::shared_ptr<uint> stalePointCount(new uint());
00109 *stalePointCount = 0;
00110 rutz::shared_ptr<float> crossAngle(new float());
00111 rutz::shared_ptr<Point2D<int> > crossCenterPoint(new Point2D<int>(0,0));
00112 uint fNum = 0;
00113
00114 while(goforever)
00115 {
00116 Image< PixRGB<byte> > dispImg(w*2,h*2, ZEROS);
00117 rutz::shared_ptr<Image< PixRGB<byte> > > outputImg(new Image<PixRGB<byte> >(w,h, ZEROS));
00118 rutz::shared_ptr<Image<byte> > orangeIsoImage(new Image<byte>(w,h, ZEROS));
00119
00120 ifs->updateNext(); img = ifs->readRGB();
00121 if(!img.initialized()) {Raster::waitForKey(); break; }
00122
00123 inplacePaste(dispImg, img, Point2D<int>(0,0));
00124
00125
00126 isolateOrange(img, *orangeIsoImage);
00127
00128 inplacePaste(dispImg, toRGB(*orangeIsoImage), Point2D<int>(w,0));
00129
00130
00131 crossRecognizer->getCrossLocation(orangeIsoImage,
00132 outputImg,
00133 CrossRecognizer::HOUGH,
00134 crossCenterPoint,
00135 crossAngle,
00136 stalePointCount);
00137
00138 inplacePaste(dispImg, *outputImg, Point2D<int>(0,h));
00139
00140
00141
00142
00143
00144
00145 Image<PixRGB<byte> > crossOverlayImage = img;
00146
00147 PixRGB <byte> crossColor;
00148
00149 if(*stalePointCount <= 30)
00150 {
00151 crossColor = PixRGB <byte> (0, 255,0);
00152 }
00153 else
00154 {
00155 crossColor = PixRGB <byte> (255, 0 ,0);
00156 }
00157 float tmpAngle = *crossAngle;
00158 Point2D<int> tmpCenterPoint = *crossCenterPoint;
00159 drawCrossOR(crossOverlayImage,
00160 tmpCenterPoint,
00161 crossColor,
00162 20,5, fabs(tmpAngle));
00163
00164
00165 inplacePaste(dispImg, crossOverlayImage, Point2D<int>(w,h));
00166
00167 writeText( dispImg, Point2D<int>(0,0), sformat("Frame: %6d", fNum).c_str(),
00168 PixRGB<byte>(255,0,0));
00169 writeText( dispImg, Point2D<int>(w,0), sformat("Edge Detect and Hough").c_str(),
00170 PixRGB<byte>(255,0,0));
00171 writeText( dispImg, Point2D<int>(0,h), sformat("Identify Cross").c_str(),
00172 PixRGB<byte>(255,0,0));
00173
00174 dispWin->drawImage(dispImg, 0, 0);
00175 fNum++;
00176
00177
00178 Raster::waitForKey();
00179 }
00180
00181
00182 manager.stop();
00183 return 0;
00184 }
00185
00186
00187
00188
00189
00190