summaryrefslogtreecommitdiff
path: root/src/imaging/testimaging.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/imaging/testimaging.cpp')
-rw-r--r--src/imaging/testimaging.cpp239
1 files changed, 239 insertions, 0 deletions
diff --git a/src/imaging/testimaging.cpp b/src/imaging/testimaging.cpp
new file mode 100644
index 0000000..9877c12
--- /dev/null
+++ b/src/imaging/testimaging.cpp
@@ -0,0 +1,239 @@
+//
+// libavg - Media Playback Engine.
+// Copyright (C) 2003-2014 Ulrich von Zadow
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// Current versions can be found at www.libavg.de
+//
+
+#include "FakeCamera.h"
+#include "TrackerThread.h"
+#include "TrackerConfig.h"
+#include "DeDistort.h"
+#include "FilterWipeBorder.h"
+#include "FilterClearBorder.h"
+
+#include "../graphics/GraphicsTest.h"
+#include "../graphics/Filtergrayscale.h"
+#include "../graphics/BitmapLoader.h"
+
+#include "../base/TestSuite.h"
+#include "../base/Exception.h"
+#include "../base/FileHelper.h"
+#include "../base/MathHelper.h"
+
+#include <boost/thread/thread.hpp>
+#include <boost/bind.hpp>
+
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sstream>
+
+#include <glib-object.h>
+
+using namespace avg;
+using namespace std;
+
+class FilterWipeBorderTest: public GraphicsTest
+{
+public:
+ FilterWipeBorderTest()
+ : GraphicsTest("FilterWipeBorderTest", 2)
+ {
+ }
+
+ void runTests()
+ {
+ BitmapPtr pBmp = loadTestBmp("filterwipeborder", I8);
+ BitmapPtr pDestBmp = FilterWipeBorder(0).apply(pBmp);
+ testEqual(*pDestBmp, *pBmp, "FilterWipeBorderResult0", 0, 0);
+ pDestBmp = FilterWipeBorder(1).apply(pBmp);
+ testEqual(*pDestBmp, "FilterWipeBorderResult1", I8);
+ pDestBmp = FilterWipeBorder(3).apply(pBmp);
+ testEqual(*pDestBmp, "FilterWipeBorderResult3", I8);
+ }
+};
+
+class FilterClearBorderTest: public GraphicsTest
+{
+public:
+ FilterClearBorderTest()
+ : GraphicsTest("FilterClearBorderTest", 2)
+ {
+ }
+
+ void runTests()
+ {
+ BitmapPtr pBmp = loadTestBmp("filterwipeborder", I8);
+ BitmapPtr pDestBmp = FilterClearBorder(0).apply(pBmp);
+ testEqual(*pDestBmp, *pBmp, "FilterClearBorderResult0", 0, 0);
+ pDestBmp = FilterClearBorder(1).apply(pBmp);
+ testEqual(*pDestBmp, "FilterClearBorderResult1", I8);
+ pDestBmp = FilterClearBorder(3).apply(pBmp);
+ testEqual(*pDestBmp, "FilterClearBorderResult3", I8);
+ }
+};
+
+class DeDistortTest: public Test
+{
+public:
+ DeDistortTest()
+ : Test("DeDistortTest", 2)
+ {}
+
+ void runTests()
+ {
+ vector<double> params;
+ params.push_back(0);
+ params.push_back(0);
+ DeDistort IdentityDistort = DeDistort(glm::vec2(1,1),
+ params, 0.0, 0.0, glm::dvec2(0,0), glm::dvec2(1,1));
+ TEST(almostEqual(IdentityDistort.transform_point(glm::dvec2(0,0)),
+ glm::dvec2(0,0)));
+ TEST(almostEqual(IdentityDistort.transform_point(glm::dvec2(1,2)),
+ glm::dvec2(1,2)));
+ TEST(almostEqual(IdentityDistort.transformBlobToScreen(glm::dvec2(0,0)),
+ glm::dvec2(0,0)));
+ TEST(almostEqual(IdentityDistort.transformBlobToScreen(glm::dvec2(1,2)),
+ glm::dvec2(1,2)));
+ TEST(almostEqual(IdentityDistort.inverse_transform_point(glm::dvec2(0,0)),
+ glm::dvec2(0,0)));
+ TEST(almostEqual(IdentityDistort.inverse_transform_point(glm::dvec2(1,2)),
+ glm::dvec2(1,2)));
+ TEST(almostEqual(IdentityDistort.transformScreenToBlob(glm::dvec2(0,0)),
+ glm::dvec2(0,0)));
+ TEST(almostEqual(IdentityDistort.transformScreenToBlob(glm::dvec2(1,2)),
+ glm::dvec2(1,2)));
+ TEST(IdentityDistort.getDisplayArea(glm::vec2(1280,720)) == FRect(0,0,1280,720));
+
+ DeDistort scaler = DeDistort(glm::vec2(1,1), params, 0, 0.0, glm::dvec2(0,0),
+ glm::dvec2(2,2));
+ TEST(almostEqual(scaler.transform_point(glm::dvec2(0,0)), glm::dvec2(0,0)));
+ TEST(almostEqual(scaler.transformBlobToScreen(glm::dvec2(1,2)), glm::dvec2(2,4)));
+ TEST(almostEqual(scaler.inverse_transform_point(glm::dvec2(0,0)), glm::dvec2(0,0)));
+ TEST(almostEqual(scaler.transformScreenToBlob(glm::dvec2(1,2)), glm::dvec2(0.5,1)));
+
+ DeDistort shifter = DeDistort(glm::vec2(1,1), params, 0, 0.0, glm::dvec2(1,1),
+ glm::dvec2(1,1));
+ TEST(almostEqual(shifter.transformBlobToScreen(glm::dvec2(0,0)), glm::dvec2(1,1)));
+ TEST(almostEqual(shifter.transformBlobToScreen(glm::dvec2(1,2)), glm::dvec2(2,3)));
+ TEST(almostEqual(shifter.transformScreenToBlob(glm::dvec2(0,0)),
+ glm::dvec2(-1,-1)));
+ TEST(almostEqual(shifter.transformScreenToBlob(glm::dvec2(1,2)), glm::dvec2(0,1)));
+ TEST(shifter.getDisplayArea(glm::vec2(1,1)) == FRect(-1, -1, 0, 0));
+
+ vector<double> cubed;
+ cubed.push_back(0);
+ cubed.push_back(1);
+ DeDistort barreler = DeDistort(glm::vec2(1,1), cubed, 0, 0.0, glm::dvec2(0,0),
+ glm::dvec2(1,1));
+ for (double xp = 0; xp < 10; xp++) {
+ for(double yp = 0; yp < 10; yp++) {
+ QUIET_TEST(almostEqual(barreler.inverse_transform_point(
+ barreler.transform_point(glm::dvec2(xp,yp))), glm::dvec2(xp,yp)));
+ }
+ }
+ TEST(almostEqual(barreler.transform_point(glm::dvec2(1,1)), glm::dvec2(1,1)));
+
+ DeDistort rotator = DeDistort(glm::vec2(1,1), params, 0, M_PI/2, glm::dvec2(0,0),
+ glm::dvec2(1,1));
+ for (double xp = 0; xp < 10; xp++) {
+ for(double yp = 0; yp < 10; yp++) {
+ QUIET_TEST(almostEqual(rotator.inverse_transform_point(
+ rotator.transform_point(glm::dvec2(xp,yp))), glm::dvec2(xp,yp)));
+ }
+ }
+
+ DeDistort shifterScaler = DeDistort(glm::vec2(1,1), params, 0, 0.0,
+ glm::dvec2(1,1), glm::dvec2(2,2));
+ for (double xp = 0; xp < 10; xp++) {
+ for(double yp = 0; yp < 10; yp++) {
+ QUIET_TEST(almostEqual(shifterScaler.inverse_transform_point(
+ shifterScaler.transform_point(glm::dvec2(xp,yp))),
+ glm::dvec2(xp,yp)));
+ }
+ }
+ }
+};
+
+#ifdef _WIN32
+#pragma warning(disable: 4996)
+#endif
+class SerializeTest: public Test
+{
+public:
+ SerializeTest()
+ : Test("SerializeTest", 2)
+ {
+ }
+
+ void runTests()
+ {
+ TrackerConfig Config;
+ copyFile(getSrcDirName()+"avgtrackerrc.minimal", "avgtrackerrc");
+ Config.load();
+
+ Config.setParam("/transform/distortionparams/@p2", "0");
+ Config.setParam("/transform/distortionparams/@p3", "0");
+ Config.setParam("/transform/trapezoid/@value", "0");
+ Config.setParam("/transform/angle/@value", "0");
+ Config.setParam("/transform/displaydisplacement/@x", "0");
+ Config.setParam("/transform/displaydisplacement/@y", "0");
+ Config.setParam("/transform/displayscale/@x", "2");
+ Config.setParam("/transform/displayscale/@y", "2");
+
+ if (getSrcDirName() == "./") {
+ Config.save();
+
+ TrackerConfig loadedConfig;
+ loadedConfig.load();
+ glm::vec2 scale = loadedConfig.getPointParam("/transform/displayscale/");
+ TEST(almostEqual(scale, glm::vec2(2,2)));
+ unlink("avgtrackerrc.bak");
+ }
+ unlink("avgtrackerrc");
+ }
+};
+
+class ImagingTestSuite: public TestSuite
+{
+public:
+ ImagingTestSuite()
+ : TestSuite("ImagingTestSuite")
+ {
+ addTest(TestPtr(new FilterWipeBorderTest));
+ addTest(TestPtr(new FilterClearBorderTest));
+ addTest(TestPtr(new DeDistortTest));
+ addTest(TestPtr(new SerializeTest));
+ }
+};
+
+
+int main(int nargs, char** args)
+{
+ ImagingTestSuite Suite;
+ BitmapLoader::init(true);
+ Suite.runTests();
+ bool bOK = Suite.isOk();
+
+ if (bOK) {
+ return 0;
+ } else {
+ return 1;
+ }
+}
+