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 "Image/OpenCVUtil.H"
00037 #include "BeoSub/BeoSubBin.H"
00038
00039 #include "Component/ModelManager.H"
00040
00041 #include "Media/FrameSeries.H"
00042 #include "Transport/FrameIstream.H"
00043 #include "Media/MediaOpts.H"
00044
00045 #include "Image/CutPaste.H"
00046 #include "Image/Image.H"
00047 #include "Image/Pixels.H"
00048 #include "Image/ColorOps.H"
00049 #include "Raster/Raster.H"
00050 #include "Raster/GenericFrame.H"
00051 #include "Devices/DeviceOpts.H"
00052
00053 #include "GUI/XWinManaged.H"
00054
00055 #include "Util/Timer.H"
00056 #include "Image/DrawOps.H"
00057 #include "Image/ShapeOps.H"
00058
00059 int main(int argc, char* argv[])
00060 {
00061
00062 MYLOGVERB = LOG_INFO;
00063
00064 ModelManager manager("ComplexObject Tester");
00065
00066 nub::soft_ref<InputFrameSeries> ifs(new InputFrameSeries(manager));
00067 manager.addSubComponent(ifs);
00068
00069 manager.exportOptions(MC_RECURSE);
00070
00071
00072 manager.setOptionValString(&OPT_FrameGrabberMode, "YUYV");
00073
00074 manager.setOptionValString(&OPT_FrameGrabberByteSwap, "no");
00075 manager.setOptionValString(&OPT_FrameGrabberFPS, "30");
00076
00077
00078 if (manager.parseCommandLine(argc, argv,
00079 "[image {*.ppm}]",
00080 0, 1)
00081 == false) return(1);
00082
00083
00084
00085 std::string infilename;
00086 bool hasCompIma = false;
00087 Image<PixRGB<byte> > compIma;
00088 if(manager.numExtraArgs() > 0)
00089 {
00090 infilename = manager.getExtraArgAs<std::string>(0);
00091 compIma = Raster::ReadRGB(infilename);
00092 hasCompIma = true;
00093 }
00094
00095 uint w = 320, h = 240;
00096 std::string dims = convertToString(Dims(w, h));
00097 LDEBUG("image size: [%dx%d]", w, h);
00098 manager.setOptionValString(&OPT_InputFrameDims, dims);
00099
00100 manager.setModelParamVal("InputFrameDims", Dims(w, h),
00101 MC_RECURSE | MC_IGNORE_MISSING);
00102
00103 manager.start();
00104 bool goforever = true;
00105
00106
00107 Image< PixRGB<byte> > cameraImage;
00108 Image< PixRGB<byte> > outputImage;
00109
00110 rutz::shared_ptr<BeoSubBin> binRecognizer(new BeoSubBin());
00111
00112
00113 if(!hasCompIma)
00114 compIma.resize(w,h,NO_INIT);
00115
00116 int fNum = 0;
00117
00118
00119
00120 rutz::shared_ptr<XWinManaged> itsWin;
00121 itsWin.reset(new XWinManaged(Dims(w*2,h*2),0, 0, "Bin Detection Output"));
00122
00123 Point2D<int> centerOfMass;
00124 std::vector<Point2D<int> > avgCenter;
00125
00126 while(goforever)
00127 {
00128
00129
00130 const FrameState is = ifs->updateNext();
00131
00132 if(is == FRAME_COMPLETE)
00133 break;
00134
00135 GenericFrame input = ifs->readFrame();
00136 if(!input.initialized()) { Raster::waitForKey(); break; }
00137
00138 cameraImage = rescale(input.asRgb(), w, h);
00139
00140 Timer tim(1000000);
00141 Image<PixRGB<byte> > dispImage(w*2,h*2,NO_INIT);
00142
00143 inplacePaste(dispImage, cameraImage, Point2D<int>(0,0));
00144
00145
00146
00147
00148 Image<PixRGB<byte> > preHough(w, h, NO_INIT);
00149 Image<PixRGB<byte> > houghImage(w,h,NO_INIT);
00150 Image<PixRGB<byte> > blobImage(w, h, NO_INIT);
00151 Image< PixRGB<byte> > intersectImage(w, h, ZEROS);
00152
00153 std::vector<LineSegment2D> bottomLines = binRecognizer->getHoughLines(cameraImage, intersectImage, houghImage);
00154
00155
00156 float mass = binRecognizer->getBinSceneMass(cameraImage, blobImage, centerOfMass);
00157 drawCircle(blobImage, centerOfMass, 5, PixRGB<byte>(255, 0, 0));
00158
00159
00160
00161 std::vector<LineSegment2D> test;
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171 binRecognizer->pruneLines(bottomLines, bottomLines, &preHough);
00172
00173
00174
00175
00176 for(uint i = 0; i < binRecognizer->binAngles.size(); i++) {
00177
00178 drawCircle(intersectImage, binRecognizer->binAngles[i].pos, 5, PixRGB<byte>(0, 255, 0));
00179 }
00180
00181
00182
00183 if(binRecognizer->binAngles.size() > 0 && mass > 0) {
00184 binRecognizer->getWeightedBinMass(binRecognizer->binAngles, centerOfMass, false, &intersectImage);
00185 drawCircle(intersectImage, centerOfMass, 5, PixRGB<byte>(255, 0, 0));
00186 avgCenter.push_back(centerOfMass);
00187 }
00188 else if(binRecognizer->binAngles.size() <= 0 && mass > 0) {
00189 drawCircle(intersectImage, centerOfMass, 5, PixRGB<byte>(255, 0, 0));
00190 avgCenter.push_back(centerOfMass);
00191 }
00192 else if(binRecognizer->binAngles.size() > 0 && mass <= 0) {
00193 binRecognizer->getBinCenter(binRecognizer->binAngles, centerOfMass);
00194 drawCircle(intersectImage, centerOfMass, 5, PixRGB<byte>(255, 0, 0));
00195 }
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222 inplacePaste(dispImage, preHough, Point2D<int>(w,0));
00223 inplacePaste(dispImage, blobImage, Point2D<int>(0, h));
00224 inplacePaste(dispImage, intersectImage, Point2D<int>(w,h));
00225
00226
00227 writeText( dispImage, Point2D<int>(0,0), sformat("Frame: %6d", fNum).c_str(),
00228 PixRGB<byte>(255,0,0));
00229 writeText( dispImage, Point2D<int>(0,h), sformat("Center of Mass: %f", mass).c_str(),
00230 PixRGB<byte>(255,0,0));
00231 writeText( dispImage, Point2D<int>(w,0), sformat("Hough Lines").c_str(),
00232 PixRGB<byte>(255,0,0));
00233 writeText( dispImage, Point2D<int>(w,h), sformat("Center of Bin").c_str(),
00234 PixRGB<byte>(255,0,0));
00235
00236 itsWin->drawImage(dispImage, 0, 0);
00237 fNum++;
00238
00239
00240 Raster::waitForKey();
00241 }
00242
00243
00244 manager.stop();
00245 return 0;
00246 }
00247
00248
00249
00250
00251
00252