00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00024
00025 #include <qvdta.h>
00026 #include <qvipp.h>
00027 #include <qvprojective.h>
00028
00029 #include <QVMatrix>
00030 #include <QVPlanarRectifierWorker>
00031
00032 QVPlanarRectifierWorker::QVPlanarRectifierWorker(QString name): QVWorker(name)
00033 {
00034 addProperty<double>("Zoom", inputFlag, 100, "Size of the rectified template", 10, 250);
00035 addProperty<int>("Canvas size", inputFlag, 1, "Size of the rectified template", 1, 5);
00036 addProperty< QVMatrix >("Homography", inputFlag, QVMatrix::identity(3));
00037
00038 addProperty< QVImage<uChar,3> >("Input image", inputFlag|outputFlag);
00039 addProperty< QVImage<uChar,3> >("Warped image", outputFlag);
00040 }
00041
00042 void QVPlanarRectifierWorker::iterate()
00043 {
00044
00045 const QVImage<uChar,3> image = getPropertyValue< QVImage<uChar,3> >("Input image");
00046 const int rows = image.getRows(), cols = image.getCols(),
00047 canvasSize = getPropertyValue<int>("Canvas size"),
00048 warpedRows = canvasSize*rows, warpedCols = canvasSize*cols;
00049 const double zoom = getPropertyValue<double>("Zoom");
00050 const QVMatrix H = getPropertyValue< QVMatrix>("Homography");
00051
00052 if (H.getCols() != 3 || H.getRows() != 3)
00053 return;
00054
00055 timeFlag("Read input properties");
00056
00057
00058
00059 QVMatrix scaleMatrix = QVMatrix::identity(3);
00060 scaleMatrix(0,0) = 2/cols;
00061 scaleMatrix(1,1) = -2/cols;
00062
00063 QVMatrix traslateMatrix = QVMatrix::traslationMatrix(-cols/2, -rows/2),
00064 detraslateMatrix = QVMatrix::traslationMatrix(warpedCols/2, warpedRows/2);
00065
00066 QVMatrix zoomMatrix = QVMatrix::identity(3);
00067 zoomMatrix(0,0) = zoom;
00068 zoomMatrix(1,1) = -zoom;
00069
00070 const QVMatrix rectifyingHomography = detraslateMatrix * zoomMatrix * H * scaleMatrix * traslateMatrix;
00071
00072
00073 QVImage<uChar,3> warped(warpedCols, warpedRows);
00074 Set(((uChar [3]){0,0,0}), warped);
00075
00076
00077
00078 WarpPerspective(image, warped, rectifyingHomography);
00079
00080 setPropertyValue< QVImage<uChar,3> >("Warped image", warped);
00081 timeFlag("Image wrapping");
00082 }