/* * Tests.cpp * * Copyright (c) 2014-2021 SEACAVE * * Author(s): * * cDc * * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * * * Additional Terms: * * You are required to preserve legal notices and author attributions in * that material or in the Appropriate Legal Notices displayed by works * containing it. */ #include "../../libs/MVS/Common.h" #include "../../libs/MVS/Scene.h" using namespace MVS; // D E F I N E S /////////////////////////////////////////////////// #define APPNAME _T("Tests") // S T R U C T S /////////////////////////////////////////////////// // test various algorithms independently bool UnitTests() { TD_TIMER_START(); if (!SEACAVE::cListTest(100)) { VERBOSE("ERROR: cListTest failed!"); return false; } if (!SEACAVE::OctreeTest(100)) { VERBOSE("ERROR: OctreeTest failed!"); return false; } if (!SEACAVE::OctreeTest(100)) { VERBOSE("ERROR: OctreeTest failed!"); return false; } if (!SEACAVE::TestRayTriangleIntersection(1000)) { VERBOSE("ERROR: TestRayTriangleIntersection failed!"); return false; } if (!SEACAVE::TestRayTriangleIntersection(1000)) { VERBOSE("ERROR: TestRayTriangleIntersection failed!"); return false; } VERBOSE("All unit tests passed (%s)", TD_TIMER_GET_FMT().c_str()); return true; } // test MVS stages on a small sample dataset bool PipelineTest(bool verbose=false) { TD_TIMER_START(); Scene scene; if (!scene.Load(MAKE_PATH("scene.mvs"))) { VERBOSE("ERROR: TestDataset failed loading the scene!"); return false; } OPTDENSE::init(); OPTDENSE::bRemoveDmaps = true; if (!scene.DenseReconstruction() || scene.pointcloud.GetSize() < 200000u) { VERBOSE("ERROR: TestDataset failed estimating dense point cloud!"); return false; } if (verbose) scene.pointcloud.Save(MAKE_PATH("scene_dense.ply")); if (!scene.ReconstructMesh() || scene.mesh.faces.size() < 75000u) { VERBOSE("ERROR: TestDataset failed reconstructing the mesh!"); return false; } if (verbose) scene.mesh.Save(MAKE_PATH("scene_dense_mesh.ply")); constexpr float decimate = 0.5f; scene.mesh.Clean(decimate); if (!ISINSIDE(scene.mesh.faces.size(), 35000u, 45000u)) { VERBOSE("ERROR: TestDataset failed cleaning the mesh!"); return false; } #ifdef _USE_OPENMP TestMeshProjectionMT(scene.mesh, scene.images[1]); #endif if (!scene.TextureMesh(0, 0) || !scene.mesh.HasTexture()) { VERBOSE("ERROR: TestDataset failed texturing the mesh!"); return false; } if (verbose) scene.mesh.Save(MAKE_PATH("scene_dense_mesh_texture.ply")); VERBOSE("All pipeline stages passed (%s)", TD_TIMER_GET_FMT().c_str()); return true; } // test OpenMVS functionality int main(int argc, LPCTSTR* argv) { OPEN_LOG(); OPEN_LOGCONSOLE(); MVS::Initialize(APPNAME); WORKING_FOLDER = _DATA_PATH; INIT_WORKING_FOLDER; if (argc < 2 || std::atoi(argv[1]) == 0) { if (!UnitTests()) return EXIT_FAILURE; } else { if (!PipelineTest()) return EXIT_FAILURE; } MVS::Finalize(); CLOSE_LOGCONSOLE(); CLOSE_LOG(); return EXIT_SUCCESS; } /*----------------------------------------------------------------*/