examples/featureTracker/culebrillasdisplayer.cpp

00001 /*
00002  *      Copyright (C) 2007, 2008. PARP Research Group.
00003  *      <http://perception.inf.um.es>
00004  *      University of Murcia, Spain.
00005  *
00006  *      This file is part of the QVision library.
00007  *
00008  *      QVision is free software: you can redistribute it and/or modify
00009  *      it under the terms of the GNU Lesser General Public License as
00010  *      published by the Free Software Foundation, version 3 of the License.
00011  *
00012  *      QVision is distributed in the hope that it will be useful,
00013  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015  *      GNU Lesser General Public License for more details.
00016  *
00017  *      You should have received a copy of the GNU Lesser General Public
00018  *      License along with QVision. If not, see <http://www.gnu.org/licenses/>.
00019  */
00020 
00024 
00025 #include <culebrillasdisplayer.h>
00026 
00028 
00029 QList<QPointF> denormalizePoints(const QVImage<uChar> &image, const QList<QPointF> &points)
00030         {
00031         const double rows = image.getRows(), cols = image.getCols(), factor = cols/2;
00032         QList<QPointF> pointFList;
00033         foreach(QPointF point, points)
00034                 pointFList.append(QPointF(cols/2 + point.x()*factor, rows/2 -point.y()*factor));
00035         return pointFList;
00036         }
00037 
00038 QList< QList<QPointF> > denormalizePointLists(const QVImage<uChar> &image, const QList< QList<QPointF> > &pointLists)
00039         {
00040         QList< QList<QPointF> > result;
00041         foreach( const QList<QPointF> pointList, pointLists)
00042                 result.append(denormalizePoints(image, pointList));
00043         return result;
00044         }
00045 
00046 QVImage<uChar,3> pasteImages(const QVImage<uChar,3> &image1, const QVImage<uChar,3> &image2)
00047         {
00048         Q_ASSERT(image1.getRows() == image2.getRows());
00049         Q_ASSERT(image1.getCols() == image2.getCols());
00050 
00051         const uInt rows = image1.getRows(), cols = image1.getCols();
00052         QVImage<uChar,3> result(cols*2, rows);
00053 
00054         Copy(image1, result);
00055         result.setAnchor(cols, 0);
00056         Copy(image2, result);
00057         result.resetROI();
00058         result.resetAnchor();
00059 
00060         return result;
00061         }
00062 
00063 CulebrillasDisplayer::CulebrillasDisplayer(const QString name): QVWorker(name), sumCulebrillas(0), sumMeanCulebrillaSize(0), iterations(0)
00064         {
00065         // Input properties
00066         addProperty< QVImage<uChar,3> >("Input image", inputFlag|outputFlag);
00067         addProperty< CulebrillaContainer >("Culebrillas container", inputFlag);
00068 
00069         // Output properties
00070         addProperty< QVImage<uChar,3> >("Matching image", outputFlag);
00071         addProperty< QList< QList< QPointF > > >("Culebrillas", outputFlag);
00072 
00073         addProperty< QList< QPointF > >("Culebrillas head", outputFlag);
00074         }
00075 
00076 void CulebrillasDisplayer::iterate()
00077         {
00078         iterations++;
00079 
00080         // 0. Read input property values.
00081         const QVImage<uChar,3>  image = getPropertyValue< QVImage<uChar,3> >("Input image");
00082         const CulebrillaContainer culebrillaContainer = getPropertyValue< CulebrillaContainer >("Culebrillas container");
00083         const int rows = image.getRows(), cols = image.getCols();
00084 
00085         timeFlag("Read input property values");
00086 
00087         // 1. Export culebrillas as polylines.
00088         const int lastFrame = culebrillaContainer.getActualFrameNumber();
00089         QList< QList< QPointF > > culebrillas, planarCulebrillasPolylines;
00090         QList< QPointF > culebrillasHead, planarCulebrillasPolylinesHead;
00091 
00092         double accum = 0;
00093         foreach(Culebrilla culebrilla, culebrillaContainer.getCulebrillas())
00094                         {
00095                         QList<QPointF> culebrillaPointList = culebrilla.getPointList();
00096                         accum += culebrillaPointList.size();
00097                         culebrillas.append(culebrillaPointList);
00098                         culebrillasHead.append(culebrilla.getPointAtFrame(lastFrame));
00099                         }
00100 
00101         double totalNumCulebrillas = culebrillas.size(),  meanCulebrillaSize = (totalNumCulebrillas>0)?accum / totalNumCulebrillas:0;
00102 
00103         sumCulebrillas += totalNumCulebrillas;
00104         sumMeanCulebrillaSize += meanCulebrillaSize;
00105 
00106         //std::cout << "Total culebrillas:\t" << totalNumCulebrillas << "\t; mean culebrilla size =\t" << meanCulebrillaSize << std::endl;
00107         std::cout       << "Mean culebrillas:\t" << (totalNumCulebrillas / (double) iterations)
00108                         << "\t; Mean mean culebrilla size =\t" << (meanCulebrillaSize / (double) iterations) << std::endl;
00109         setPropertyValue< QList< QList< QPointF > > >("Culebrillas", culebrillas);
00110         setPropertyValue< QList< QPointF > >("Culebrillas head", culebrillasHead);
00111 
00112 
00113         timeFlag("Export culebrillas as polylines");
00114         }
00115