00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00042 #include <stdio.h>
00043 #include <stdlib.h>
00044 #include <iostream>
00045 #include <QDebug>
00046
00047 #include <qvcore/qvapplication.h>
00048 #include <qvcameras/qvmplayercamera.h>
00049 #include <qvgui/qvgui.h>
00050 #include <qvipp/qvipp.h>
00051
00053 class MyWorker: public QVWorker
00054 {
00055 private:
00056 QVImage<uChar> mask;
00057
00058 public:
00059 MyWorker(QString name): QVWorker(name)
00060 {
00061 addProperty<QString>("Mask", inputFlag, "", "Image file for mask");
00062 addProperty<int>("Radius", inputFlag, 4, "Mask radius", 1, 30);
00063 addProperty<bool>("Use Telea", inputFlag, false, "Use Telea versus NS");
00064 addProperty< QVImage<uChar,3> >("Input image", inputFlag|outputFlag);
00065 addProperty< QVImage<uChar,1> >("Mask image", outputFlag);
00066 addProperty< QVImage<uChar,3> >("Restored image", outputFlag);
00067
00068
00069 if(!QVMPlayerCamera::getFrame(getPropertyValue<QString>("Mask"), mask))
00070 setLastError("Error, can't find mask image file");
00071 }
00072
00073 void iterate()
00074 {
00075 bool useTelea = getPropertyValue<bool>("Use Telea");
00076 int radius = getPropertyValue<int>("Radius");
00077
00078 QVImage<uChar,3> image = getPropertyValue< QVImage<uChar,3> >("Input image");
00079 timeFlag("init");
00080
00082
00083 QVImage<uChar> maskForImage(image.getCols(), image.getRows());
00084 Resize(mask, maskForImage);
00085
00086
00087 for (uInt col = 0; col < image.getCols(); col++)
00088 for (uInt row = 0; row < image.getRows(); row++)
00089 if (maskForImage(col, row) < 128)
00090 maskForImage(col, row) = 0;
00091 else
00092 maskForImage(col, row) = 255;
00093
00094 timeFlag("Obtain mask image of size equal to image");
00095
00097
00098 QVImage<uChar> buffer;
00099 FastMarchingGetBufferSize(maskForImage, buffer);
00100
00101 QVImage<sFloat> distances(image.getCols(), image.getRows());
00102 Set(distances,0);
00103 FastMarching(maskForImage, distances, radius, buffer);
00104 timeFlag("Get distances using fast marching algorithm");
00105
00107
00108 QVImage<uChar,3> inpaint(image.getCols(),image.getRows());
00109 Inpaint(image, maskForImage, distances, inpaint, radius, useTelea?IPP_INPAINT_TELEA:IPP_INPAINT_NS);
00110 timeFlag("Inpainting");
00111
00113
00114 setPropertyValue< QVImage<uChar,1> >("Mask image", maskForImage);
00115 setPropertyValue< QVImage<uChar,3> >("Restored image", inpaint);
00116 timeFlag("Showing results");
00117 }
00118 };
00119
00120 int main(int argc, char *argv[])
00121 {
00122 QVApplication app(argc, argv,
00123 "Example program for QVision library. Does inpaint reconstruction from an artificialy damaged source video.");
00124
00125 QVMPlayerCamera camera("Video");
00126 MyWorker worker("Inpaint worker");
00127 camera.link(&worker,"Input image");
00128
00129 QVGUI interface;
00130
00131 QVImageCanvas inputImage("Input image");
00132 inputImage.linkProperty(worker,"Input image");
00133
00134 QVImageCanvas maskImage("Mask image");
00135 maskImage.linkProperty(worker,"Mask image");
00136
00137 QVImageCanvas restoredImage("Restored image");
00138 restoredImage.linkProperty(worker,"Restored image");
00139
00140 return app.exec();
00141 }
00142
00144