Path: blob/master/modules/calib3d/test/test_decompose_projection.cpp
16337 views
/*M///////////////////////////////////////////////////////////////////////////////////////1//2// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.3//4// By downloading, copying, installing or using the software you agree to this license.5// If you do not agree to this license, do not download, install,6// copy or use the software.7//8//9// License Agreement10// For Open Source Computer Vision Library11//12// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.13// Copyright (C) 2009, Willow Garage Inc., all rights reserved.14// Third party copyrights are property of their respective owners.15//16// Redistribution and use in source and binary forms, with or without modification,17// are permitted provided that the following conditions are met:18//19// * Redistribution's of source code must retain the above copyright notice,20// this list of conditions and the following disclaimer.21//22// * Redistribution's in binary form must reproduce the above copyright notice,23// this list of conditions and the following disclaimer in the documentation24// and/or other materials provided with the distribution.25//26// * The name of the copyright holders may not be used to endorse or promote products27// derived from this software without specific prior written permission.28//29// This software is provided by the copyright holders and contributors "as is" and30// any express or implied warranties, including, but not limited to, the implied31// warranties of merchantability and fitness for a particular purpose are disclaimed.32// In no event shall the Intel Corporation or contributors be liable for any direct,33// indirect, incidental, special, exemplary, or consequential damages34// (including, but not limited to, procurement of substitute goods or services;35// loss of use, data, or profits; or business interruption) however caused36// and on any theory of liability, whether in contract, strict liability,37// or tort (including negligence or otherwise) arising in any way out of38// the use of this software, even if advised of the possibility of such damage.39//40//M*/4142#include "test_precomp.hpp"4344namespace opencv_test { namespace {4546class CV_DecomposeProjectionMatrixTest : public cvtest::BaseTest47{48public:49CV_DecomposeProjectionMatrixTest();50protected:51void run(int);52};5354CV_DecomposeProjectionMatrixTest::CV_DecomposeProjectionMatrixTest()55{56test_case_count = 30;57}585960void CV_DecomposeProjectionMatrixTest::run(int start_from)61{6263ts->set_failed_test_info(cvtest::TS::OK);6465cv::RNG& rng = ts->get_rng();66int progress = 0;676869for (int iter = start_from; iter < test_case_count; ++iter)70{71ts->update_context(this, iter, true);72progress = update_progress(progress, iter, test_case_count, 0);7374// Create the original (and random) camera matrix, rotation, and translation75cv::Vec2d f, c;76rng.fill(f, cv::RNG::UNIFORM, 300, 1000);77rng.fill(c, cv::RNG::UNIFORM, 150, 600);7879double alpha = 0.01*rng.gaussian(1);8081cv::Matx33d origK(f(0), alpha*f(0), c(0),820, f(1), c(1),830, 0, 1);848586cv::Vec3d rVec;87rng.fill(rVec, cv::RNG::UNIFORM, -CV_PI, CV_PI);8889cv::Matx33d origR;90cv::Rodrigues(rVec, origR); // TODO cvtest9192cv::Vec3d origT;93rng.fill(origT, cv::RNG::NORMAL, 0, 1);949596// Compose the projection matrix97cv::Matx34d P(3,4);98hconcat(origK*origR, origK*origT, P);99100101// Decompose102cv::Matx33d K, R;103cv::Vec4d homogCameraCenter;104decomposeProjectionMatrix(P, K, R, homogCameraCenter);105106107// Recover translation from the camera center108cv::Vec3d cameraCenter(homogCameraCenter(0), homogCameraCenter(1), homogCameraCenter(2));109cameraCenter /= homogCameraCenter(3);110111cv::Vec3d t = -R*cameraCenter;112113114const double thresh = 1e-6;115if (cv::norm(origK, K, cv::NORM_INF) > thresh)116{117ts->set_failed_test_info(cvtest::TS::FAIL_BAD_ACCURACY);118break;119}120121if (cv::norm(origR, R, cv::NORM_INF) > thresh)122{123ts->set_failed_test_info(cvtest::TS::FAIL_BAD_ACCURACY);124break;125}126127if (cv::norm(origT, t, cv::NORM_INF) > thresh)128{129ts->set_failed_test_info(cvtest::TS::FAIL_BAD_ACCURACY);130break;131}132133}134135}136137TEST(Calib3d_DecomposeProjectionMatrix, accuracy)138{139CV_DecomposeProjectionMatrixTest test;140test.safe_run();141}142143}} // namespace144145146