00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00044 #include <stdio.h>
00045 #include <stdlib.h>
00046 #include <iostream>
00047 #include <QDebug>
00048
00049 #include <qvdta.h>
00050 #include <qvip.h>
00051
00052 #include <QVApplication>
00053 #include <QVMPlayerCamera>
00054 #include <QVDefaultGUI>
00055 #include <QVImageCanvas>
00056 #include <QVPolyline>
00057 #include <QVHarrisPointDetector>
00058 #include <QVCannyEdgeDetector>
00059 #include <QVMSERDetector>
00060 #include <QVNumericPlot>
00061 #include <QVHistogramPlot>
00062
00063 #ifndef DOXYGEN_IGNORE_THIS
00064
00065 class MyWorker: public QVWorker
00066 {
00067 public:
00068 MyWorker(QString name): QVWorker(name)
00069 {
00070 addProperty< QVImage<uChar,1> >("Input image", inputFlag|outputFlag);
00071 addProperty< QVImage<uChar,1> >("Output image", outputFlag);
00072 addProperty<int>("Max pixel", outputFlag);
00073 addProperty<int>("Min pixel", outputFlag);
00074 addProperty<QList<double> >("MinMaxList", outputFlag);
00075 addProperty<QList<double> >("FirstRow", outputFlag);
00076 }
00077
00078 void iterate()
00079 {
00080 QVImage<uChar> image = getPropertyValue< QVImage<uChar,1> >("Input image");
00081
00082 uchar min, max;
00083 Max(image, max);
00084 Min(image, min);
00085 setPropertyValue<int>("Max pixel", max);
00086 setPropertyValue<int>("Min pixel", min);
00087 QList<double> minmaxlist;
00088 minmaxlist << min << max;
00089 setPropertyValue<QList<double> >("MinMaxList", minmaxlist);
00090
00091 QList<double> firstrow;
00092 for (uint i = 0; i < 256 ; i++) firstrow << image(i, 0);
00093 setPropertyValue<QList<double> >("FirstRow", firstrow);
00094
00095 QVImage<uChar> dest(image);
00096
00097 AddC(image, 10, dest);
00098
00099 setPropertyValue< QVImage<uChar,1> >("Output image", dest);
00100 }
00101 };
00102
00103 class ContourExtractorWorker: public QVWorker
00104 {
00105 public:
00106 ContourExtractorWorker(QString name): QVWorker(name)
00107 {
00108 addProperty<int>("Threshold", inputFlag, 128, "Threshold for a point to count as pertaining to a region", 0, 255);
00109 addProperty<int>("MinAreaIPE", inputFlag, 0, "Minimal area to keep points in the IPE algorithm", 0, 50);
00110 addProperty< QVImage<uChar,3> >("Input image", inputFlag|outputFlag);
00111 addProperty< QList<QVPolyline> >("Internal contours", outputFlag);
00112 addProperty< QList<QVPolyline> >("External contours", outputFlag);
00113 }
00114
00115 void iterate()
00116 {
00117
00118 const QVImage<uChar,1> image = getPropertyValue< QVImage<uChar,3> >("Input image");
00119 const uInt rows = image.getRows(), cols = image.getCols(),
00120 threshold = getPropertyValue< int >("Threshold"),
00121 minAreaIPE = getPropertyValue< int >("MinAreaIPE");
00122
00123 timeFlag("Read input parameters");
00124
00125
00126 const QList<QVPolyline> contours = getConnectedSetBorderContoursThreshold(image, threshold);
00127 timeFlag("Get contours from image");
00128
00129
00130 QList<QVPolyline> ipeContours;
00131
00132 foreach(QVPolyline polyline, contours)
00133 {
00134 QVPolyline ipePolyline;
00135 IterativePointElimination(polyline, ipePolyline, minAreaIPE);
00136 if (ipePolyline.size() > 0)
00137 ipeContours.append(ipePolyline);
00138 }
00139
00140 timeFlag("IPE filtering");
00141
00142
00143 QList<QVPolyline> internalContours, externalContours;
00144
00145 foreach(QVPolyline polyline, ipeContours)
00146 if (polyline.direction)
00147 internalContours.append(polyline);
00148 else
00149 externalContours.append(polyline);
00150
00151 setPropertyValue< QList< QVPolyline> >("Internal contours",internalContours);
00152 setPropertyValue< QList< QVPolyline> >("External contours",externalContours);
00153 timeFlag("Computed output contours");
00154 }
00155 };
00156
00157 int main(int argc, char *argv[])
00158 {
00159 QVApplication app(argc, argv,
00160 "Example program for QVision library. Obtains several features from input video frames."
00161 );
00162
00163 ContourExtractorWorker contoursWorker("Contours Extractor Worker");
00164 QVCannyEdgeDetector cannyWorker("Canny Operator Worker");
00165 QVHarrisPointDetector cornersWorker("Harris Worker");
00166 QVMSERDetector mserWorker("MSER Worker");
00167
00168 QVMPlayerCamera camera("Video");
00169
00170 camera.link(&cannyWorker,"Input image");
00171 camera.link(&contoursWorker,"Input image");
00172 camera.link(&cornersWorker,"Input image");
00173 camera.link(&mserWorker,"Input image");
00174
00175 MyWorker myWorker1("Histogram processor 1");
00176 MyWorker myWorker2("Histogram processor 2");
00177 camera.link(&myWorker1, "Input image");
00178 myWorker1.linkProperty("Output image", &myWorker2, "Input image", QVWorker::SynchronousLink);
00179
00180 QVDefaultGUI interface;
00181
00182 QVImageCanvas cannyCanvas("Canny");
00183 cannyCanvas.linkProperty(cannyWorker,"Output image");
00184 cannyCanvas.linkProperty(cannyWorker,"Output contours");
00185
00186 QVImageCanvas contourCanvas("Contours");
00187 contourCanvas.linkProperty(contoursWorker, "Input image");
00188 contourCanvas.linkProperty(contoursWorker,"Internal contours", Qt::red);
00189 contourCanvas.linkProperty(contoursWorker,"External contours", Qt::blue);
00190
00191 QVImageCanvas cornersCanvas("Harris");
00192 cornersCanvas.linkProperty(cornersWorker, "Input image");
00193 cornersCanvas.linkProperty(cornersWorker,"Feature locations", Qt::red, false);
00194
00195 QVImageCanvas mserCanvas("MSER Regions");
00196 mserCanvas.linkProperty(mserWorker, "Input image");
00197 mserCanvas.linkProperty(mserWorker,"MSER contours", Qt::red);
00198
00199 QVNumericPlot numericPlot("MinMax", false, 1);
00200 numericPlot.linkProperty(myWorker1, "Max pixel");
00201 numericPlot.linkProperty(myWorker1, "Min pixel");
00202 numericPlot.linkProperty(myWorker2);
00203
00204 QVHistogramPlot histPlot1("histMinMax", false, 10, 300);
00205 histPlot1.linkProperty(myWorker1, "MinMaxList");
00206 histPlot1.linkProperty(myWorker2, "MinMaxList");
00207
00208 QVHistogramPlot histPlot2("histFirstRow", false, 10, 300);
00209 histPlot2.linkProperty(myWorker1, "FirstRow");
00210
00211 return app.exec();
00212 }
00213
00214 #endif