From a66f61748fc4861374b8dc458866a9614925350a Mon Sep 17 00:00:00 2001 From: Maksym Ivashechkin Date: Sat, 15 Aug 2020 00:42:26 +0200 Subject: [PATCH] Merge pull request #17683 from ivashmak:homography [GSoC] New RANSAC. Homography part * change enum and squash commits * add small improvements * change function to static, update magsac * remove path from samples, remove license, small updates * update pnp solver, small improvements * fix warnings * add tutorial, comments * fix markdown warnings * fix markdown warnings * fix markdown warnings --- doc/tutorials/calib3d/usac.markdown | 307 ++++++++ modules/calib3d/CMakeLists.txt | 1 + modules/calib3d/include/opencv2/calib3d.hpp | 62 +- modules/calib3d/src/five-point.cpp | 20 + modules/calib3d/src/fundam.cpp | 36 + modules/calib3d/src/ptsetreg.cpp | 19 + modules/calib3d/src/solvepnp.cpp | 29 + modules/calib3d/src/usac.hpp | 800 +++++++++++++++++++ modules/calib3d/src/usac/degeneracy.cpp | 336 ++++++++ modules/calib3d/src/usac/dls_solver.cpp | 877 +++++++++++++++++++++ modules/calib3d/src/usac/essential_solver.cpp | 273 +++++++ modules/calib3d/src/usac/estimator.cpp | 625 +++++++++++++++ modules/calib3d/src/usac/fundamental_solver.cpp | 335 ++++++++ modules/calib3d/src/usac/gamma_values.hpp | 237 ++++++ modules/calib3d/src/usac/homography_solver.cpp | 445 +++++++++++ modules/calib3d/src/usac/local_optimization.cpp | 676 ++++++++++++++++ modules/calib3d/src/usac/pnp_solver.cpp | 377 +++++++++ modules/calib3d/src/usac/quality.cpp | 581 ++++++++++++++ modules/calib3d/src/usac/ransac_solvers.cpp | 977 ++++++++++++++++++++++++ modules/calib3d/src/usac/sampler.cpp | 548 +++++++++++++ modules/calib3d/src/usac/termination.cpp | 378 +++++++++ modules/calib3d/src/usac/utils.cpp | 526 +++++++++++++ modules/calib3d/test/test_usac.cpp | 408 ++++++++++ samples/cpp/epipolar_lines.cpp | 106 +++ samples/cpp/essential_mat_reconstr.cpp | 342 +++++++++ samples/data/essential_mat_data.txt | 5 + samples/data/leuvenA.jpg | Bin 0 -> 324949 bytes samples/data/leuvenB.jpg | Bin 0 -> 312454 bytes samples/python/essential_mat_reconstr.py | 137 ++++ 29 files changed, 9460 insertions(+), 3 deletions(-) create mode 100644 doc/tutorials/calib3d/usac.markdown create mode 100644 modules/calib3d/src/usac.hpp create mode 100644 modules/calib3d/src/usac/degeneracy.cpp create mode 100644 modules/calib3d/src/usac/dls_solver.cpp create mode 100644 modules/calib3d/src/usac/essential_solver.cpp create mode 100644 modules/calib3d/src/usac/estimator.cpp create mode 100644 modules/calib3d/src/usac/fundamental_solver.cpp create mode 100644 modules/calib3d/src/usac/gamma_values.hpp create mode 100644 modules/calib3d/src/usac/homography_solver.cpp create mode 100644 modules/calib3d/src/usac/local_optimization.cpp create mode 100644 modules/calib3d/src/usac/pnp_solver.cpp create mode 100644 modules/calib3d/src/usac/quality.cpp create mode 100644 modules/calib3d/src/usac/ransac_solvers.cpp create mode 100644 modules/calib3d/src/usac/sampler.cpp create mode 100644 modules/calib3d/src/usac/termination.cpp create mode 100644 modules/calib3d/src/usac/utils.cpp create mode 100644 modules/calib3d/test/test_usac.cpp create mode 100644 samples/cpp/epipolar_lines.cpp create mode 100644 samples/cpp/essential_mat_reconstr.cpp create mode 100644 samples/data/essential_mat_data.txt create mode 100644 samples/data/leuvenA.jpg create mode 100644 samples/data/leuvenB.jpg create mode 100644 samples/python/essential_mat_reconstr.py diff --git a/doc/tutorials/calib3d/usac.markdown b/doc/tutorials/calib3d/usac.markdown new file mode 100644 index 0000000..27d590b --- /dev/null +++ b/doc/tutorials/calib3d/usac.markdown @@ -0,0 +1,307 @@ +--- +author: +- Maksym Ivashechkin +bibliography: 'bibs.bib' +csl: 'acm-sigchi-proceedings.csl' +date: August 2020 +title: 'Google Summer of Code: Improvement of Random Sample Consensus in OpenCV' +... + +Contribution +============ + +The integrated part to OpenCV `calib3d` module is RANSAC-based universal +framework USAC (`namespace usac`) written in C++. The framework includes +different state-of-the-arts methods for sampling, verification or local +optimization. The main advantage of the framework is its independence to +any estimation problem and modular structure. Therefore, new solvers or +methods can be added/removed easily. So far it includes the following +components: + +1. Sampling method: + + 1. Uniform – standard RANSAC sampling proposed in \[8\] which draw + minimal subset independently uniformly at random. *The default + option in proposed framework*. + + 2. PROSAC – method \[4\] that assumes input data points sorted by + quality so sampling can start from the most promising points. + Correspondences for this method can be sorted e.g., by ratio of + descriptor distances of the best to second match obtained from + SIFT detector. *This is method is recommended to use because it + can find good model and terminate much earlier*. + + 3. NAPSAC – sampling method \[10\] which takes initial point + uniformly at random and the rest of points for minimal sample in + the neighborhood of initial point. This is method can be + potentially useful when models are localized. For example, for + plane fitting. However, in practise struggles from degenerate + issues and defining optimal neighborhood size. + + 4. Progressive-NAPSAC – sampler \[2\] which is similar to NAPSAC, + although it starts from local and gradually converges to + global sampling. This method can be quite useful if local models + are expected but distribution of data can be arbitrary. The + implemented version assumes data points to be sorted by quality + as in PROSAC. + +2. Score Method. USAC as well as standard RANSAC finds model which + minimizes total loss. Loss can be represented by following + functions: + + 1. RANSAC – binary 0 / 1 loss. 1 for outlier, 0 for inlier. *Good + option if the goal is to find as many inliers as possible.* + + 2. MSAC – truncated squared error distance of point to model. *The + default option in framework*. The model might not have as many + inliers as using RANSAC score, however will be more accurate. + + 3. MAGSAC – threshold-free method \[3\] to compute score. Using, + although, maximum sigma (standard deviation of noise) level to + marginalize residual of point over sigma. Score of the point + represents likelihood of point being inlier. *Recommended option + when image noise is unknown since method does not require + threshold*. However, it is still recommended to provide at least + approximated threshold, because termination itself is based on + number of points which error is less than threshold. By giving 0 + threshold the method will output model after maximum number of + iterations reached. + + 4. LMeds – the least median of squared error distances. In the + framework finding median is efficiently implement with $O(n)$ + complexity using quick-sort algorithm. Note, LMeds does not have + to work properly when inlier ratio is less than 50%, in other + cases this method is robust and does not require threshold. + +3. Error metric which describes error distance of point to + estimated model. + + 1. Re-projection distance – used for affine, homography and + projection matrices. For homography also symmetric re-projection + distance can be used. + + 2. Sampson distance – used for Fundamental matrix. + + 3. Symmetric Geometric distance – used for Essential matrix. + +4. Degeneracy: + + 1. DEGENSAC – method \[7\] which for Fundamental matrix estimation + efficiently verifies and recovers model which has at least 5 + points in minimal sample lying on the dominant plane. + + 2. Collinearity test – for affine and homography matrix estimation + checks if no 3 points lying on the line. For homography matrix + since points are planar is applied test which checks if points + in minimal sample lie on the same side w.r.t. to any line + crossing any two points in sample (does not assume reflection). + + 3. Oriented epipolar constraint – method \[6\] for epipolar + geometry which verifies model (fundamental and essential matrix) + to have points visible in the front of the camera. + +5. SPRT verification – method \[9\] which verifies model by its + evaluation on randomly shuffled points using statistical properties + given by probability of inlier, relative time for estimation, + average number of output models etc. Significantly speeding up + framework, because bad model can be rejected very quickly without + explicitly computing error for every point. + +6. Local Optimization: + + 1. Locally Optimized RANSAC – method \[5\] that iteratively + improves so-far-the-best model by non-minimal estimation. *The + default option in framework. This procedure is the fastest and + not worse than others local optimization methods.* + + 2. Graph-Cut RANSAC – method \[1\] that refine so-far-the-best + model, however, it exploits spatial coherence of the + data points. *This procedure is quite precise however + computationally slower.* + + 3. Sigma Consensus – method \[3\] which improves model by applying + non-minimal weighted estimation, where weights are computed with + the same logic as in MAGSAC score. This method is better to use + together with MAGSAC score. + +7. Termination: + + 1. Standard – standard equation for independent and + uniform sampling. + + 2. PROSAC – termination for PROSAC. + + 3. SPRT – termination for SPRT. + +8. Solver. In the framework there are minimal and non-minimal solvers. + In minimal solver standard methods for estimation is applied. In + non-minimal solver usually the covariance matrix is built and the + model is found as the eigen vector corresponding to the highest + eigen value. + + 1. Affine2D matrix + + 2. Homography matrix – for minimal solver is used RHO + (Gaussian elimination) algorithm from OpenCV. + + 3. Fundamental matrix – for 7-points algorithm two null vectors are + found using Gaussian elimination (eliminating to upper + triangular matrix and back-substitution) instead of SVD and then + solving 3-degrees polynomial. For 8-points solver Gaussian + elimination is used too. + + 4. Essential matrix – 4 null vectors are found using + Gaussian elimination. Then the solver based on Gröbner basis + described in \[11\] is used. Essential matrix can be computed + only if LAPACK or + Eigen are + installed as it requires eigen decomposition with complex + eigen values. + + 5. Perspective-n-Point – the minimal solver is classical 3 points + with up to 4 solutions. For RANSAC the low number of sample size + plays significant role as it requires less iterations, + furthermore in average P3P solver has around 1.39 + estimated models. Also, in new version of `solvePnPRansac(...)` + with `UsacParams` there is an options to pass empty intrinsic + matrix `InputOutputArray cameraMatrix`. If matrix is empty than + using Direct Linear Transformation algorithm (PnP with 6 points) + framework outputs not only rotation and translation vector but + also calibration matrix. + +Also, the framework can be run in parallel. The parallelization is done +in the way that multiple RANSACs are created and they share two atomic +variables `bool success` and `int num_hypothesis_tested` which +determines when all RANSACs must terminate. If one of RANSAC terminated +successfully then all other RANSAC will terminate as well. In the end +the best model is synchronized from all threads. If PROSAC sampler is +used then threads must share the same sampler since sampling is done +sequentially. However, using default options of framework parallel +RANSAC is not deterministic since it depends on how often each thread is +running. The easiest way to make it deterministic is using PROSAC +sampler without SPRT and Local Optimization and not for Fundamental +matrix, because they internally use random generators.\ +\ +For NAPSAC, Progressive NAPSAC or Graph-Cut methods is required to build +a neighborhood graph. In framework there are 3 options to do it: + +1. `NEIGH_FLANN_KNN` – estimate neighborhood graph using OpenCV FLANN + K nearest-neighbors. The default value for KNN is 7. KNN method may + work good for sampling but not good for GC-RANSAC. + +2. `NEIGH_FLANN_RADIUS` – similarly as in previous case finds neighbor + points which distance is less than 20 pixels. + +3. `NEIGH_GRID` – for finding points’ neighborhood tiles points in + cells using hash-table. The method is described in \[2\]. Less + accurate than `NEIGH_FLANN_RADIUS`, although significantly faster. + +Note, `NEIGH_FLANN_RADIUS` and `NEIGH_FLANN_RADIUS` are not able to PnP +solver, since there are 3D object points.\ +\ +New flags: + +1. `USAC_DEFAULT` – has standard LO-RANSAC. + +2. `USAC_PARALLEL` – has LO-RANSAC and RANSACs run in parallel. + +3. `USAC_ACCURATE` – has GC-RANSAC. + +4. `USAC_FAST` – has LO-RANSAC with smaller number iterations in local + optimization step. Uses RANSAC score to maximize number of inliers + and terminate earlier. + +5. `USAC_PROSAC` – has PROSAC sampling. Note, points must be sorted. + +6. `USAC_FM_8PTS` – has LO-RANSAC. Only valid for Fundamental matrix + with 8-points solver. + +7. `USAC_MAGSAC` – has MAGSAC++. + +Every flag uses SPRT verification. And in the end the final +so-far-the-best model is polished by non minimal estimation of all found +inliers.\ +\ +A few other important parameters: + +1. `randomGeneratorState` – since every USAC solver is deterministic in + OpenCV (i.e., for the same points and parameters returns the + same result) by providing new state it will output new model. + +2. `loIterations` – number of iterations for Local Optimization method. + *The default value is 10*. By increasing `loIterations` the output + model could be more accurate, however, the computationial time may + also increase. + +3. `loSampleSize` – maximum sample number for Local Optimization. *The + default value is 14*. Note, that by increasing `loSampleSize` the + accuracy of model can increase as well as the computational time. + However, it is recommended to keep value less than 100, because + estimation on low number of points is faster and more robust. + +Samples: + +There are three new sample files in opencv/samples directory. + +1. `epipolar_lines.cpp` – input arguments of `main` function are two + pathes to images. Then correspondences are found using + SIFT detector. Fundamental matrix is found using RANSAC from + tentaive correspondences and epipolar lines are plot. + +2. `essential_mat_reconstr.cpp` – input arguments are path to data file + containing image names and single intrinsic matrix and directory + where these images located. Correspondences are found using SIFT. + The essential matrix is estimated using RANSAC and decomposed to + rotation and translation. Then by building two relative poses with + projection matrices image points are triangulated to object points. + By running RANSAC with 3D plane fitting object points as well as + correspondences are clustered into planes. + +3. `essential_mat_reconstr.py` – the same functionality as in .cpp + file, however instead of clustering points to plane the 3D map of + object points is plot. + +References: + +1\. Daniel Barath and Jiří Matas. 2018. Graph-Cut RANSAC. In *Proceedings +of the iEEE conference on computer vision and pattern recognition*, +6733–6741. + +2\. Daniel Barath, Maksym Ivashechkin, and Jiri Matas. 2019. Progressive +NAPSAC: Sampling from gradually growing neighborhoods. *arXiv preprint +arXiv:1906.02295*. + +3\. Daniel Barath, Jana Noskova, Maksym Ivashechkin, and Jiri Matas. +2020. MAGSAC++, a fast, reliable and accurate robust estimator. In +*Proceedings of the iEEE/CVF conference on computer vision and pattern +recognition (cVPR)*. + +4\. O. Chum and J. Matas. 2005. Matching with PROSAC-progressive sample +consensus. In *Computer vision and pattern recognition*. + +5\. O. Chum, J. Matas, and J. Kittler. 2003. Locally optimized RANSAC. In +*Joint pattern recognition symposium*. + +6\. O. Chum, T. Werner, and J. Matas. 2004. Epipolar geometry estimation +via RANSAC benefits from the oriented epipolar constraint. In +*International conference on pattern recognition*. + +7\. Ondrej Chum, Tomas Werner, and Jiri Matas. 2005. Two-view geometry +estimation unaffected by a dominant plane. In *2005 iEEE computer +society conference on computer vision and pattern recognition +(cVPR’05)*, 772–779. + +8\. M. A. Fischler and R. C. Bolles. 1981. Random sample consensus: A +paradigm for model fitting with applications to image analysis and +automated cartography. *Communications of the ACM*. + +9\. Jiri Matas and Ondrej Chum. 2005. Randomized RANSAC with sequential +probability ratio test. In *Tenth iEEE international conference on +computer vision (iCCV’05) volume 1*, 1727–1732. + +10\. D. R. Myatt, P. H. S. Torr, S. J. Nasuto, J. M. Bishop, and R. +Craddock. 2002. NAPSAC: High noise, high dimensional robust estimation. +In *In bMVC02*, 458–467. + +11\. Henrik Stewénius, Christopher Engels, and David Nistér. 2006. Recent +developments on direct relative orientation. diff --git a/modules/calib3d/CMakeLists.txt b/modules/calib3d/CMakeLists.txt index 0953e3c..7b1bace 100644 --- a/modules/calib3d/CMakeLists.txt +++ b/modules/calib3d/CMakeLists.txt @@ -9,3 +9,4 @@ endif() ocv_define_module(calib3d opencv_imgproc opencv_features2d opencv_flann ${debug_modules} WRAP java objc python js ) +ocv_target_link_libraries(${the_module} ${LAPACK_LIBRARIES}) diff --git a/modules/calib3d/include/opencv2/calib3d.hpp b/modules/calib3d/include/opencv2/calib3d.hpp index 17544cb..54c0bea 100644 --- a/modules/calib3d/include/opencv2/calib3d.hpp +++ b/modules/calib3d/include/opencv2/calib3d.hpp @@ -441,9 +441,16 @@ namespace cv //! @{ //! type of the robust estimation algorithm -enum { LMEDS = 4, //!< least-median of squares algorithm - RANSAC = 8, //!< RANSAC algorithm - RHO = 16 //!< RHO algorithm +enum { LMEDS = 4, //!< least-median of squares algorithm + RANSAC = 8, //!< RANSAC algorithm + RHO = 16, //!< RHO algorithm + USAC_DEFAULT = 32, //!< USAC algorithm, default settings + USAC_PARALLEL = 33, //!< USAC, parallel version + USAC_FM_8PTS = 34, //!< USAC, fundamental matrix 8 points + USAC_FAST = 35, //!< USAC, fast settings + USAC_ACCURATE = 36, //!< USAC, accurate settings + USAC_PROSAC = 37, //!< USAC, sorted points, runs PROSAC + USAC_MAGSAC = 38 //!< USAC, sorted points, runs PROSAC }; enum SolvePnPMethod { @@ -526,6 +533,27 @@ enum HandEyeCalibrationMethod CALIB_HAND_EYE_DANIILIDIS = 4 //!< Hand-Eye Calibration Using Dual Quaternions @cite Daniilidis98 }; +enum SamplingMethod { SAMPLING_UNIFORM, SAMPLING_PROGRESSIVE_NAPSAC, SAMPLING_NAPSAC, + SAMPLING_PROSAC }; +enum LocalOptimMethod {LOCAL_OPTIM_NULL, LOCAL_OPTIM_INNER_LO, LOCAL_OPTIM_INNER_AND_ITER_LO, + LOCAL_OPTIM_GC, LOCAL_OPTIM_SIGMA}; +enum ScoreMethod {SCORE_METHOD_RANSAC, SCORE_METHOD_MSAC, SCORE_METHOD_MAGSAC, SCORE_METHOD_LMEDS}; +enum NeighborSearchMethod { NEIGH_FLANN_KNN, NEIGH_GRID, NEIGH_FLANN_RADIUS }; + +struct CV_EXPORTS_W_SIMPLE UsacParams +{ // in alphabetical order + double confidence = 0.99; + bool isParallel = false; + int loIterations = 5; + LocalOptimMethod loMethod = LocalOptimMethod::LOCAL_OPTIM_INNER_LO; + int loSampleSize = 14; + int maxIterations = 5000; + NeighborSearchMethod neighborsSearch = NeighborSearchMethod::NEIGH_GRID; + int randomGeneratorState = 0; + SamplingMethod sampler = SamplingMethod::SAMPLING_UNIFORM; + ScoreMethod score = ScoreMethod::SCORE_METHOD_MSAC; + double threshold = 1.5; +}; /** @brief Converts a rotation matrix to a rotation vector or vice versa. @@ -696,6 +724,10 @@ CV_EXPORTS_W Mat findHomography( InputArray srcPoints, InputArray dstPoints, CV_EXPORTS Mat findHomography( InputArray srcPoints, InputArray dstPoints, OutputArray mask, int method = 0, double ransacReprojThreshold = 3 ); + +CV_EXPORTS_W Mat findHomography(InputArray srcPoints, InputArray dstPoints, OutputArray mask, + const UsacParams ¶ms); + /** @brief Computes an RQ decomposition of 3x3 matrices. @param src 3x3 input matrix. @@ -1083,6 +1115,16 @@ CV_EXPORTS_W bool solvePnPRansac( InputArray objectPoints, InputArray imagePoint float reprojectionError = 8.0, double confidence = 0.99, OutputArray inliers = noArray(), int flags = SOLVEPNP_ITERATIVE ); + +/* +Finds rotation and translation vector. +If cameraMatrix is given then run P3P. Otherwise run linear P6P and output cameraMatrix too. +*/ +CV_EXPORTS_W bool solvePnPRansac( InputArray objectPoints, InputArray imagePoints, + InputOutputArray cameraMatrix, InputArray distCoeffs, + OutputArray rvec, OutputArray tvec, OutputArray inliers, + const UsacParams ¶ms=UsacParams()); + /** @brief Finds an object pose from 3 3D-2D point correspondences. @param objectPoints Array of object points in the object coordinate space, 3x3 1-channel or @@ -2451,6 +2493,10 @@ CV_EXPORTS Mat findFundamentalMat( InputArray points1, InputArray points2, OutputArray mask, int method = FM_RANSAC, double ransacReprojThreshold = 3., double confidence = 0.99 ); + +CV_EXPORTS_W Mat findFundamentalMat( InputArray points1, InputArray points2, + OutputArray mask, const UsacParams ¶ms); + /** @brief Calculates an essential matrix from the corresponding points in two images. @param points1 Array of N (N \>= 5) 2D points from the first image. The point coordinates should @@ -2573,6 +2619,12 @@ CV_EXPORTS_W Mat findEssentialMat( InputArray points1, InputArray points2, double prob = 0.999, double threshold = 1.0, OutputArray mask = noArray() ); + +CV_EXPORTS_W Mat findEssentialMat( InputArray points1, InputArray points2, + InputArray cameraMatrix1, InputArray cameraMatrix2, + InputArray dist_coeff1, InputArray dist_coeff2, OutputArray mask, + const UsacParams ¶ms); + /** @brief Decompose an essential matrix to possible rotations and translation. @param E The input essential matrix. @@ -3037,6 +3089,10 @@ CV_EXPORTS_W cv::Mat estimateAffine2D(InputArray from, InputArray to, OutputArra size_t maxIters = 2000, double confidence = 0.99, size_t refineIters = 10); + +CV_EXPORTS_W cv::Mat estimateAffine2D(InputArray pts1, InputArray pts2, OutputArray inliers, + const UsacParams ¶ms); + /** @brief Computes an optimal limited affine transformation with 4 degrees of freedom between two 2D point sets. diff --git a/modules/calib3d/src/five-point.cpp b/modules/calib3d/src/five-point.cpp index c9847b4..f35b7bb 100644 --- a/modules/calib3d/src/five-point.cpp +++ b/modules/calib3d/src/five-point.cpp @@ -31,6 +31,8 @@ #include "precomp.hpp" +#include "usac.hpp" + namespace cv { @@ -407,6 +409,10 @@ cv::Mat cv::findEssentialMat( InputArray _points1, InputArray _points2, InputArr { CV_INSTRUMENT_REGION(); + if (method >= 32 && method <= 38) + return usac::findEssentialMat(_points1, _points2, _cameraMatrix, + method, prob, threshold, _mask); + Mat points1, points2, cameraMatrix; _points1.getMat().convertTo(points1, CV_64F); _points2.getMat().convertTo(points2, CV_64F); @@ -487,6 +493,20 @@ cv::Mat cv::findEssentialMat( InputArray _points1, InputArray _points2, return findEssentialMat(_pointsUntistorted1, _pointsUntistorted2, cm0, method, prob, threshold, _mask); } +cv::Mat cv::findEssentialMat( InputArray points1, InputArray points2, + InputArray cameraMatrix1, InputArray cameraMatrix2, + InputArray dist_coeff1, InputArray dist_coeff2, OutputArray mask, const UsacParams ¶ms) { + Ptr model; + usac::setParameters(model, usac::EstimationMethod::Essential, params, mask.needed()); + Ptr ransac_output; + if (usac::run(model, points1, points2, model->getRandomGeneratorState(), + ransac_output, cameraMatrix1, cameraMatrix2, dist_coeff1, dist_coeff2)) { + usac::saveMask(mask, ransac_output->getInliersMask()); + return ransac_output->getModel(); + } else return Mat(); + +} + int cv::recoverPose( InputArray E, InputArray _points1, InputArray _points2, InputArray _cameraMatrix, OutputArray _R, OutputArray _t, double distanceThresh, InputOutputArray _mask, OutputArray triangulatedPoints) diff --git a/modules/calib3d/src/fundam.cpp b/modules/calib3d/src/fundam.cpp index 3f19a89..0e38eb9 100644 --- a/modules/calib3d/src/fundam.cpp +++ b/modules/calib3d/src/fundam.cpp @@ -44,6 +44,8 @@ #include "rho.h" #include +#include "usac.hpp" + namespace cv { @@ -353,6 +355,10 @@ cv::Mat cv::findHomography( InputArray _points1, InputArray _points2, { CV_INSTRUMENT_REGION(); + if (method >= 32 && method <= 38) + return usac::findHomography(_points1, _points2, method, ransacReprojThreshold, + _mask, maxIters, confidence); + const double defaultRANSACReprojThreshold = 3; bool result = false; @@ -439,6 +445,18 @@ cv::Mat cv::findHomography( InputArray _points1, InputArray _points2, } +cv::Mat cv::findHomography(InputArray srcPoints, InputArray dstPoints, OutputArray mask, + const UsacParams ¶ms) { + Ptr model; + usac::setParameters(model, usac::EstimationMethod::Homography, params, mask.needed()); + Ptr ransac_output; + if (usac::run(model, srcPoints, dstPoints, model->getRandomGeneratorState(), + ransac_output, noArray(), noArray(), noArray(), noArray())) { + usac::saveMask(mask, ransac_output->getInliersMask()); + return ransac_output->getModel() / ransac_output->getModel().at(2,2); + } else return Mat(); +} + /* Estimation of Fundamental Matrix from point correspondences. The original code has been written by Valery Mosyagin */ @@ -813,6 +831,10 @@ cv::Mat cv::findFundamentalMat( InputArray _points1, InputArray _points2, { CV_INSTRUMENT_REGION(); + if (method >= 32 && method <= 38) + return usac::findFundamentalMat(_points1, _points2, method, + ransacReprojThreshold, confidence, maxIters, _mask); + Mat points1 = _points1.getMat(), points2 = _points2.getMat(); Mat m1, m2, F; int npoints = -1; @@ -885,6 +907,20 @@ cv::Mat cv::findFundamentalMat( cv::InputArray points1, cv::InputArray points2, return cv::findFundamentalMat(points1, points2, method, ransacReprojThreshold, confidence, 1000, mask); } +cv::Mat cv::findFundamentalMat( InputArray points1, InputArray points2, + OutputArray mask, const UsacParams ¶ms) { + Ptr model; + setParameters(model, usac::EstimationMethod::Fundamental, params, mask.needed()); + Ptr ransac_output; + if (usac::run(model, points1, points2, model->getRandomGeneratorState(), + ransac_output, noArray(), noArray(), noArray(), noArray())) { + usac::saveMask(mask, ransac_output->getInliersMask()); + return ransac_output->getModel(); + } else return Mat(); +} + + + void cv::computeCorrespondEpilines( InputArray _points, int whichImage, InputArray _Fmat, OutputArray _lines ) diff --git a/modules/calib3d/src/ptsetreg.cpp b/modules/calib3d/src/ptsetreg.cpp index e8ae3a6..f8cc4fe 100644 --- a/modules/calib3d/src/ptsetreg.cpp +++ b/modules/calib3d/src/ptsetreg.cpp @@ -47,6 +47,8 @@ #include #include +#include "usac.hpp" + namespace cv { @@ -927,6 +929,11 @@ Mat estimateAffine2D(InputArray _from, InputArray _to, OutputArray _inliers, const size_t maxIters, const double confidence, const size_t refineIters) { + + if (method >= 32 && method <= 38) + return cv::usac::estimateAffine2D(_from, _to, _inliers, method, + ransacReprojThreshold, (int)maxIters, confidence, (int)refineIters); + Mat from = _from.getMat(), to = _to.getMat(); int count = from.checkVector(2); bool result = false; @@ -996,6 +1003,18 @@ Mat estimateAffine2D(InputArray _from, InputArray _to, OutputArray _inliers, return H; } +Mat estimateAffine2D(InputArray _from, InputArray _to, OutputArray inliers, + const UsacParams ¶ms) { + Ptr model; + usac::setParameters(model, usac::EstimationMethod::Affine, params, inliers.needed()); + Ptr ransac_output; + if (usac::run(model, _from, _to, model->getRandomGeneratorState(), + ransac_output, noArray(), noArray(), noArray(), noArray())) { + usac::saveMask(inliers, ransac_output->getInliersMask()); + return ransac_output->getModel().rowRange(0,2); + } else return Mat(); +} + Mat estimateAffinePartial2D(InputArray _from, InputArray _to, OutputArray _inliers, const int method, const double ransacReprojThreshold, const size_t maxIters, const double confidence, diff --git a/modules/calib3d/src/solvepnp.cpp b/modules/calib3d/src/solvepnp.cpp index 2c7b27f..5cb541c 100644 --- a/modules/calib3d/src/solvepnp.cpp +++ b/modules/calib3d/src/solvepnp.cpp @@ -49,6 +49,8 @@ #include "ippe.hpp" #include "calib3d_c_api.h" +#include "usac.hpp" + namespace cv { #if defined _DEBUG || defined CV_STATIC_ANALYSIS @@ -201,6 +203,11 @@ bool solvePnPRansac(InputArray _opoints, InputArray _ipoints, { CV_INSTRUMENT_REGION(); + if (flags >= 32 && flags <= 38) + return usac::solvePnPRansac(_opoints, _ipoints, _cameraMatrix, _distCoeffs, + _rvec, _tvec, useExtrinsicGuess, iterationsCount, reprojectionError, + confidence, _inliers, flags); + Mat opoints0 = _opoints.getMat(), ipoints0 = _ipoints.getMat(); Mat opoints, ipoints; if( opoints0.depth() == CV_64F || !opoints0.isContinuous() ) @@ -342,6 +349,28 @@ bool solvePnPRansac(InputArray _opoints, InputArray _ipoints, return true; } + +bool solvePnPRansac( InputArray objectPoints, InputArray imagePoints, + InputOutputArray cameraMatrix, InputArray distCoeffs, + OutputArray rvec, OutputArray tvec, OutputArray inliers, + const UsacParams ¶ms) { + Ptr model_params; + usac::setParameters(model_params, cameraMatrix.empty() ? usac::EstimationMethod::P6P : + usac::EstimationMethod::P3P, params, inliers.needed()); + Ptr ransac_output; + if (usac::run(model_params, imagePoints, objectPoints, model_params->getRandomGeneratorState(), + ransac_output, cameraMatrix, noArray(), distCoeffs, noArray())) { + usac::saveMask(inliers, ransac_output->getInliersMask()); + const Mat &model = ransac_output->getModel(); + model.col(0).copyTo(rvec); + model.col(1).copyTo(tvec); + if (cameraMatrix.empty()) + model.colRange(2, 5).copyTo(cameraMatrix); + return true; + } else return false; +} + + int solveP3P( InputArray _opoints, InputArray _ipoints, InputArray _cameraMatrix, InputArray _distCoeffs, OutputArrayOfArrays _rvecs, OutputArrayOfArrays _tvecs, int flags) { diff --git a/modules/calib3d/src/usac.hpp b/modules/calib3d/src/usac.hpp new file mode 100644 index 0000000..4fcf587 --- /dev/null +++ b/modules/calib3d/src/usac.hpp @@ -0,0 +1,800 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_USAC_USAC_HPP +#define OPENCV_USAC_USAC_HPP + +namespace cv { namespace usac { +enum EstimationMethod { Homography, Fundamental, Fundamental8, Essential, Affine, P3P, P6P}; +enum VerificationMethod { NullVerifier, SprtVerifier }; +enum PolishingMethod { NonePolisher, LSQPolisher }; +enum ErrorMetric {DIST_TO_LINE, SAMPSON_ERR, SGD_ERR, SYMM_REPR_ERR, FORW_REPR_ERR, RERPOJ}; + +// Abstract Error class +class Error : public Algorithm { +public: + // set model to use getError() function + virtual void setModelParameters (const Mat &model) = 0; + // returns error of point wih @point_idx w.r.t. model + virtual float getError (int point_idx) const = 0; + virtual const std::vector &getErrors (const Mat &model) = 0; + virtual Ptr clone () const = 0; +}; + +// Symmetric Reprojection Error for Homography +class ReprojectionErrorSymmetric : public Error { +public: + static Ptr create(const Mat &points); +}; + +// Forward Reprojection Error for Homography +class ReprojectionErrorForward : public Error { +public: + static Ptr create(const Mat &points); +}; + +// Sampson Error for Fundamental matrix +class SampsonError : public Error { +public: + static Ptr create(const Mat &points); +}; + +// Symmetric Geometric Distance (to epipolar lines) for Fundamental and Essential matrix +class SymmetricGeometricDistance : public Error { +public: + static Ptr create(const Mat &points); +}; + +// Reprojection Error for Projection matrix +class ReprojectionErrorPmatrix : public Error { +public: + static Ptr create(const Mat &points); +}; + +// Reprojection Error for Affine matrix +class ReprojectionErrorAffine : public Error { +public: + static Ptr create(const Mat &points); +}; + +// Normalizing transformation of data points +class NormTransform : public Algorithm { +public: + /* + * @norm_points is output matrix of size pts_size x 4 + * @sample constains indices of points + * @sample_number is number of used points in sample <0; sample_number) + * @T1, T2 are output transformation matrices + */ + virtual void getNormTransformation (Mat &norm_points, const std::vector &sample, + int sample_number, Matx33d &T1, Matx33d &T2) const = 0; + static Ptr create (const Mat &points); +}; + +///////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////// SOLVER /////////////////////////////////////////// +class MinimalSolver : public Algorithm { +public: + // Estimate models from minimal sample. models.size() == number of found solutions + virtual int estimate (const std::vector &sample, std::vector &models) const = 0; + // return minimal sample size required for estimation. + virtual int getSampleSize() const = 0; + // return maximum number of possible solutions. + virtual int getMaxNumberOfSolutions () const = 0; + virtual Ptr clone () const = 0; +}; + +//-------------------------- HOMOGRAPHY MATRIX ----------------------- +class HomographyMinimalSolver4ptsGEM : public MinimalSolver { +public: + static Ptr create(const Mat &points_); +}; + +//-------------------------- FUNDAMENTAL MATRIX ----------------------- +class FundamentalMinimalSolver7pts : public MinimalSolver { +public: + static Ptr create(const Mat &points_); +}; + +class FundamentalMinimalSolver8pts : public MinimalSolver { +public: + static Ptr create(const Mat &points_); +}; + +//-------------------------- ESSENTIAL MATRIX ----------------------- +class EssentialMinimalSolverStewenius5pts : public MinimalSolver { +public: + static Ptr create(const Mat &points_); +}; + +//-------------------------- PNP ----------------------- +class PnPMinimalSolver6Pts : public MinimalSolver { +public: + static Ptr create(const Mat &points_); +}; + +class P3PSolver : public MinimalSolver { +public: + static Ptr create(const Mat &points_, const Mat &calib_norm_pts, const Mat &K); +}; + +//-------------------------- AFFINE ----------------------- +class AffineMinimalSolver : public MinimalSolver { +public: + static Ptr create(const Mat &points_); +}; + +//////////////////////////////////////// NON MINIMAL SOLVER /////////////////////////////////////// +class NonMinimalSolver : public Algorithm { +public: + // Estimate models from non minimal sample. models.size() == number of found solutions + virtual int estimate (const std::vector &sample, int sample_size, + std::vector &models, const std::vector &weights) const = 0; + // return minimal sample size required for non-minimal estimation. + virtual int getMinimumRequiredSampleSize() const = 0; + // return maximum number of possible solutions. + virtual int getMaxNumberOfSolutions () const = 0; + virtual Ptr clone () const = 0; +}; + +//-------------------------- HOMOGRAPHY MATRIX ----------------------- +class HomographyNonMinimalSolver : public NonMinimalSolver { +public: + static Ptr create(const Mat &points_); +}; + +//-------------------------- FUNDAMENTAL MATRIX ----------------------- +class FundamentalNonMinimalSolver : public NonMinimalSolver { +public: + static Ptr create(const Mat &points_); +}; + +//-------------------------- ESSENTIAL MATRIX ----------------------- +class EssentialNonMinimalSolver : public NonMinimalSolver { +public: + static Ptr create(const Mat &points_); +}; + +//-------------------------- PNP ----------------------- +class PnPNonMinimalSolver : public NonMinimalSolver { +public: + static Ptr create(const Mat &points); +}; + +class DLSPnP : public NonMinimalSolver { +public: + static Ptr create(const Mat &points_, const Mat &calib_norm_pts, const Mat &K); +}; + +//-------------------------- AFFINE ----------------------- +class AffineNonMinimalSolver : public NonMinimalSolver { +public: + static Ptr create(const Mat &points_); +}; + +////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////// SCORE /////////////////////////////////////////// +class Score { +public: + int inlier_number; + double score; + Score () { // set worst case + inlier_number = 0; + score = std::numeric_limits::max(); + } + Score (int inlier_number_, double score_) { // copy constructor + inlier_number = inlier_number_; + score = score_; + } + // Compare two scores. Objective is minimization of score. Lower score is better. + inline bool isBetter (const Score &score2) const { + return score < score2.score; + } +}; + +////////////////////////////////////////// QUALITY /////////////////////////////////////////// +class Quality : public Algorithm { +public: + virtual ~Quality() override = default; + /* + * Calculates number of inliers and score of the @model. + * return Score with calculated inlier_number and score. + * @model: Mat current model, e.g., H matrix. + */ + virtual Score getScore (const Mat &model) const = 0; + virtual Score getScore (const std::vector &/*errors*/) const { + CV_Error(cv::Error::StsNotImplemented, "getScore(errors)"); + } + // get @inliers of the @model. Assume threshold is given + // @inliers must be preallocated to maximum points size. + virtual int getInliers (const Mat &model, std::vector &inliers) const = 0; + // get @inliers of the @model for given threshold + virtual int getInliers (const Mat &model, std::vector &inliers, double thr) const = 0; + // Set the best score, so evaluation of the model can terminate earlier + virtual void setBestScore (double best_score_) = 0; + // set @inliers_mask: true if point i is inlier, false - otherwise. + virtual int getInliers (const Mat &model, std::vector &inliers_mask) const = 0; + virtual int getPointsSize() const = 0; + virtual Ptr clone () const = 0; + static int getInliers (const Ptr &error, const Mat &model, + std::vector &inliers_mask, double threshold); + static int getInliers (const Ptr &error, const Mat &model, + std::vector &inliers, double threshold); +}; + +// RANSAC (binary) quality +class RansacQuality : public Quality { +public: + static Ptr create(int points_size_, double threshold_,const Ptr &error_); +}; + +// M-estimator quality - truncated Squared error +class MsacQuality : public Quality { +public: + static Ptr create(int points_size_, double threshold_, const Ptr &error_); +}; + +// Marginlizing Sample Consensus quality, D. Barath et al. +class MagsacQuality : public Quality { +public: + static Ptr create(double maximum_thr, int points_size_,const Ptr &error_, + double tentative_inlier_threshold_, int DoF, double sigma_quantile, + double upper_incomplete_of_sigma_quantile, + double lower_incomplete_of_sigma_quantile, double C_); +}; + +// Least Median of Squares Quality +class LMedsQuality : public Quality { +public: + static Ptr create(int points_size_, double threshold_, const Ptr &error_); +}; + +////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////// DEGENERACY ////////////////////////////////// +class Degeneracy : public Algorithm { +public: + virtual ~Degeneracy() override = default; + /* + * Check if sample causes degenerate configurations. + * For example, test if points are collinear. + */ + virtual bool isSampleGood (const std::vector &/*sample*/) const { + return true; + } + /* + * Check if model satisfies constraints. + * For example, test if epipolar geometry satisfies oriented constraint. + */ + virtual bool isModelValid (const Mat &/*model*/, const std::vector &/*sample*/) const { + return true; + } + virtual bool isModelValid (const Mat &/*model*/, const std::vector &/*sample*/, + int /*sample_size*/) const { + return true; + } + /* + * Fix degenerate model. + * Return true if model is degenerate, false - otherwise + */ + virtual bool recoverIfDegenerate (const std::vector &/*sample*/,const Mat &/*best_model*/, + Mat &/*non_degenerate_model*/, Score &/*non_degenerate_model_score*/) { + return false; + } + virtual Ptr clone(int /*state*/) const { return makePtr(); } +}; + +class EpipolarGeometryDegeneracy : public Degeneracy { +public: + static void recoverRank (Mat &model); + static Ptr create (const Mat &points_, int sample_size_); +}; + +class EssentialDegeneracy : public EpipolarGeometryDegeneracy { +public: + static Ptrcreate (const Mat &points, int sample_size); +}; + +class HomographyDegeneracy : public Degeneracy { +public: + static Ptr create(const Mat &points_); +}; + +class FundamentalDegeneracy : public EpipolarGeometryDegeneracy { +public: + // threshold for homography is squared so is around 2.236 pixels + static Ptr create (int state, const Ptr &quality_, + const Mat &points_, int sample_size_, double homography_threshold); +}; + +///////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////// ESTIMATOR ////////////////////////////////// +class Estimator : public Algorithm{ +public: + /* + * Estimate models with minimal solver. + * Return number of valid solutions after estimation. + * Return models accordingly to number of solutions. + * Note, vector of models must allocated before. + * Note, not all degenerate tests are included in estimation. + */ + virtual int + estimateModels (const std::vector &sample, std::vector &models) const = 0; + /* + * Estimate model with non-minimal solver. + * Return number of valid solutions after estimation. + * Note, not all degenerate tests are included in estimation. + */ + virtual int + estimateModelNonMinimalSample (const std::vector &sample, int sample_size, + std::vector &models, const std::vector &weights) const = 0; + // return minimal sample size required for minimal estimation. + virtual int getMinimalSampleSize () const = 0; + // return minimal sample size required for non-minimal estimation. + virtual int getNonMinimalSampleSize () const = 0; + // return maximum number of possible solutions of minimal estimation. + virtual int getMaxNumSolutions () const = 0; + // return maximum number of possible solutions of non-minimal estimation. + virtual int getMaxNumSolutionsNonMinimal () const = 0; + virtual Ptr clone() const = 0; +}; + +class HomographyEstimator : public Estimator { +public: + static Ptr create (const Ptr &min_solver_, + const Ptr &non_min_solver_, const Ptr °eneracy_); +}; + +class FundamentalEstimator : public Estimator { +public: + static Ptr create (const Ptr &min_solver_, + const Ptr &non_min_solver_, const Ptr °eneracy_); +}; + +class EssentialEstimator : public Estimator { +public: + static Ptr create (const Ptr &min_solver_, + const Ptr &non_min_solver_, const Ptr °eneracy_); +}; + +class AffineEstimator : public Estimator { +public: + static Ptr create (const Ptr &min_solver_, + const Ptr &non_min_solver_); +}; + +class PnPEstimator : public Estimator { +public: + static Ptr create (const Ptr &min_solver_, + const Ptr &non_min_solver_); +}; + +////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////// MODEL VERIFIER //////////////////////////////////// +class ModelVerifier : public Algorithm { +public: + virtual ~ModelVerifier() override = default; + // Return true if model is good, false - otherwise. + virtual bool isModelGood(const Mat &model) = 0; + // Return true if score was computed during evaluation. + virtual bool getScore(Score &score) const = 0; + // update verifier by given inlier number + virtual void update (int highest_inlier_number) = 0; + virtual const std::vector &getErrors() const = 0; + virtual bool hasErrors () const = 0; + virtual Ptr clone (int state) const = 0; + static Ptr create(); +}; + +struct SPRT_history { + /* + * delta: + * The probability of a data point being consistent + * with a ‘bad’ model is modeled as a probability of + * a random event with Bernoulli distribution with parameter + * δ : p(1|Hb) = δ. + + * epsilon: + * The probability p(1|Hg) = ε + * that any randomly chosen data point is consistent with a ‘good’ model + * is approximated by the fraction of inliers ε among the data + * points + + * A is the decision threshold, the only parameter of the Adapted SPRT + */ + double epsilon, delta, A; + // number of samples processed by test + int tested_samples; // k + SPRT_history () { + tested_samples = 0; + } +}; + +///////////////////////////////// SPRT VERIFIER ///////////////////////////////////////// +/* +* Matas, Jiri, and Ondrej Chum. "Randomized RANSAC with sequential probability ratio test." +* Tenth IEEE International Conference on Computer Vision (ICCV'05) Volume 1. Vol. 2. IEEE, 2005. +*/ +class SPRT : public ModelVerifier { +public: + // return constant reference of vector of SPRT histories for SPRT termination. + virtual const std::vector &getSPRTvector () const = 0; + static Ptr create (int state, const Ptr &err_, int points_size_, + double inlier_threshold_, double prob_pt_of_good_model, + double prob_pt_of_bad_model, double time_sample, double avg_num_models, + ScoreMethod score_type_); +}; + +////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////// SAMPLER /////////////////////////////////////// +class Sampler : public Algorithm { +public: + virtual ~Sampler() override = default; + // set new points size + virtual void setNewPointsSize (int points_size) = 0; + // generate sample. Fill @sample with indices of points. + virtual void generateSample (std::vector &sample) = 0; + virtual Ptr clone (int state) const = 0; +}; + +//////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////// NEIGHBORHOOD GRAPH ///////////////////////////////////////// +class NeighborhoodGraph : public Algorithm { +public: + virtual ~NeighborhoodGraph() override = default; + // Return neighbors of the point with index @point_idx_ in the graph. + virtual const std::vector &getNeighbors(int point_idx_) const = 0; +}; + +class RadiusSearchNeighborhoodGraph : public NeighborhoodGraph { +public: + static Ptr create (const Mat &points, int points_size, + double radius_, int flann_search_params, int num_kd_trees); +}; + +class FlannNeighborhoodGraph : public NeighborhoodGraph { +public: + static Ptr create(const Mat &points, int points_size, + int k_nearest_neighbors_, bool get_distances, int flann_search_params, int num_kd_trees); + virtual const std::vector &getNeighborsDistances (int idx) const = 0; +}; + +class GridNeighborhoodGraph : public NeighborhoodGraph { +public: + static Ptr create(const Mat &points, int points_size, + int cell_size_x_img1_, int cell_size_y_img1_, + int cell_size_x_img2_, int cell_size_y_img2_); +}; + +////////////////////////////////////// UNIFORM SAMPLER //////////////////////////////////////////// +class UniformSampler : public Sampler { +public: + static Ptr create(int state, int sample_size_, int points_size_); +}; + +/////////////////////////////////// PROSAC (SIMPLE) SAMPLER /////////////////////////////////////// +class ProsacSimpleSampler : public Sampler { +public: + static Ptr create(int state, int points_size_, int sample_size_, + int max_prosac_samples_count); +}; + +////////////////////////////////////// PROSAC SAMPLER //////////////////////////////////////////// +class ProsacSampler : public Sampler { +public: + static Ptr create(int state, int points_size_, int sample_size_, + int growth_max_samples); + // return number of samples generated (for prosac termination). + virtual int getKthSample () const = 0; + // return constant reference of growth function of prosac sampler (for prosac termination) + virtual const std::vector &getGrowthFunction () const = 0; + virtual void setTerminationLength (int termination_length) = 0; +}; + +////////////////////////// NAPSAC (N adjacent points sample consensus) SAMPLER //////////////////// +class NapsacSampler : public Sampler { +public: + static Ptr create(int state, int points_size_, int sample_size_, + const Ptr &neighborhood_graph_); +}; + +////////////////////////////////////// P-NAPSAC SAMPLER ///////////////////////////////////////// +class ProgressiveNapsac : public Sampler { +public: + static Ptr create(int state, int points_size_, int sample_size_, + const std::vector> &layers, int sampler_length); +}; + +///////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////// TERMINATION /////////////////////////////////////////// +class TerminationCriteria : public Algorithm { +public: + // update termination object by given @model and @inlier number. + // and return maximum number of predicted iteration + virtual int update(const Mat &model, int inlier_number) = 0; + // clone termination + virtual Ptr clone () const = 0; +}; + +//////////////////////////////// STANDARD TERMINATION /////////////////////////////////////////// +class StandardTerminationCriteria : public TerminationCriteria { +public: + static Ptr create(double confidence, int points_size_, + int sample_size_, int max_iterations_); +}; + +///////////////////////////////////// SPRT TERMINATION ////////////////////////////////////////// +class SPRTTermination : public TerminationCriteria { +public: + static Ptr create(const std::vector &sprt_histories_, + double confidence, int points_size_, int sample_size_, int max_iterations_); +}; + +///////////////////////////// PROGRESSIVE-NAPSAC-SPRT TERMINATION ///////////////////////////////// +class SPRTPNapsacTermination : public TerminationCriteria { +public: + static Ptr create(const std::vector& + sprt_histories_, double confidence, int points_size_, int sample_size_, + int max_iterations_, double relax_coef_); +}; + +////////////////////////////////////// PROSAC TERMINATION ///////////////////////////////////////// +class ProsacTerminationCriteria : public TerminationCriteria { +public: + static Ptr create(const Ptr &sampler_, + const Ptr &error_, int points_size_, int sample_size, double confidence, + int max_iters, int min_termination_length, double beta, double non_randomness_phi, + double inlier_thresh); +}; + +////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////// UTILS //////////////////////////////////////////////// +namespace Utils { + /* + * calibrate points: [x'; 1] = K^-1 [x; 1] + * @points is matrix N x 4. + * @norm_points is output matrix N x 4 with calibrated points. + */ + void calibratePoints (const Mat &K1, const Mat &K2, const Mat &points, Mat &norm_points); + void calibrateAndNormalizePointsPnP (const Mat &K, const Mat &pts, Mat &calib_norm_pts); + void normalizeAndDecalibPointsPnP (const Mat &K, Mat &pts, Mat &calib_norm_pts); + void decomposeProjection (const Mat &P, Mat &K_, Mat &R, Mat &t, bool same_focal=false); + double getCalibratedThreshold (double threshold, const Mat &K1, const Mat &K2); + float findMedian (std::vector &array); +} +namespace Math { + // return skew symmetric matrix + Matx33d getSkewSymmetric(const Vec3d &v_); + // eliminate matrix with m rows and n columns to be upper triangular. + void eliminateUpperTriangular (std::vector &a, int m, int n); + Matx33d rotVec2RotMat (const Vec3d &v); + Vec3d rotMat2RotVec (const Matx33d &R); +} + +///////////////////////////////////////// RANDOM GENERATOR ///////////////////////////////////// +class RandomGenerator : public Algorithm { +public: + virtual ~RandomGenerator() override = default; + // interval is <0, max_range); + virtual void resetGenerator (int max_range) = 0; + // return sample filled with random numbers + virtual void generateUniqueRandomSet (std::vector &sample) = 0; + // fill @sample of size @subset_size with random numbers in range <0, @max_range) + virtual void generateUniqueRandomSet (std::vector &sample, int subset_size, + int max_range) = 0; + // fill @sample of size @sample.size() with random numbers in range <0, @max_range) + virtual void generateUniqueRandomSet (std::vector &sample, int max_range) = 0; + // return subset=sample size + virtual void setSubsetSize (int subset_sz) = 0; + virtual int getSubsetSize () const = 0; + // return random number from <0, max_range), where max_range is from constructor + virtual int getRandomNumber () = 0; + // return random number from <0, max_rng) + virtual int getRandomNumber (int max_rng) = 0; + virtual const std::vector &generateUniqueRandomSubset (std::vector &array1, + int size1) = 0; + virtual Ptr clone (int state) const = 0; +}; + +class UniformRandomGenerator : public RandomGenerator { +public: + static Ptr create (int state); + static Ptr create (int state, int max_range, int subset_size_); +}; + +/////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////// LOCAL OPTIMIZATION ///////////////////////////////////////// +class LocalOptimization : public Algorithm { +public: + virtual ~LocalOptimization() override = default; + /* + * Refine so-far-the-best RANSAC model in local optimization step. + * @best_model: so-far-the-best model + * @new_model: output refined new model. + * @new_model_score: score of @new_model. + * Returns bool if model was refined successfully, false - otherwise + */ + virtual bool refineModel (const Mat &best_model, const Score &best_model_score, + Mat &new_model, Score &new_model_score) = 0; + virtual Ptr clone(int state) const = 0; +}; + +//////////////////////////////////// GRAPH CUT LO //////////////////////////////////////// +class GraphCut : public LocalOptimization { +public: + static Ptr + create(const Ptr &estimator_, const Ptr &error_, + const Ptr &quality_, const Ptr &neighborhood_graph_, + const Ptr &lo_sampler_, double threshold_, + double spatial_coherence_term, int gc_iters); +}; + +//////////////////////////////////// INNER + ITERATIVE LO /////////////////////////////////////// +class InnerIterativeLocalOptimization : public LocalOptimization { +public: + static Ptr + create(const Ptr &estimator_, const Ptr &quality_, + const Ptr &lo_sampler_, int pts_size, double threshold_, + bool is_iterative_, int lo_iter_sample_size_, int lo_inner_iterations, + int lo_iter_max_iterations, double threshold_multiplier); +}; + +class SigmaConsensus : public LocalOptimization { +public: + static Ptr + create(const Ptr &estimator_, const Ptr &error_, + const Ptr &quality, const Ptr &verifier_, + int max_lo_sample_size, int number_of_irwls_iters_, + int DoF, double sigma_quantile, double upper_incomplete_of_sigma_quantile, + double C_, double maximum_thr); +}; + +/////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////// FINAL MODEL POLISHER ////////////////////////////////////// +class FinalModelPolisher : public Algorithm { +public: + virtual ~FinalModelPolisher() override = default; + /* + * Polish so-far-the-best RANSAC model in the end of RANSAC. + * @model: input final RANSAC model. + * @new_model: output polished model. + * @new_score: score of output model. + * Return true if polishing was successful, false - otherwise. + */ + virtual bool polishSoFarTheBestModel (const Mat &model, const Score &best_model_score, + Mat &new_model, Score &new_model_score) = 0; +}; + +///////////////////////////////////// LEAST SQUARES POLISHER ////////////////////////////////////// +class LeastSquaresPolishing : public FinalModelPolisher { +public: + static Ptr create (const Ptr &estimator_, + const Ptr &quality_, int lsq_iterations); +}; + +/////////////////////////////////// RANSAC OUTPUT /////////////////////////////////// +class RansacOutput : public Algorithm { +public: + virtual ~RansacOutput() override = default; + static Ptr create(const Mat &model_, + const std::vector &inliers_mask_, + int time_mcs_, double score_, int number_inliers_, int number_iterations_, + int number_estimated_models_, int number_good_models_); + + // Return inliers' indices. size of vector = number of inliers + virtual const std::vector &getInliers() = 0; + // Return inliers mask. Vector of points size. 1-inlier, 0-outlier. + virtual const std::vector &getInliersMask() const = 0; + virtual int getTimeMicroSeconds() const = 0; + virtual int getTimeMicroSeconds1() const = 0; + virtual int getTimeMilliSeconds2() const = 0; + virtual int getTimeSeconds3() const = 0; + virtual int getNumberOfInliers() const = 0; + virtual int getNumberOfMainIterations() const = 0; + virtual int getNumberOfGoodModels () const = 0; + virtual int getNumberOfEstimatedModels () const = 0; + virtual const Mat &getModel() const = 0; +}; + +////////////////////////////////////////////// MODEL ///////////////////////////////////////////// + +class Model : public Algorithm { +public: + virtual bool isFundamental () const = 0; + virtual bool isHomography () const = 0; + virtual bool isEssential () const = 0; + virtual bool isPnP () const = 0; + + // getters + virtual int getSampleSize () const = 0; + virtual bool isParallel() const = 0; + virtual int getMaxNumHypothesisToTestBeforeRejection() const = 0; + virtual PolishingMethod getFinalPolisher () const = 0; + virtual LocalOptimMethod getLO () const = 0; + virtual ErrorMetric getError () const = 0; + virtual EstimationMethod getEstimator () const = 0; + virtual ScoreMethod getScore () const = 0; + virtual int getMaxIters () const = 0; + virtual double getConfidence () const = 0; + virtual double getThreshold () const = 0; + virtual VerificationMethod getVerifier () const = 0; + virtual SamplingMethod getSampler () const = 0; + virtual double getTimeForModelEstimation () const = 0; + virtual double getSPRTdelta () const = 0; + virtual double getSPRTepsilon () const = 0; + virtual double getSPRTavgNumModels () const = 0; + virtual NeighborSearchMethod getNeighborsSearch () const = 0; + virtual int getKNN () const = 0; + virtual int getCellSize () const = 0; + virtual int getGraphRadius() const = 0; + virtual double getRelaxCoef () const = 0; + + virtual int getFinalLSQIterations () const = 0; + virtual int getDegreesOfFreedom () const = 0; + virtual double getSigmaQuantile () const = 0; + virtual double getUpperIncompleteOfSigmaQuantile () const = 0; + virtual double getLowerIncompleteOfSigmaQuantile () const = 0; + virtual double getC () const = 0; + virtual double getMaximumThreshold () const = 0; + virtual double getGraphCutSpatialCoherenceTerm () const = 0; + virtual int getLOSampleSize () const = 0; + virtual int getLOThresholdMultiplier() const = 0; + virtual int getLOIterativeSampleSize() const = 0; + virtual int getLOIterativeMaxIters() const = 0; + virtual int getLOInnerMaxIters() const = 0; + virtual const std::vector &getGridCellNumber () const = 0; + virtual int getRandomGeneratorState () const = 0; + + // setters + virtual void setLocalOptimization (LocalOptimMethod lo_) = 0; + virtual void setKNearestNeighhbors (int knn_) = 0; + virtual void setNeighborsType (NeighborSearchMethod neighbors) = 0; + virtual void setCellSize (int cell_size_) = 0; + virtual void setParallel (bool is_parallel) = 0; + virtual void setVerifier (VerificationMethod verifier_) = 0; + virtual void setPolisher (PolishingMethod polisher_) = 0; + virtual void setError (ErrorMetric error_) = 0; + virtual void setLOIterations (int iters) = 0; + virtual void setLOIterativeIters (int iters) = 0; + virtual void setLOSampleSize (int lo_sample_size) = 0; + virtual void setRandomGeneratorState (int state) = 0; + + virtual void maskRequired (bool required) = 0; + virtual bool isMaskRequired () const = 0; + static Ptr create(double threshold_, EstimationMethod estimator_, SamplingMethod sampler_, + double confidence_=0.95, int max_iterations_=5000, ScoreMethod score_ =ScoreMethod::SCORE_METHOD_MSAC); +}; + +Mat findHomography(InputArray srcPoints, InputArray dstPoints, int method, + double ransacReprojThreshold, OutputArray mask, + const int maxIters, const double confidence); + +Mat findFundamentalMat( InputArray points1, InputArray points2, + int method, double ransacReprojThreshold, double confidence, + int maxIters, OutputArray mask=noArray()); + +bool solvePnPRansac( InputArray objectPoints, InputArray imagePoints, + InputArray cameraMatrix, InputArray distCoeffs, + OutputArray rvec, OutputArray tvec, + bool useExtrinsicGuess, int iterationsCount, + float reprojectionError, double confidence, + OutputArray inliers, int flags); + +Mat findEssentialMat( InputArray points1, InputArray points2, + InputArray cameraMatrix1, + int method, double prob, + double threshold, OutputArray mask); + +Mat estimateAffine2D(InputArray from, InputArray to, OutputArray inliers, + int method, double ransacReprojThreshold, int maxIters, + double confidence, int refineIters); + +void saveMask (OutputArray mask, const std::vector &inliers_mask); +void setParameters (Ptr ¶ms, EstimationMethod estimator, const UsacParams &usac_params, + bool mask_need); +bool run (const Ptr ¶ms, InputArray points1, InputArray points2, int state, + Ptr &ransac_output, InputArray K1_, InputArray K2_, + InputArray dist_coeff1, InputArray dist_coeff2); +}} + +#endif //OPENCV_USAC_USAC_HPP diff --git a/modules/calib3d/src/usac/degeneracy.cpp b/modules/calib3d/src/usac/degeneracy.cpp new file mode 100644 index 0000000..9378cb1 --- /dev/null +++ b/modules/calib3d/src/usac/degeneracy.cpp @@ -0,0 +1,336 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#include "../precomp.hpp" +#include "../usac.hpp" + +namespace cv { namespace usac { +class EpipolarGeometryDegeneracyImpl : public EpipolarGeometryDegeneracy { +private: + const Mat * points_mat; + const float * const points; // i-th row xi1 yi1 xi2 yi2 + const int min_sample_size; +public: + explicit EpipolarGeometryDegeneracyImpl (const Mat &points_, int sample_size_) : + points_mat(&points_), points ((float*) points_.data), min_sample_size (sample_size_) {} + /* + * Do oriented constraint to verify if epipolar geometry is in front or behind the camera. + * Return: true if all points are in front of the camers w.r.t. tested epipolar geometry - satisfies constraint. + * false - otherwise. + */ + inline bool isModelValid(const Mat &F, const std::vector &sample) const override { + return isModelValid(F, sample, min_sample_size); + } + + /* Oriented constraint: + * x'^T F x = 0 + * e' × x' ~+ Fx <=> λe' × x' = Fx, λ > 0 + * e × x ~+ x'^T F + */ + inline bool isModelValid(const Mat &F_, const std::vector &sample, int sample_size_) const override { + // F is of rank 2, taking cross product of two rows we obtain null vector of F + Vec3d ec_mat = F_.row(0).cross(F_.row(2)); + auto * ec = ec_mat.val; // of size 3x1 + + // e is zero vector, recompute e + if (ec[0] <= 1.9984e-15 && ec[0] >= -1.9984e-15 && + ec[1] <= 1.9984e-15 && ec[1] >= -1.9984e-15 && + ec[2] <= 1.9984e-15 && ec[2] >= -1.9984e-15) { + ec_mat = F_.row(1).cross(F_.row(2)); + ec = ec_mat.val; + } + // F is 9x1 row-major ordered F matrix. ec is 3x1 + const auto * const F = (double *) F_.data; + + // without loss of generality, let the first point in sample be in front of the camera. + int pt = 4*sample[0]; + // s1 = F11 * x2 + F21 * y2 + F31 * 1 + // s2 = e'_2 * 1 - e'_3 * y1 + // sign1 = s1 * s2 + const double sign1 = (F[0]*points[pt+2]+F[3]*points[pt+3]+F[6])*(ec[1]-ec[2]*points[pt+1]); + + int num_pts_behind = 0; + for (int i = 1; i < sample_size_; i++) { + pt = 4 * sample[i]; + // if signum of the first point and tested point differs + // then two points are on different sides of the camera. + if (sign1*(F[0]*points[pt+2]+F[3]*points[pt+3]+F[6])*(ec[1]-ec[2]*points[pt+1])<0) + // if 3 points are behind the camera for non-minimal sample then model is + // not valid. Testing by one point as in case for minimal sample is not very + // precise. The number 3 was chosen experimentally. + if (min_sample_size == sample_size_ || ++num_pts_behind >= 3) + return false; + } + return true; + } + + Ptr clone(int /*state*/) const override { + return makePtr(*points_mat, min_sample_size); + } +}; +void EpipolarGeometryDegeneracy::recoverRank (Mat &model) { + /* + * Do singular value decomposition. + * Make last eigen value zero of diagonal matrix of singular values. + */ + Matx33d U, Vt; + Vec3d w; + SVD::compute(model, w, U, Vt, SVD::FULL_UV + SVD::MODIFY_A); + model = Mat(U * Matx33d(w(0), 0, 0, 0, w(1), 0, 0, 0, 0) * Vt); +} +Ptr EpipolarGeometryDegeneracy::create (const Mat &points_, + int sample_size_) { + return makePtr(points_, sample_size_); +} + +class HomographyDegeneracyImpl : public HomographyDegeneracy { +private: + const Mat * points_mat; + const float * const points; +public: + explicit HomographyDegeneracyImpl (const Mat &points_) : + points_mat(&points_), points ((float *)points_.data) {} + + inline bool isSampleGood (const std::vector &sample) const override { + const int smpl1 = 4*sample[0], smpl2 = 4*sample[1], smpl3 = 4*sample[2], smpl4 = 4*sample[3]; + // planar correspondences must lie on the same side of any line from two points in sample + const float x1 = points[smpl1], y1 = points[smpl1+1], X1 = points[smpl1+2], Y1 = points[smpl1+3]; + const float x2 = points[smpl2], y2 = points[smpl2+1], X2 = points[smpl2+2], Y2 = points[smpl2+3]; + const float x3 = points[smpl3], y3 = points[smpl3+1], X3 = points[smpl3+2], Y3 = points[smpl3+3]; + const float x4 = points[smpl4], y4 = points[smpl4+1], X4 = points[smpl4+2], Y4 = points[smpl4+3]; + // line from points 1 and 2 + const float ab_cross_x = y1 - y2, ab_cross_y = x2 - x1, ab_cross_z = x1 * y2 - y1 * x2; + const float AB_cross_x = Y1 - Y2, AB_cross_y = X2 - X1, AB_cross_z = X1 * Y2 - Y1 * X2; + + // check if points 3 and 4 are on the same side of line ab on both images + if ((ab_cross_x * x3 + ab_cross_y * y3 + ab_cross_z) * + (AB_cross_x * X3 + AB_cross_y * Y3 + AB_cross_z) < 0) + return false; + if ((ab_cross_x * x4 + ab_cross_y * y4 + ab_cross_z) * + (AB_cross_x * X4 + AB_cross_y * Y4 + AB_cross_z) < 0) + return false; + + // line from points 3 and 4 + const float cd_cross_x = y3 - y4, cd_cross_y = x4 - x3, cd_cross_z = x3 * y4 - y3 * x4; + const float CD_cross_x = Y3 - Y4, CD_cross_y = X4 - X3, CD_cross_z = X3 * Y4 - Y3 * X4; + + // check if points 1 and 2 are on the same side of line cd on both images + if ((cd_cross_x * x1 + cd_cross_y * y1 + cd_cross_z) * + (CD_cross_x * X1 + CD_cross_y * Y1 + CD_cross_z) < 0) + return false; + if ((cd_cross_x * x2 + cd_cross_y * y2 + cd_cross_z) * + (CD_cross_x * X2 + CD_cross_y * Y2 + CD_cross_z) < 0) + return false; + + // Checks if points are not collinear + // If area of triangle constructed with 3 points is less then threshold then points are collinear: + // |x1 y1 1| |x1 y1 1| + // (1/2) det |x2 y2 1| = (1/2) det |x2-x1 y2-y1 0| = (1/2) det |x2-x1 y2-y1| < threshold + // |x3 y3 1| |x3-x1 y3-y1 0| |x3-x1 y3-y1| + // for points on the first image + if (fabsf((x2-x1) * (y3-y1) - (y2-y1) * (x3-x1)) * 0.5 < FLT_EPSILON) return false; //1,2,3 + if (fabsf((x2-x1) * (y4-y1) - (y2-y1) * (x4-x1)) * 0.5 < FLT_EPSILON) return false; //1,2,4 + if (fabsf((x3-x1) * (y4-y1) - (y3-y1) * (x4-x1)) * 0.5 < FLT_EPSILON) return false; //1,3,4 + if (fabsf((x3-x2) * (y4-y2) - (y3-y2) * (x4-x2)) * 0.5 < FLT_EPSILON) return false; //2,3,4 + // for points on the second image + if (fabsf((X2-X1) * (Y3-Y1) - (Y2-Y1) * (X3-X1)) * 0.5 < FLT_EPSILON) return false; //1,2,3 + if (fabsf((X2-X1) * (Y4-Y1) - (Y2-Y1) * (X4-X1)) * 0.5 < FLT_EPSILON) return false; //1,2,4 + if (fabsf((X3-X1) * (Y4-Y1) - (Y3-Y1) * (X4-X1)) * 0.5 < FLT_EPSILON) return false; //1,3,4 + if (fabsf((X3-X2) * (Y4-Y2) - (Y3-Y2) * (X4-X2)) * 0.5 < FLT_EPSILON) return false; //2,3,4 + + return true; + } + Ptr clone(int /*state*/) const override { + return makePtr(*points_mat); + } +}; +Ptr HomographyDegeneracy::create (const Mat &points_) { + return makePtr(points_); +} + +///////////////////////////////// Fundamental Matrix Degeneracy /////////////////////////////////// +class FundamentalDegeneracyImpl : public FundamentalDegeneracy { +private: + RNG rng; + const Ptr quality; + const float * const points; + const Mat * points_mat; + const Ptr h_reproj_error; + const EpipolarGeometryDegeneracyImpl ep_deg; + // threshold to find inliers for homography model + const double homography_threshold, log_conf = log(0.05); + // points (1-7) to verify in sample + std::vector> h_sample {{0,1,2},{3,4,5},{0,1,6},{3,4,6},{2,5,6}}; + const int points_size, sample_size; +public: + + FundamentalDegeneracyImpl (int state, const Ptr &quality_, const Mat &points_, + int sample_size_, double homography_threshold_) : + rng (state), quality(quality_), points((float *) points_.data), points_mat(&points_), + h_reproj_error(ReprojectionErrorForward::create(points_)), + ep_deg (points_, sample_size_), homography_threshold (homography_threshold_), + points_size (quality_->getPointsSize()), sample_size (sample_size_) { + if (sample_size_ == 8) { + // add more homography samples to test for 8-points F + h_sample.emplace_back(std::vector{0, 1, 7}); + h_sample.emplace_back(std::vector{0, 2, 7}); + h_sample.emplace_back(std::vector{3, 5, 7}); + h_sample.emplace_back(std::vector{3, 6, 7}); + h_sample.emplace_back(std::vector{2, 4, 7}); + } + } + inline bool isModelValid(const Mat &F, const std::vector &sample) const override { + return ep_deg.isModelValid(F, sample); + } + inline bool isModelValid(const Mat &F, const std::vector &sample, int sample_size_) const override { + return ep_deg.isModelValid(F, sample, sample_size_); + } + + bool recoverIfDegenerate (const std::vector &sample, const Mat &F_best, + Mat &non_degenerate_model, Score &non_degenerate_model_score) override { + non_degenerate_model_score = Score(); // set worst case + + // According to Two-view Geometry Estimation Unaffected by a Dominant Plane + // (http://cmp.felk.cvut.cz/~matas/papers/chum-degen-cvpr05.pdf) + // only 5 homographies enough to test + // triplets {1,2,3}, {4,5,6}, {1,2,7}, {4,5,7} and {3,6,7} + + // H = A - e' (M^-1 b)^T + // A = [e']_x F + // b_i = (x′i × (A xi))^T (x′i × e′)‖x′i×e′‖^−2, + // M is a 3×3 matrix with rows x^T_i + // epipole e' is left nullspace of F s.t. e′^T F=0, + + // find e', null space of F^T + Vec3d e_prime = F_best.col(0).cross(F_best.col(2)); + if (fabs(e_prime(0)) < 1e-10 && fabs(e_prime(1)) < 1e-10 && + fabs(e_prime(2)) < 1e-10) // if e' is zero + e_prime = F_best.col(1).cross(F_best.col(2)); + + const Matx33d A = Math::getSkewSymmetric(e_prime) * Matx33d(F_best); + + Vec3d xi_prime(0,0,1), xi(0,0,1), b; + Matx33d M(0,0,1,0,0,1,0,0,1); // last column of M is 1 + + bool is_model_degenerate = false; + for (const auto &h_i : h_sample) { // only 5 samples + for (int pt_i = 0; pt_i < 3; pt_i++) { + // find b and M + const int smpl = 4*sample[h_i[pt_i]]; + xi[0] = points[smpl]; + xi[1] = points[smpl+1]; + xi_prime[0] = points[smpl+2]; + xi_prime[1] = points[smpl+3]; + + // (x′i × e') + const Vec3d xprime_X_eprime = xi_prime.cross(e_prime); + + // (x′i × (A xi)) + const Vec3d xprime_X_Ax = xi_prime.cross(A * xi); + + // x′i × (A xi))^T (x′i × e′) / ‖x′i×e′‖^2, + b[pt_i] = xprime_X_Ax.dot(xprime_X_eprime) / + std::pow(norm(xprime_X_eprime), 2); + + // M from x^T + M(pt_i, 0) = xi[0]; + M(pt_i, 1) = xi[1]; + } + + // compute H + const Matx33d H = A - e_prime * (M.inv() * b).t(); + + int inliers_on_plane = 0; + h_reproj_error->setModelParameters(Mat(H)); + + // find inliers from sample, points related to H, x' ~ Hx + for (int s = 0; s < sample_size; s++) + if (h_reproj_error->getError(sample[s]) < homography_threshold) + inliers_on_plane++; + + // if there are at least 5 points lying on plane then F is degenerate + if (inliers_on_plane >= 5) { + is_model_degenerate = true; + + Mat newF; + const Score newF_score = planeAndParallaxRANSAC(H, newF); + if (newF_score.isBetter(non_degenerate_model_score)) { + // store non degenerate model + non_degenerate_model_score = newF_score; + newF.copyTo(non_degenerate_model); + } + } + } + return is_model_degenerate; + } + Ptr clone(int state) const override { + return makePtr(state, quality->clone(), *points_mat, + sample_size, homography_threshold); + } +private: + // RANSAC with plane-and-parallax to find new Fundamental matrix + Score planeAndParallaxRANSAC (const Matx33d &H, Mat &best_F) { + int max_iters = 100; // with 95% confidence assume at least 17% of inliers + Score best_score; + for (int iters = 0; iters < max_iters; iters++) { + // draw two random points + int h_outlier1 = rng.uniform(0, points_size); + int h_outlier2 = rng.uniform(0, points_size); + while (h_outlier1 == h_outlier2) + h_outlier2 = rng.uniform(0, points_size); + + // find outliers of homography H + if (h_reproj_error->getError(h_outlier1) > homography_threshold && + h_reproj_error->getError(h_outlier2) > homography_threshold) { + + // do plane and parallax with outliers of H + const Vec3d pt1 (points[4*h_outlier1], points[4*h_outlier1+1], 1); + const Vec3d pt2 (points[4*h_outlier2], points[4*h_outlier2+1], 1); + const Vec3d pt1_prime (points[4*h_outlier1+2],points[4*h_outlier1+3],1); + const Vec3d pt2_prime (points[4*h_outlier2+2],points[4*h_outlier2+3],1); + + // F = [(p1' x Hp1) x (p2' x Hp2)]_x H + const Matx33d F = Math::getSkewSymmetric((pt1_prime.cross(H * pt1)).cross + (pt2_prime.cross(H * pt2))) * H; + + const Score score = quality->getScore(Mat(F)); + if (score.isBetter(best_score)) { + best_score = score; + best_F = Mat(F); + const double predicted_iters = log_conf / log(1 - std::pow + (static_cast(score.inlier_number) / points_size, 2)); + + if (! std::isinf(predicted_iters) && predicted_iters < max_iters) + max_iters = static_cast(predicted_iters); + } + } + } + return best_score; + } +}; +Ptr FundamentalDegeneracy::create (int state, const Ptr &quality_, + const Mat &points_, int sample_size_, double homography_threshold_) { + return makePtr(state, quality_, points_, sample_size_, + homography_threshold_); +} + +class EssentialDegeneracyImpl : public EssentialDegeneracy { +private: + const Mat * points_mat; + const int sample_size; + const EpipolarGeometryDegeneracyImpl ep_deg; +public: + explicit EssentialDegeneracyImpl (const Mat &points, int sample_size_) : + points_mat(&points), sample_size(sample_size_), ep_deg (points, sample_size_) {} + inline bool isModelValid(const Mat &E, const std::vector &sample) const override { + return ep_deg.isModelValid(E, sample); + } + Ptr clone(int /*state*/) const override { + return makePtr(*points_mat, sample_size); + } +}; +Ptr EssentialDegeneracy::create (const Mat &points_, int sample_size_) { + return makePtr(points_, sample_size_); +} +}} diff --git a/modules/calib3d/src/usac/dls_solver.cpp b/modules/calib3d/src/usac/dls_solver.cpp new file mode 100644 index 0000000..0bffc6c --- /dev/null +++ b/modules/calib3d/src/usac/dls_solver.cpp @@ -0,0 +1,877 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +// Copyright (C) 2019 Czech Technical University. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// +// * Neither the name of Czech Technical University nor the +// names of its contributors may be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +// Please contact the author of this library if you have any questions. +// Author: Daniel Barath (barath.daniel@sztaki.mta.hu) +// Modification: Maksym Ivashechkin (ivashmak@cmp.felk.cvut.cz) + +#include "../precomp.hpp" +#include "../usac.hpp" +#if defined(HAVE_EIGEN) +#include +#elif defined(HAVE_LAPACK) +#include "opencv_lapack.h" +#endif + +namespace cv { namespace usac { +// This is the estimator class for estimating a homography matrix between two images. A model estimation method and error calculation method are implemented +class DLSPnPImpl : public DLSPnP { +private: + const Mat * points_mat, * calib_norm_points_mat, * K_mat; +#if defined(HAVE_LAPACK) || defined(HAVE_EIGEN) + const Mat &K; + const float * const calib_norm_points, * const points; +#endif +public: + explicit DLSPnPImpl (const Mat &points_, const Mat &calib_norm_points_, const Mat &K_) : + points_mat(&points_), calib_norm_points_mat(&calib_norm_points_), K_mat (&K_) +#if defined(HAVE_LAPACK) || defined(HAVE_EIGEN) + , K(K_), calib_norm_points((float*)calib_norm_points_.data), points((float*)points_.data) +#endif + {} + // return minimal sample size required for non-minimal estimation. + int getMinimumRequiredSampleSize() const override { return 3; } + // return maximum number of possible solutions. + int getMaxNumberOfSolutions () const override { return 27; } + Ptr clone () const override { + return makePtr(*points_mat, *calib_norm_points_mat, *K_mat); + } +#if defined(HAVE_LAPACK) || defined(HAVE_EIGEN) + int estimate(const std::vector &sample, int sample_number, + std::vector &models_, const std::vector &/*weights_*/) const override { + if (sample_number < getMinimumRequiredSampleSize()) + return 0; + + // Estimate the model parameters from the given point sample + // using weighted fitting if possible. + + // Holds the normalized feature positions cross multiplied with itself + // i.e. n * n^t. This value is used multiple times so it is efficient to + // pre-compute it. + std::vector normalized_feature_cross(sample_number); + std::vector world_points(sample_number); + const Matx33d eye = Matx33d::eye(); + + // The bottom-right symmetric block matrix of inverse(A^T * A). Matrix H from + // Eq. 25 in the Appendix of the DLS paper. + Matx33d h_inverse = sample_number * eye; + + // Compute V*W*b with the rotation parameters factored out. This is the + // translation parameterized by the 9 entries of the rotation matrix. + Matx translation_factor = Matx::zeros(); + + for (int i = 0; i < sample_number; i++) { + const int idx_world = 5 * sample[i], idx_calib = 3 * sample[i]; + Vec3d normalized_feature_pos(calib_norm_points[idx_calib], + calib_norm_points[idx_calib+1], + calib_norm_points[idx_calib+2]); + normalized_feature_cross[i] = normalized_feature_pos * normalized_feature_pos.t(); + world_points[i] = Vec3d(points[idx_world + 2], points[idx_world + 3], points[idx_world + 4]); + + h_inverse -= normalized_feature_cross[i]; + translation_factor += (normalized_feature_cross[i] - eye) * leftMultiplyMatrix(world_points[i]); + } + + const Matx33d h_matrix = h_inverse.inv(); + translation_factor = h_matrix * translation_factor; + + // Compute the cost function J' of Eq. 17 in DLS paper. This is a factorized + // version where the rotation matrix parameters have been pulled out. The + // entries to this equation are the coefficients to the cost function which is + // a quartic in the rotation parameters. + Matx ls_cost_coefficients = Matx::zeros(); + for (int i = 0; i < sample_number; i++) + ls_cost_coefficients += + (leftMultiplyMatrix(world_points[i]) + translation_factor).t() * + (eye - normalized_feature_cross[i]) * + (leftMultiplyMatrix(world_points[i]) + translation_factor); + + // Extract the coefficients of the jacobian (Eq. 18) from the + // ls_cost_coefficients matrix. The jacobian represent 3 monomials in the + // rotation parameters. Each entry of the jacobian will be 0 at the roots of + // the polynomial, so we can arrange a system of polynomials from these + // equations. + double f1_coeff[20], f2_coeff[20], f3_coeff[20]; + extractJacobianCoefficients(ls_cost_coefficients.val, f1_coeff, f2_coeff, f3_coeff); + + // We create one equation with random terms that is generally non-zero at the + // roots of our system. + RNG rng; + const double macaulay_term[4] = { 100 * rng.uniform(-1.,1.), 100 * rng.uniform(-1.,1.), + 100 * rng.uniform(-1.,1.), 100 * rng.uniform(-1.,1.) }; + + // Create Macaulay matrix that will be used to solve our polynonomial system. + Mat macaulay_matrix = Mat_::zeros(120, 120); + createMacaulayMatrix(f1_coeff, f2_coeff, f3_coeff, macaulay_term, (double*)macaulay_matrix.data); + + // Via the Schur complement trick, the top-left of the Macaulay matrix + // contains a multiplication matrix whose eigenvectors correspond to solutions + // to our system of equations. + Mat sol; + if (!solve(macaulay_matrix.colRange(27, 120).rowRange(27, 120), + macaulay_matrix.colRange(0 , 27).rowRange(27, 120), sol, DECOMP_LU)) + return 0; + + const Mat solution_polynomial = macaulay_matrix.colRange(0,27).rowRange(0,27) - + (macaulay_matrix.colRange(27,120).rowRange(0,27) * sol); + + // Extract eigenvectors of the solution polynomial to obtain the roots which + // are contained in the entries of the eigenvectors. +#ifdef HAVE_EIGEN + Eigen::Map> sol_poly((double*)solution_polynomial.data); + const Eigen::EigenSolver eigen_solver(sol_poly); + const auto &eigen_vectors = eigen_solver.eigenvectors(); + const auto &eigen_values = eigen_solver.eigenvalues(); +#else + int mat_order = 27, info, lda = 27, ldvl = 1, ldvr = 27, lwork = 500; + double wr[27], wi[27] = {0}; // 27 = mat_order + std::vector work(lwork), eig_vecs(729); + char jobvl = 'N', jobvr = 'V'; // only left eigen vectors are computed + dgeev_(&jobvl, &jobvr, &mat_order, (double*)solution_polynomial.data, &lda, wr, wi, nullptr, &ldvl, + &eig_vecs[0], &ldvr, &work[0], &lwork, &info); + if (info != 0) return 0; +#endif + models_ = std::vector(); models_.reserve(3); + const int max_pts_to_eval = std::min(sample_number, 100); + std::vector pts_random_shuffle(sample_number); + for (int i = 0; i < sample_number; i++) + pts_random_shuffle[i] = i; + randShuffle(pts_random_shuffle); + + for (int i = 0; i < 27; i++) { + // If the rotation solutions are real, treat this as a valid candidate + // rotation. + // The first entry of the eigenvector should equal 1 according to our + // polynomial, so we must divide each solution by the first entry. + +#ifdef HAVE_EIGEN + if (eigen_values(i).imag() != 0) + continue; + const double eigen_vec_1i = 1 / eigen_vectors(0, i).real(); + const double s1 = eigen_vectors(9, i).real() * eigen_vec_1i, + s2 = eigen_vectors(3, i).real() * eigen_vec_1i, + s3 = eigen_vectors(1, i).real() * eigen_vec_1i; +#else + if (wi[i] != 0) + continue; + const double eigen_vec_1i = 1 / eig_vecs[mat_order*i]; + const double s1 = eig_vecs[mat_order*i+9] * eigen_vec_1i, + s2 = eig_vecs[mat_order*i+3] * eigen_vec_1i, + s3 = eig_vecs[mat_order*i+1] * eigen_vec_1i; +#endif + // Compute the rotation (which is the transpose rotation of our solution) + // and translation. + const double qi = s1, qi2 = qi*qi, qj = s2, qj2 = qj*qj, qk = s3, qk2 = qk*qk; + const double s = 1 / (1 + qi2 + qj2 + qk2); + const Matx33d rot_mat (1-2*s*(qj2+qk2), 2*s*(qi*qj+qk), 2*s*(qi*qk-qj), + 2*s*(qi*qj-qk), 1-2*s*(qi2+qk2), 2*s*(qj*qk+qi), + 2*s*(qi*qk+qj), 2*s*(qj*qk-qi), 1-2*s*(qi2+qj2)); + const Matx31d soln_translation = translation_factor * rot_mat.reshape<9,1>(); + + // Check that all points are in front of the camera. Discard the solution + // if this is not the case. + bool all_points_in_front_of_camera = true; + const Vec3d r3 (rot_mat(2,0),rot_mat(2,1),rot_mat(2,2)); + const double z = soln_translation(2); + for (int pt = 0; pt < max_pts_to_eval; pt++) { + if (r3.dot(world_points[pts_random_shuffle[pt]]) + z < 0) { + all_points_in_front_of_camera = false; + break; + } + } + + if (all_points_in_front_of_camera) { + Mat model; +// hconcat(rot_mat, soln_translation, model); + hconcat(Math::rotVec2RotMat(Math::rotMat2RotVec(rot_mat)), soln_translation, model); + models_.emplace_back(K * model); + } + } + return static_cast(models_.size()); +#else + int estimate(const std::vector &/*sample*/, int /*sample_number*/, + std::vector &/*models_*/, const std::vector &/*weights_*/) const override { + return 0; +#endif + } + +protected: +#if defined(HAVE_LAPACK) || defined(HAVE_EIGEN) + const int indices[1968] = { + 0, 35, 83, 118, 120, 121, 154, 155, 174, 203, 219, 238, 241, 242, 274, 275, + 291, 294, 305, 323, 329, 339, 358, 360, 363, 395, 409, 436, 443, 478, 479, + 481, 483, 484, 514, 515, 523, 529, 534, 551, 556, 563, 579, 580, 598, 599, + 602, 604, 605, 634, 635, 641, 643, 649, 651, 654, 662, 665, 671, 676, 683, + 689, 699, 700, 711, 718, 719, 723, 726, 750, 755, 769, 795, 796, 803, 827, + 838, 839, 844, 846, 847, 870, 874, 875, 883, 885, 889, 894, 903, 911, 915, + 916, 923, 939, 940, 947, 952, 958, 959, 965, 967, 968, 990, 994, 1001, 1003, + 1005, 1006, 1009, 1011, 1014, 1022, 1023, 1025, 1026, 1031, 1035, 1036, + 1049, 1059, 1060, 1062, 1067, 1071, 1072, 1079, 1080, 1089, 1115, 1116, + 1163, 1164, 1168, 1198, 1201, 1209, 1210, 1233, 1234, 1235, 1236, 1254, + 1259, 1283, 1284, 1288, 1299, 1317, 1318, 1322, 1330, 1331, 1348, 1353, + 1354, 1355, 1356, 1371, 1374, 1377, 1379, 1385, 1403, 1404, 1408, 1409, + 1419, 1434, 1437, 1438, 1443, 1449, 1452, 1475, 1476, 1479, 1489, 1516, + 1519, 1523, 1524, 1528, 1536, 1558, 1559, 1564, 1570, 1572, 1573, 1593, + 1594, 1595, 1596, 1599, 1603, 1607, 1609, 1614, 1619, 1620, 1631, 1636, + 1639, 1643, 1644, 1648, 1650, 1656, 1659, 1660, 1677, 1678, 1679, 1685, + 1691, 1693, 1694, 1708, 1713, 1714, 1716, 1719, 1721, 1722, 1723, 1727, + 1729, 1731, 1734, 1736, 1737, 1739, 1740, 1742, 1745, 1751, 1756, 1759, + 1764, 1768, 1769, 1770, 1776, 1779, 1780, 1786, 1791, 1794, 1797, 1799, + 1806, 1812, 1815, 1829, 1830, 1835, 1836, 1839, 1849, 1874, 1875, 1876, + 1879, 1883, 1884, 1888, 1894, 1896, 1907, 1918, 1919, 1927, 1933, 1935, + 1936, 1949, 1950, 1953, 1954, 1956, 1959, 1963, 1964, 1965, 1967, 1969, + 1974, 1979, 1980, 1983, 1988, 1991, 1994, 1995, 1996, 1999, 2004, 2008, + 2010, 2014, 2016, 2017, 2019, 2020, 2027, 2032, 2037, 2039, 2048, 2054, + 2056, 2057, 2068, 2069, 2070, 2073, 2079, 2081, 2082, 2083, 2084, 2085, + 2086, 2087, 2091, 2096, 2097, 2099, 2100, 2102, 2103, 2105, 2106, 2108, + 2111, 2114, 2115, 2119, 2129, 2130, 2134, 2136, 2137, 2140, 2142, 2146, + 2147, 2151, 2152, 2154, 2157, 2169, 2178, 2195, 2196, 2213, 2242, 2243, + 2244, 2247, 2248, 2278, 2290, 2298, 2299, 2312, 2313, 2314, 2315, 2316, + 2333, 2334, 2339, 2341, 2362, 2363, 2364, 2367, 2368, 2379, 2396, 2397, + 2398, 2411, 2419, 2420, 2427, 2428, 2432, 2433, 2434, 2436, 2451, 2453, + 2454, 2455, 2457, 2459, 2461, 2465, 2482, 2484, 2487, 2488, 2489, 2499, + 2513, 2514, 2516, 2517, 2532, 2538, 2541, 2555, 2556, 2558, 2559, 2569, + 2573, 2596, 2598, 2599, 2602, 2603, 2604, 2607, 2608, 2612, 2616, 2638, + 2639, 2653, 2659, 2661, 2662, 2672, 2673, 2674, 2676, 2678, 2679, 2680, + 2683, 2687, 2689, 2693, 2694, 2699, 2700, 2701, 2711, 2712, 2716, 2718, + 2719, 2722, 2724, 2727, 2728, 2730, 2732, 2735, 2736, 2739, 2740, 2756, + 2757, 2759, 2774, 2780, 2782, 2783, 2787, 2788, 2792, 2793, 2798, 2799, + 2800, 2801, 2802, 2803, 2807, 2811, 2813, 2815, 2816, 2817, 2819, 2820, + 2821, 2822, 2825, 2831, 2832, 2838, 2839, 2842, 2847, 2849, 2850, 2852, + 2855, 2856, 2860, 2866, 2871, 2873, 2874, 2876, 2877, 2895, 2901, 2904, + 2909, 2910, 2916, 2918, 2919, 2929, 2932, 2933, 2953, 2954, 2955, 2956, + 2958, 2959, 2962, 2964, 2967, 2968, 2972, 2973, 2974, 2976, 2987, 2999, + 3016, 3022, 3024, 3025, 3029, 3030, 3032, 3033, 3038, 3039, 3040, 3043, + 3044, 3045, 3047, 3052, 3053, 3059, 3060, 3061, 3063, 3068, 3071, 3072, + 3073, 3074, 3075, 3078, 3079, 3082, 3087, 3090, 3092, 3093, 3094, 3095, + 3096, 3097, 3100, 3107, 3112, 3116, 3117, 3137, 3143, 3145, 3146, 3147, + 3148, 3149, 3152, 3158, 3160, 3161, 3162, 3164, 3165, 3166, 3167, 3172, + 3175, 3176, 3177, 3180, 3181, 3182, 3183, 3186, 3188, 3192, 3193, 3194, + 3198, 3210, 3212, 3213, 3214, 3215, 3217, 3222, 3226, 3231, 3232, 3233, + 3234, 3236, 3255, 3269, 3270, 3276, 3279, 3289, 3309, 3310, 3314, 3315, + 3316, 3319, 3324, 3328, 3331, 3334, 3336, 3347, 3350, 3359, 3366, 3390, + 3395, 3409, 3429, 3435, 3436, 3443, 3467, 3470, 3478, 3479, 3504, 3509, + 3510, 3518, 3519, 3532, 3533, 3549, 3550, 3553, 3554, 3555, 3558, 3559, + 3562, 3567, 3571, 3572, 3573, 3574, 3576, 3587, 3590, 3637, 3648, 3652, + 3670, 3673, 3677, 3681, 3685, 3691, 3693, 3698, 3749, 3757, 3758, 3770, + 3772, 3789, 3790, 3793, 3794, 3797, 3798, 3800, 3806, 3811, 3812, 3813, + 3814, 3818, 3830, 3888, 3890, 3893, 3920, 3921, 3922, 3925, 3926, 3927, + 3989, 3990, 3999, 4024, 4029, 4030, 4034, 4035, 4039, 4051, 4054, 4056, + 4063, 4067, 4070, 4109, 4118, 4132, 4144, 4149, 4150, 4153, 4154, 4158, + 4171, 4172, 4173, 4174, 4183, 4190, 4237, 4252, 4264, 4270, 4273, 4277, + 4291, 4293, 4298, 4303, 4325, 4354, 4361, 4363, 4369, 4371, 4374, 4382, + 4385, 4391, 4396, 4409, 4419, 4420, 4421, 4429, 4431, 4439, 4442, 4474, + 4475, 4491, 4494, 4505, 4523, 4529, 4539, 4549, 4558, 4590, 4609, 4624, + 4629, 4635, 4636, 4663, 4667, 4670, 4679, 4708, 4713, 4731, 4737, 4739, + 4745, 4769, 4785, 4788, 4789, 4794, 4797, 4827, 4828, 4832, 4855, 4857, + 4861, 4905, 4908, 4909, 4913, 4914, 4916, 4950, 4984, 4989, 4995, 5023, + 5027, 5030, 5067, 5071, 5095, 5098, 5145, 5148, 5153, 5155, 5189, 5224, + 5229, 5230, 5234, 5251, 5254, 5263, 5270, 5308, 5337, 5385, 5388, 5389, + 5394, 5427, 5455, 5505, 5508, 5513, 5572, 5584, 5590, 5593, 5611, 5613, + 5623, 5680, 5684, 5692, 5704, 5707, 5708, 5710, 5712, 5713, 5731, 5733, + 5735, 5737, 5743, 5744, 5790, 5803, 5805, 5823, 5824, 5827, 5829, 5831, + 5835, 5860, 5863, 5864, 5867, 5870, 5872, 5921, 5925, 5926, 5942, 5943, + 5946, 5981, 5982, 5985, 5989, 5991, 5992, 6041, 6062, 6101, 6105, 6109, + 6111, 6184, 6190, 6211, 6223, 6281, 6285, 6286, 6302, 6303, 6306, 6307, + 6309, 6341, 6342, 6344, 6349, 6350, 6351, 6352, 6424, 6429, 6463, 6470, + 6585, 6589, 6644, 6664, 6667, 6668, 6670, 6691, 6697, 6703, 6704, 6825, + 6828, 6904, 6907, 6943, 6944, 7006, 7024, 7026, 7027, 7062, 7063, 7064, + 7088, 7110, 7121, 7123, 7125, 7126, 7131, 7142, 7143, 7145, 7146, 7151, + 7155, 7169, 7180, 7181, 7182, 7187, 7189, 7191, 7192, 7208, 7230, 7241, + 7243, 7245, 7246, 7251, 7262, 7263, 7265, 7266, 7267, 7269, 7271, 7275, + 7289, 7300, 7302, 7304, 7307, 7310, 7311, 7312, 7362, 7376, 7421, 7425, + 7426, 7428, 7504, 7543, 7665, 7726, 7746, 7747, 7781, 7782, 7784, 7785, + 7846, 7864, 7866, 7867, 7901, 7902, 7903, 7904, 7966, 7986, 8021, 8022, + 8025, 8141, 8145, 8201, 8203, 8211, 8222, 8225, 8231, 8249, 8260, 8261, + 8265, 8269, 8271, 8317, 8328, 8332, 8353, 8357, 8361, 8365, 8373, 8378, + 8420, 8427, 8428, 8431, 8432, 8433, 8450, 8451, 8453, 8455, 8457, 8458, + 8459, 8461, 8465, 8480, 8482, 8486, 8487, 8489, 8513, 8514, 8515, 8516, + 8517, 8565, 8583, 8584, 8587, 8589, 8623, 8624, 8630, 8632, 8681, 8685, + 8686, 8702, 8703, 8704, 8706, 8707, 8709, 8742, 8743, 8744, 8750, 8751, + 8752, 8808, 8810, 8840, 8841, 8845, 8846, 8905, 8909, 8912, 8918, 8920, + 8924, 8925, 8927, 8932, 8940, 8941, 8943, 8947, 8948, 8949, 8950, 8952, + 8953, 8954, 8958, 8970, 8971, 8972, 8973, 8974, 8975, 8977, 8984, 8990, + 8992, 8996, 9021, 9036, 9037, 9038, 9039, 9049, 9050, 9053, 9076, 9077, + 9078, 9079, 9080, 9082, 9084, 9086, 9087, 9088, 9092, 9096, 9098, 9119, + 9168, 9201, 9205, 9274, 9291, 9294, 9305, 9329, 9339, 9345, 9349, 9387, + 9391, 9397, 9400, 9402, 9415, 9416, 9418, 9432, 9437, 9455, 9458, 9461, + 9466, 9468, 9473, 9475, 9522, 9524, 9526, 9536, 9546, 9548, 9577, 9581, + 9582, 9585, 9586, 9588, 9614, 9628, 9633, 9639, 9641, 9642, 9643, 9647, + 9651, 9656, 9657, 9659, 9660, 9662, 9665, 9671, 9679, 9689, 9690, 9696, + 9700, 9701, 9706, 9708, 9709, 9711, 9714, 9717, 9751, 9752, 9757, 9758, + 9760, 9767, 9768, 9770, 9778, 9780, 9781, 9792, 9797, 9798, 9800, 9801, + 9805, 9806, 9810, 9812, 9815, 9818, 9835, 9836, 9869, 9884, 9885, 9887, + 9900, 9903, 9904, 9907, 9908, 9909, 9910, 9914, 9930, 9931, 9934, 9937, + 9943, 9944, 9950, 9952, 9986, 9987, 9991, 9997, 10000, 10002, 10004, 10006, + 10012, 10015, 10016, 10018, 10026, 10028, 10032, 10033, 10037, 10053, 10055, + 10057, 10058, 10062, 10066, 10073, 10075, 10096, 10109, 10110, 10113, 10119, + 10123, 10124, 10125, 10127, 10139, 10140, 10143, 10147, 10148, 10149, 10150, + 10151, 10154, 10155, 10159, 10170, 10171, 10174, 10176, 10177, 10180, 10184, + 10187, 10190, 10192, 10197, 10225, 10229, 10231, 10232, 10237, 10238, 10240, + 10244, 10245, 10247, 10250, 10252, 10258, 10260, 10261, 10263, 10268, 10272, + 10273, 10274, 10277, 10278, 10280, 10286, 10290, 10292, 10293, 10294, 10295, + 10297, 10298, 10312, 10315, 10316, 10351, 10357, 10360, 10364, 10368, 10372, + 10378, 10388, 10392, 10393, 10397, 10401, 10405, 10413, 10415, 10417, 10418, + 10435, 10462, 10471, 10472, 10473, 10477, 10478, 10479, 10480, 10483, 10487, + 10490, 10493, 10498, 10499, 10500, 10501, 10511, 10512, 10517, 10518, 10519, + 10520, 10522, 10526, 10527, 10530, 10532, 10535, 10536, 10538, 10540, 10555, + 10556, 10557, 10587, 10591, 10597, 10600, 10602, 10608, 10615, 10616, 10618, + 10632, 10637, 10641, 10645, 10655, 10658, 10666, 10673, 10675, 10711, 10717, + 10720, 10724, 10732, 10738, 10747, 10748, 10750, 10752, 10753, 10757, 10771, + 10773, 10775, 10777, 10778, 10784, 10795, 10827, 10840, 10842, 10855, 10856, + 10872, 10895, 10901, 10905, 10906, 10908, 10913, 10943, 10947, 10948, 10951, + 10952, 10957, 10958, 10960, 10961, 10962, 10967, 10970, 10975, 10976, 10977, + 10978, 10980, 10981, 10982, 10992, 10997, 10998, 11000, 11006, 11010, 11012, + 11015, 11018, 11026, 11031, 11033, 11034, 11035, 11036, 11057, 11068, 11069, + 11081, 11082, 11084, 11085, 11086, 11087, 11096, 11097, 11100, 11102, 11103, + 11106, 11108, 11114, 11130, 11134, 11137, 11141, 11142, 11146, 11148, 11149, + 11151, 11152, 11154, 11177, 11188, 11189, 11201, 11202, 11204, 11205, 11206, + 11207, 11216, 11217, 11220, 11222, 11223, 11226, 11227, 11228, 11229, 11230, + 11234, 11250, 11251, 11254, 11257, 11262, 11264, 11266, 11270, 11271, 11272, + 11274, 11311, 11317, 11320, 11328, 11338, 11352, 11357, 11361, 11365, 11375, + 11378, 11395, 11426, 11427, 11440, 11442, 11444, 11446, 11452, 11455, 11456, + 11466, 11468, 11472, 11473, 11493, 11495, 11497, 11501, 11502, 11506, 11508, + 11513, 11543, 11547, 11548, 11552, 11558, 11560, 11561, 11562, 11567, 11575, + 11576, 11577, 11580, 11581, 11582, 11592, 11598, 11610, 11612, 11615, 11621, + 11626, 11628, 11629, 11631, 11633, 11634, 11636, 11682, 11684, 11686, 11696, + 11706, 11707, 11708, 11710, 11731, 11737, 11741, 11742, 11744, 11746, 11748, + 11788, 11801, 11802, 11807, 11816, 11817, 11820, 11822, 11850, 11861, 11865, + 11866, 11868, 11869, 11871, 11874, 11922, 11924, 11926, 11936, 11944, 11946, + 11947, 11948, 11950, 11971, 11977, 11982, 11983, 11984, 11986, 12051, 12065, + 12089, 12105, 12109, 12157, 12158, 12159, 12168, 12170, 12173, 12197, 12198, + 12199, 12200, 12201, 12202, 12205, 12206, 12207, 12212, 12216, 12218, 12277, + 12278, 12288, 12290, 12317, 12318, 12320, 12321, 12325, 12326, 12332, 12338, + 12397, 12408, 12437, 12441, 12445, 12458, 12491, 12508, 12513, 12514, 12516, + 12531, 12534, 12537, 12539, 12545, 12564, 12568, 12569, 12579, 12588, 12589, + 12594, 12597, 12620, 12627, 12628, 12632, 12633, 12651, 12653, 12655, 12657, + 12659, 12661, 12665, 12682, 12687, 12689, 12708, 12709, 12713, 12714, 12716, + 12717, 12747, 12748, 12751, 12752, 12770, 12775, 12777, 12778, 12781, 12800, + 12806, 12828, 12829, 12833, 12834, 12835, 12836, 12867, 12871, 12888, 12895, + 12898, 12921, 12925, 12948, 12953, 12955, 12996, 13008, 13010, 13013, 13040, + 13041, 13042, 13044, 13045, 13046, 13047, 13048, 13106, 13107, 13120, 13122, + 13124, 13126, 13132, 13135, 13136, 13146, 13147, 13148, 13150, 13152, 13153, + 13171, 13173, 13175, 13177, 13182, 13184, 13186, 13193, 13207, 13230, 13234, + 13243, 13245, 13249, 13254, 13263, 13267, 13269, 13271, 13275, 13276, 13299, + 13300, 13304, 13307, 13310, 13312, 13319, 13338, 13355, 13356, 13370, 13373, + 13400, 13402, 13403, 13404, 13406, 13407, 13408, 13438, 13459, 13471, 13472, + 13473, 13474, 13476, 13490, 13493, 13494, 13498, 13499, 13501, 13520, 13522, + 13524, 13526, 13527, 13528, 13539, 13555, 13556, 13557, 13591, 13592, 13593, + 13608, 13610, 13613, 13618, 13619, 13621, 13640, 13641, 13642, 13645, 13646, + 13647, 13675, 13676, 13677, 13711, 13712, 13728, 13730, 13738, 13741, 13760, + 13761, 13765, 13766, 13795, 13796, 13831, 13848, 13858, 13881, 13885, 13915, + 13944, 13949, 13950, 13957, 13958, 13959, 13970, 13972, 13973, 13993, 13994, + 13995, 13997, 13998, 13999, 14000, 14002, 14006, 14007, 14012, 14013, 14014, + 14016, 14018, 14027, 14069, 14077, 14078, 14088, 14090, 14092, 14113, 14114, + 14117, 14118, 14120, 14121, 14125, 14126, 14132, 14133, 14134, 14138, 14187, + 14188, 14191, 14192, 14208, 14210, 14215, 14217, 14218, 14221, 14240, 14241, + 14245, 14246, 14273, 14274, 14275, 14276, 14307, 14311, 14328, 14335, 14338, + 14361, 14365, 14393, 14395 + }; + void createMacaulayMatrix(const double a[20], const double b[20], + const double c[20], const double u[4], double * macaulay_matrix) const { + // The matrix is very large (14400 elements!) and sparse (1968 non-zero + // elements) so we load it from pre-computed values calculated in matlab. + + const double values[1968] = { + u[0], a[0], b[0], c[0], u[3], u[0], a[0], a[9], b[0], b[9], c[0], c[9], + u[3], u[0], a[9], a[13], a[0], b[9], b[0], b[13], c[0], c[9], c[13], u[2], + u[0], a[10], a[0], b[0], b[10], c[10], c[0], u[2], u[3], u[0], a[10], a[4], + a[0], a[9], b[10], b[0], b[9], b[4], c[10], c[0], c[4], c[9], u[2], u[3], + u[0], a[4], a[11], a[0], a[9], a[13], a[10], b[4], b[0], b[10], b[9], b[13], + b[11], c[10], c[4], c[9], c[0], c[11], c[13], u[2], u[0], a[0], a[14], + a[10], b[0], b[10], b[14], c[0], c[14], c[10], u[2], u[3], u[0], a[9], + a[14], a[5], a[10], a[0], a[4], b[14], b[0], b[10], b[9], b[4], b[5], c[14], + c[10], c[9], c[0], c[5], c[4], u[2], u[3], u[0], a[13], a[5], a[10], a[4], + a[9], a[0], a[11], a[14], b[5], b[10], b[9], b[14], b[0], b[4], b[13], + b[11], c[14], c[5], c[4], c[0], c[13], c[10], c[9], c[11], u[1], u[0], a[8], + a[0], b[8], b[0], c[0], c[8], u[1], u[3], u[0], a[0], a[8], a[3], a[9], + b[8], b[0], b[3], b[9], c[9], c[8], c[0], c[3], u[1], u[3], u[0], a[0], + a[9], a[3], a[7], a[13], a[8], b[3], b[0], b[9], b[8], b[7], b[13], c[13], + c[8], c[3], c[0], c[9], c[7], u[1], u[2], u[0], a[2], a[10], a[0], a[8], + b[8], b[0], b[2], b[10], c[10], c[0], c[2], c[8], u[1], u[2], u[3], u[0], + a[10], a[2], a[16], a[4], a[9], a[8], a[0], a[3], b[2], b[10], b[0], b[8], + b[3], b[9], b[16], b[4], c[4], c[0], c[9], c[2], c[8], c[10], c[16], c[3], + u[1], u[2], u[3], u[0], a[10], a[4], a[16], a[11], a[13], a[8], a[0], a[3], + a[9], a[7], a[2], b[16], b[0], b[10], b[4], b[9], b[8], b[2], b[3], b[7], + b[13], b[11], c[11], c[2], c[9], c[13], c[16], c[3], c[0], c[8], c[10], + c[4], c[7], u[1], u[2], u[0], a[0], a[8], a[17], a[14], a[10], a[2], b[0], + b[8], b[2], b[10], b[17], b[14], c[14], c[0], c[10], c[8], c[17], c[2], + u[1], u[2], u[3], u[0], a[9], a[3], a[14], a[17], a[5], a[4], a[2], a[0], + a[8], a[10], a[16], b[17], b[14], b[10], b[8], b[0], b[2], b[9], b[3], + b[16], b[4], b[5], c[5], c[10], c[9], c[4], c[0], c[17], c[2], c[3], c[8], + c[14], c[16], u[1], u[2], u[3], u[0], a[14], a[13], a[7], a[5], a[11], a[2], + a[10], a[16], a[9], a[3], a[8], a[4], a[17], b[10], b[14], b[5], b[4], b[2], + b[3], b[17], b[8], b[9], b[16], b[13], b[7], b[11], c[17], c[4], c[13], + c[11], c[9], c[16], c[8], c[10], c[7], c[2], c[3], c[14], c[5], u[1], u[0], + a[12], a[8], a[0], b[0], b[12], b[8], c[0], c[8], c[12], u[1], u[3], u[0], + a[0], a[8], a[12], a[18], a[3], a[9], b[12], b[8], b[0], b[9], b[18], b[3], + c[9], c[3], c[12], c[0], c[8], c[18], u[1], u[3], u[0], a[0], a[8], a[9], + a[3], a[18], a[7], a[12], a[13], b[18], b[0], b[8], b[3], b[9], b[12], + b[13], b[7], c[13], c[7], c[12], c[18], c[0], c[8], c[9], c[3], u[1], u[2], + u[0], a[1], a[2], a[0], a[8], a[12], a[10], b[12], b[0], b[8], b[10], b[1], + b[2], c[10], c[2], c[0], c[8], c[1], c[12], u[1], u[2], u[3], u[0], a[10], + a[2], a[1], a[16], a[9], a[3], a[0], a[12], a[8], a[18], a[4], b[1], b[2], + b[8], b[10], b[12], b[0], b[18], b[9], b[3], b[4], b[16], c[4], c[16], c[8], + c[9], c[0], c[3], c[1], c[12], c[10], c[2], c[18], u[1], u[2], u[3], u[0], + a[10], a[2], a[4], a[16], a[13], a[7], a[9], a[12], a[8], a[18], a[3], a[1], + a[11], b[10], b[8], b[2], b[16], b[3], b[4], b[12], b[1], b[18], b[9], + b[13], b[7], b[11], c[11], c[1], c[3], c[13], c[9], c[7], c[18], c[8], + c[12], c[10], c[2], c[4], c[16], u[1], u[2], u[0], a[8], a[12], a[17], + a[10], a[2], a[1], a[0], a[14], b[0], b[8], b[12], b[1], b[10], b[2], b[14], + b[17], c[14], c[17], c[10], c[0], c[8], c[2], c[12], c[1], u[1], u[2], u[3], + u[0], a[3], a[18], a[14], a[17], a[4], a[16], a[10], a[1], a[8], a[12], + a[2], a[9], a[5], b[17], b[2], b[14], b[12], b[8], b[1], b[10], b[9], b[3], + b[18], b[4], b[16], b[5], c[5], c[2], c[4], c[9], c[3], c[10], c[16], c[8], + c[1], c[18], c[12], c[14], c[17], u[1], u[2], u[3], u[0], a[14], a[17], + a[7], a[5], a[11], a[4], a[1], a[2], a[3], a[18], a[12], a[16], a[13], + b[14], b[2], b[17], b[16], b[5], b[1], b[18], b[12], b[3], b[4], b[13], + b[7], b[11], c[16], c[11], c[13], c[7], c[4], c[3], c[12], c[2], c[1], + c[18], c[14], c[17], c[5], u[2], a[10], a[2], a[6], a[14], a[17], b[8], + b[0], b[10], b[2], b[17], b[14], b[6], c[6], c[0], c[10], c[14], c[2], c[8], + c[17], u[2], a[10], a[6], a[14], b[0], b[10], b[14], b[6], c[10], c[0], + c[6], c[14], u[2], a[2], a[1], a[14], a[17], a[10], a[6], b[12], b[8], + b[10], b[2], b[1], b[14], b[17], b[6], c[6], c[8], c[14], c[10], c[2], + c[17], c[1], c[12], a[17], a[6], a[1], b[19], b[1], b[17], b[6], c[6], + c[19], c[1], c[17], a[1], a[14], a[17], a[6], a[2], b[19], b[12], b[2], + b[1], b[14], b[17], b[6], c[6], c[12], c[17], c[2], c[1], c[14], c[19], + a[8], a[12], a[19], b[12], b[8], b[19], c[8], c[12], c[19], a[14], a[17], + a[6], b[8], b[2], b[10], b[14], b[17], b[6], c[10], c[14], c[6], c[8], + c[17], c[2], a[17], a[6], a[14], b[12], b[1], b[2], b[14], b[17], b[6], + c[2], c[6], c[14], c[17], c[12], c[1], a[6], a[17], b[19], b[1], b[17], + b[6], c[1], c[17], c[6], c[19], u[3], a[11], a[9], a[13], a[15], a[4], + b[11], b[9], b[4], b[13], b[15], c[4], c[11], c[13], c[0], c[10], c[9], + c[15], u[3], a[13], a[15], a[9], b[13], b[9], b[15], c[9], c[13], c[0], + c[15], a[14], a[6], b[0], b[10], b[14], b[6], c[0], c[14], c[10], c[6], + a[13], a[15], a[7], b[13], b[15], b[7], c[7], c[8], c[9], c[3], c[13], + c[15], a[13], a[7], a[15], b[13], b[7], b[15], c[12], c[3], c[18], c[13], + c[7], c[15], a[6], b[10], b[14], b[6], c[10], c[6], c[14], a[7], a[15], + b[7], b[15], c[19], c[18], c[7], c[15], a[6], b[2], b[17], b[14], b[6], + c[14], c[6], c[2], c[17], a[15], b[15], c[3], c[13], c[7], c[15], a[15], + b[15], c[18], c[7], c[15], a[6], b[1], b[17], b[6], c[17], c[6], c[1], a[6], + a[17], a[5], b[18], b[1], b[17], b[16], b[6], b[5], c[16], c[5], c[6], + c[17], c[18], c[1], a[5], a[6], a[14], b[14], b[9], b[10], b[4], b[6], b[5], + c[6], c[9], c[10], c[5], c[4], c[14], a[11], a[15], a[13], b[11], b[15], + b[13], c[4], c[13], c[14], c[5], c[11], c[15], a[15], b[15], c[13], c[4], + c[11], c[15], b[17], b[6], c[6], c[17], a[5], a[11], a[4], b[5], b[11], + b[4], b[13], b[15], c[14], c[4], c[13], c[6], c[15], c[5], c[11], b[14], + b[6], c[14], c[6], c[13], c[15], a[6], b[16], b[17], b[6], b[5], c[5], c[6], + c[16], c[17], c[7], c[15], b[5], b[6], c[5], c[6], a[6], b[11], b[6], b[5], + c[6], c[11], c[5], u[3], a[15], a[4], a[11], a[13], a[9], a[5], b[4], b[13], + b[5], b[9], b[11], b[15], c[5], c[11], c[10], c[9], c[15], c[14], c[4], + c[13], u[2], a[11], a[14], a[5], a[4], a[10], a[6], b[14], b[4], b[6], + b[10], b[9], b[13], b[5], b[11], c[6], c[5], c[10], c[9], c[11], c[13], + c[14], c[4], a[15], b[15], c[7], c[16], c[15], c[11], b[6], c[6], c[15], + a[11], b[11], b[15], c[5], c[11], c[15], c[6], a[5], b[15], b[5], b[11], + c[6], c[5], c[15], c[11], a[15], b[15], c[11], c[15], c[5], c[15], c[11], + a[13], a[15], a[11], b[13], b[11], b[15], c[11], c[15], c[9], c[10], c[4], + c[13], a[1], a[17], a[19], b[19], b[1], b[17], c[17], c[19], c[1], u[1], + a[8], a[12], a[9], a[3], a[18], a[13], a[19], a[7], b[8], b[12], b[9], + b[18], b[3], b[19], b[13], b[7], c[13], c[7], c[19], c[8], c[12], c[9], + c[3], c[18], a[6], b[6], b[4], b[14], b[5], c[4], c[14], c[5], c[6], a[6], + a[5], a[14], b[6], b[5], b[13], b[14], b[4], b[11], c[14], c[13], c[4], + c[11], c[6], c[5], a[12], a[19], b[19], b[12], c[12], c[19], u[2], a[16], + a[6], a[5], a[14], a[2], a[1], a[17], a[4], b[17], b[6], b[1], b[12], b[2], + b[18], b[3], b[14], b[4], b[16], b[5], c[17], c[3], c[5], c[4], c[16], + c[14], c[2], c[12], c[18], c[1], c[6], u[1], a[1], a[0], a[8], a[12], a[19], + a[10], a[2], b[19], b[0], b[8], b[12], b[10], b[2], b[1], c[10], c[2], c[1], + c[8], c[12], c[0], c[19], a[19], b[19], c[19], a[15], a[13], b[15], b[13], + c[13], c[15], c[0], c[9], a[16], a[11], a[15], a[7], a[18], b[16], b[18], + b[11], b[7], b[15], c[7], c[15], c[19], c[18], c[1], c[16], c[11], a[11], + a[15], a[7], b[11], b[7], b[15], c[15], c[16], c[7], c[17], c[11], c[5], + u[3], a[4], a[11], a[15], a[3], a[9], a[7], a[13], a[16], b[9], b[4], b[11], + b[13], b[3], b[16], b[7], b[15], c[16], c[13], c[15], c[7], c[8], c[9], + c[10], c[2], c[3], c[4], c[11], a[2], a[1], a[3], a[18], a[12], a[19], a[4], + a[16], b[2], b[19], b[1], b[12], b[3], b[18], b[16], b[4], c[4], c[16], + c[19], c[18], c[12], c[3], c[2], c[1], a[5], a[14], a[17], a[6], b[6], + b[17], b[3], b[2], b[14], b[16], b[4], b[5], c[6], c[4], c[5], c[14], c[3], + c[2], c[16], c[17], u[1], a[17], a[5], a[11], a[16], a[1], a[18], a[19], + a[7], b[17], b[1], b[5], b[19], b[18], b[16], b[7], b[11], c[7], c[16], + c[18], c[11], c[19], c[1], c[17], c[5], u[2], a[4], a[16], a[6], a[5], + a[17], a[10], a[2], a[14], b[6], b[14], b[2], b[8], b[10], b[3], b[9], + b[17], b[4], b[16], b[5], c[14], c[9], c[4], c[5], c[10], c[17], c[8], + c[16], c[3], c[2], c[6], u[1], a[18], a[14], a[17], a[4], a[16], a[2], + a[12], a[19], a[1], a[5], a[3], b[14], b[1], b[17], b[19], b[12], b[2], + b[3], b[18], b[4], b[16], b[5], c[5], c[1], c[16], c[3], c[18], c[2], c[12], + c[4], c[19], c[14], c[17], a[17], a[16], a[1], a[19], a[5], a[18], b[17], + b[19], b[1], b[18], b[16], b[5], c[5], c[18], c[1], c[19], c[16], c[17], + u[1], a[10], a[2], a[1], a[9], a[3], a[18], a[8], a[19], a[12], a[4], a[16], + b[10], b[1], b[12], b[2], b[19], b[8], b[9], b[3], b[18], b[4], b[16], c[4], + c[16], c[12], c[3], c[8], c[18], c[9], c[19], c[10], c[2], c[1], a[1], + a[16], a[7], a[18], a[19], a[11], b[1], b[19], b[16], b[18], b[7], b[11], + c[11], c[18], c[7], c[19], c[1], c[16], a[6], a[5], a[17], a[1], a[16], + b[6], b[19], b[1], b[18], b[17], b[16], b[5], c[18], c[16], c[17], c[1], + c[5], c[19], c[6], a[11], a[15], a[7], b[11], b[7], b[15], c[15], c[18], + c[1], c[7], c[16], c[11], u[1], a[2], a[1], a[4], a[16], a[13], a[7], a[3], + a[19], a[12], a[18], a[11], b[2], b[12], b[1], b[4], b[18], b[16], b[19], + b[3], b[13], b[7], b[11], c[11], c[18], c[7], c[3], c[13], c[12], c[19], + c[2], c[1], c[4], c[16], u[3], a[5], a[15], a[16], a[4], a[13], a[7], a[3], + a[11], b[4], b[5], b[11], b[16], b[7], b[3], b[13], b[15], c[11], c[15], + c[13], c[2], c[3], c[4], c[14], c[17], c[16], c[7], c[5], u[2], a[6], a[11], + a[17], a[14], a[4], a[16], a[2], a[5], b[14], b[6], b[5], b[17], b[16], + b[2], b[3], b[4], b[7], b[13], b[11], c[5], c[13], c[11], c[4], c[2], c[3], + c[14], c[7], c[17], c[16], c[6], a[1], a[18], a[19], a[16], b[1], b[19], + b[18], b[16], c[16], c[19], c[18], c[1], u[3], a[5], a[11], a[16], a[7], + a[18], a[15], b[5], b[16], b[18], b[7], b[11], b[15], c[15], c[11], c[7], + c[1], c[18], c[16], c[17], c[5], u[3], a[4], a[16], a[11], a[15], a[13], + a[18], a[3], a[7], b[4], b[3], b[16], b[7], b[11], b[18], b[13], b[15], + c[7], c[15], c[13], c[12], c[3], c[2], c[1], c[18], c[4], c[16], c[11], + a[5], a[11], a[16], b[5], b[16], b[7], b[11], b[15], c[15], c[11], c[17], + c[16], c[7], c[5], c[6], a[11], a[7], a[13], a[15], b[13], b[11], b[15], + b[7], c[15], c[3], c[2], c[13], c[4], c[16], c[7], c[11], a[6], a[5], a[17], + b[6], b[7], b[17], b[16], b[5], b[11], c[11], c[5], c[17], c[7], c[16], + c[6], a[15], b[15], c[15], c[9], c[13], a[8], a[12], a[19], a[10], a[2], + a[1], b[8], b[12], b[19], b[2], b[10], b[1], c[10], c[2], c[1], c[12], + c[19], c[8], a[12], a[19], a[2], a[1], b[12], b[19], b[1], b[2], c[2], c[1], + c[19], c[12], a[19], a[1], b[19], b[1], c[1], c[19], u[3], a[9], a[13], + a[7], a[15], a[3], b[7], b[9], b[13], b[3], b[15], c[15], c[3], c[7], c[0], + c[8], c[9], c[13], u[3], a[9], a[3], a[13], a[7], a[18], a[15], b[9], b[3], + b[7], b[13], b[18], b[15], c[15], c[18], c[8], c[12], c[9], c[3], c[13], + c[7], a[3], a[18], a[13], a[7], a[15], b[3], b[18], b[13], b[7], b[15], + c[15], c[12], c[19], c[3], c[18], c[13], c[7], a[18], a[7], a[15], b[18], + b[7], b[15], c[15], c[19], c[18], c[7], a[19], a[0], a[8], a[12], b[8], + b[0], b[12], b[19], c[0], c[8], c[12], c[19], u[2], a[6], a[5], a[17], + a[16], a[1], a[11], b[6], b[17], b[1], b[18], b[16], b[7], b[5], b[11], + c[7], c[11], c[5], c[16], c[1], c[18], c[17], c[6], u[2], a[4], a[6], a[14], + a[10], a[5], b[6], b[10], b[0], b[9], b[14], b[4], b[5], c[6], c[14], c[0], + c[4], c[9], c[10], c[5], u[1], a[19], a[12], a[0], a[8], b[0], b[8], b[19], + b[12], c[0], c[8], c[12], c[19], u[1], a[0], a[8], a[12], a[19], a[18], + a[9], a[3], b[19], b[0], b[12], b[8], b[9], b[3], b[18], c[9], c[3], c[18], + c[19], c[0], c[8], c[12], a[8], a[12], a[19], a[9], a[3], a[18], b[8], + b[19], b[12], b[3], b[9], b[18], c[9], c[3], c[18], c[8], c[12], c[19], + a[12], a[19], a[3], a[18], b[12], b[19], b[18], b[3], c[3], c[18], c[12], + c[19], a[19], a[18], b[19], b[18], c[18], c[19], u[1], a[12], a[19], a[10], + a[2], a[1], a[14], a[8], a[17], b[8], b[12], b[19], b[10], b[2], b[1], + b[14], b[17], c[14], c[17], c[2], c[8], c[12], c[1], c[10], c[19], a[19], + a[2], a[1], a[14], a[17], a[12], b[12], b[19], b[2], b[1], b[17], b[14], + c[14], c[17], c[1], c[12], c[19], c[2], a[12], a[19], a[3], a[18], a[13], + a[7], b[12], b[19], b[3], b[18], b[7], b[13], c[13], c[7], c[12], c[19], + c[3], c[18], a[19], a[18], a[7], b[19], b[18], b[7], c[7], c[19], c[18] + }; + for (int i = 0; i < 1968; i++) + macaulay_matrix[indices[i]] = values[i]; + } +#endif + + // Transforms a 3 - vector in a 3x9 matrix such that : + // R * v = leftMultiplyMatrix(v) * vec(R) + // Where R is a rotation matrix and vec(R) converts R to a 9x1 vector. + Matx leftMultiplyMatrix(const Vec3d& v) const { + Matx left_mult_mat = Matx::zeros(); + left_mult_mat(0,0) = v[0]; left_mult_mat(0,1) = v[1]; left_mult_mat(0,2) = v[2]; + left_mult_mat(1,3) = v[0]; left_mult_mat(1,4) = v[1]; left_mult_mat(1,5) = v[2]; + left_mult_mat(2,6) = v[0]; left_mult_mat(2,7) = v[1]; left_mult_mat(2,8) = v[2]; + return left_mult_mat; + } + + // Extracts the coefficients of the Jacobians of the LS cost function (which is + // parameterized by the 3 rotation coefficients s1, s2, s3). + void extractJacobianCoefficients(const double * const D, + double f1_coeff[20], double f2_coeff[20], double f3_coeff[20]) const { + f1_coeff[0] = + 2 * D[5] - 2 * D[7] + 2 * D[41] - 2 * D[43] + 2 * D[45] + + 2 * D[49] + 2 * D[53] - 2 * D[63] - 2 * D[67] - 2 * D[71] + + 2 * D[77] - 2 * D[79]; // constant term + f1_coeff[1] = + (6 * D[1] + 6 * D[3] + 6 * D[9] - 6 * D[13] - 6 * D[17] + + 6 * D[27] - 6 * D[31] - 6 * D[35] - 6 * D[37] - 6 * D[39] - + 6 * D[73] - 6 * D[75]); // s1^2 * s2 + f1_coeff[2] = + (4 * D[6] - 4 * D[2] + 8 * D[14] - 8 * D[16] - 4 * D[18] + + 4 * D[22] + 4 * D[26] + 8 * D[32] - 8 * D[34] + 4 * D[38] - + 4 * D[42] + 8 * D[46] + 8 * D[48] + 4 * D[54] - 4 * D[58] - + 4 * D[62] - 8 * D[64] - 8 * D[66] + 4 * D[74] - + 4 * D[78]); // s1 * s2 + f1_coeff[3] = + (4 * D[1] - 4 * D[3] + 4 * D[9] - 4 * D[13] - 4 * D[17] + + 8 * D[23] - 8 * D[25] - 4 * D[27] + 4 * D[31] + 4 * D[35] - + 4 * D[37] + 4 * D[39] + 8 * D[47] + 8 * D[51] + 8 * D[59] - + 8 * D[61] - 8 * D[65] - 8 * D[69] - 4 * D[73] + + 4 * D[75]); // s1 * s3 + f1_coeff[4] = (8 * D[10] - 8 * D[20] - 8 * D[30] + 8 * D[50] + + 8 * D[60] - 8 * D[70]); // s2 * s3 + f1_coeff[5] = + (4 * D[14] - 2 * D[6] - 2 * D[2] + 4 * D[16] - 2 * D[18] + + 2 * D[22] - 2 * D[26] + 4 * D[32] + 4 * D[34] + 2 * D[38] + + 2 * D[42] + 4 * D[46] + 4 * D[48] - 2 * D[54] + 2 * D[58] - + 2 * D[62] + 4 * D[64] + 4 * D[66] - 2 * D[74] - + 2 * D[78]); // s2^2 * s3 + f1_coeff[6] = (2 * D[13] - 2 * D[3] - 2 * D[9] - 2 * D[1] - + 2 * D[17] - 2 * D[27] + 2 * D[31] - 2 * D[35] + + 2 * D[37] + 2 * D[39] - 2 * D[73] - 2 * D[75]); // s2^3 + f1_coeff[7] = + (4 * D[8] - 4 * D[0] + 8 * D[20] + 8 * D[24] + 4 * D[40] + + 8 * D[56] + 8 * D[60] + 4 * D[72] - 4 * D[80]); // s1 * s3^2 + f1_coeff[8] = + (4 * D[0] - 4 * D[40] - 4 * D[44] + 8 * D[50] - 8 * D[52] - + 8 * D[68] + 8 * D[70] - 4 * D[76] - 4 * D[80]); // s1 + f1_coeff[9] = (2 * D[2] + 2 * D[6] + 4 * D[14] - 4 * D[16] + + 2 * D[18] + 2 * D[22] + 2 * D[26] - 4 * D[32] + + 4 * D[34] + 2 * D[38] + 2 * D[42] + 4 * D[46] - + 4 * D[48] + 2 * D[54] + 2 * D[58] + 2 * D[62] - + 4 * D[64] + 4 * D[66] + 2 * D[74] + 2 * D[78]); // s3 + f1_coeff[10] = (2 * D[1] + 2 * D[3] + 2 * D[9] + 2 * D[13] + + 2 * D[17] - 4 * D[23] + 4 * D[25] + 2 * D[27] + + 2 * D[31] + 2 * D[35] + 2 * D[37] + 2 * D[39] - + 4 * D[47] + 4 * D[51] + 4 * D[59] - 4 * D[61] + + 4 * D[65] - 4 * D[69] + 2 * D[73] + 2 * D[75]); // s2 + f1_coeff[11] = + (2 * D[17] - 2 * D[3] - 2 * D[9] - 2 * D[13] - 2 * D[1] + + 4 * D[23] + 4 * D[25] - 2 * D[27] - 2 * D[31] + 2 * D[35] - + 2 * D[37] - 2 * D[39] + 4 * D[47] + 4 * D[51] + 4 * D[59] + + 4 * D[61] + 4 * D[65] + 4 * D[69] + 2 * D[73] + + 2 * D[75]); // s2 * s3^2 + f1_coeff[12] = + (6 * D[5] - 6 * D[7] - 6 * D[41] + 6 * D[43] + 6 * D[45] - + 6 * D[49] - 6 * D[53] - 6 * D[63] + 6 * D[67] + 6 * D[71] - + 6 * D[77] + 6 * D[79]); // s1^2 + f1_coeff[13] = + (2 * D[7] - 2 * D[5] + 4 * D[11] + 4 * D[15] + 4 * D[19] - + 4 * D[21] - 4 * D[29] - 4 * D[33] - 2 * D[41] + 2 * D[43] - + 2 * D[45] - 2 * D[49] + 2 * D[53] + 4 * D[55] - 4 * D[57] + + 2 * D[63] + 2 * D[67] - 2 * D[71] + 2 * D[77] - + 2 * D[79]); // s3^2 + f1_coeff[14] = + (2 * D[7] - 2 * D[5] - 4 * D[11] + 4 * D[15] - 4 * D[19] - + 4 * D[21] - 4 * D[29] + 4 * D[33] + 2 * D[41] - 2 * D[43] - + 2 * D[45] + 2 * D[49] - 2 * D[53] + 4 * D[55] + 4 * D[57] + + 2 * D[63] - 2 * D[67] + 2 * D[71] - 2 * D[77] + + 2 * D[79]); // s2^2 + f1_coeff[15] = + (2 * D[26] - 2 * D[6] - 2 * D[18] - 2 * D[22] - 2 * D[2] - + 2 * D[38] - 2 * D[42] - 2 * D[54] - 2 * D[58] + 2 * D[62] + + 2 * D[74] + 2 * D[78]); // s3^3 + f1_coeff[16] = + (4 * D[5] + 4 * D[7] + 8 * D[11] + 8 * D[15] + 8 * D[19] + + 8 * D[21] + 8 * D[29] + 8 * D[33] - 4 * D[41] - 4 * D[43] + + 4 * D[45] - 4 * D[49] - 4 * D[53] + 8 * D[55] + 8 * D[57] + + 4 * D[63] - 4 * D[67] - 4 * D[71] - 4 * D[77] - + 4 * D[79]); // s1 * s2 * s3 + f1_coeff[17] = + (4 * D[4] - 4 * D[0] + 8 * D[10] + 8 * D[12] + 8 * D[28] + + 8 * D[30] + 4 * D[36] - 4 * D[40] + 4 * D[80]); // s1 * s2^2 + f1_coeff[18] = + (6 * D[2] + 6 * D[6] + 6 * D[18] - 6 * D[22] - 6 * D[26] - + 6 * D[38] - 6 * D[42] + 6 * D[54] - 6 * D[58] - 6 * D[62] - + 6 * D[74] - 6 * D[78]); // s1^2 * s3 + f1_coeff[19] = + (4 * D[0] - 4 * D[4] - 4 * D[8] - 4 * D[36] + 4 * D[40] + + 4 * D[44] - 4 * D[72] + 4 * D[76] + 4 * D[80]); // s1^3 + + f2_coeff[0] = + -2 * D[2] + 2 * D[6] - 2 * D[18] - 2 * D[22] - 2 * D[26] - + 2 * D[38] + 2 * D[42] + 2 * D[54] + 2 * D[58] + 2 * D[62] - + 2 * D[74] + 2 * D[78]; // constant term + f2_coeff[1] = + (4 * D[4] - 4 * D[0] + 8 * D[10] + 8 * D[12] + 8 * D[28] + + 8 * D[30] + 4 * D[36] - 4 * D[40] + 4 * D[80]); // s1^2 * s2 + f2_coeff[2] = + (4 * D[7] - 4 * D[5] - 8 * D[11] + 8 * D[15] - 8 * D[19] - + 8 * D[21] - 8 * D[29] + 8 * D[33] + 4 * D[41] - 4 * D[43] - + 4 * D[45] + 4 * D[49] - 4 * D[53] + 8 * D[55] + 8 * D[57] + + 4 * D[63] - 4 * D[67] + 4 * D[71] - 4 * D[77] + + 4 * D[79]); // s1 * s2 + f2_coeff[3] = (8 * D[10] - 8 * D[20] - 8 * D[30] + 8 * D[50] + + 8 * D[60] - 8 * D[70]); // s1 * s3 + f2_coeff[4] = + (4 * D[3] - 4 * D[1] - 4 * D[9] + 4 * D[13] - 4 * D[17] - + 8 * D[23] - 8 * D[25] + 4 * D[27] - 4 * D[31] + 4 * D[35] + + 4 * D[37] - 4 * D[39] - 8 * D[47] + 8 * D[51] + 8 * D[59] + + 8 * D[61] - 8 * D[65] + 8 * D[69] - 4 * D[73] + + 4 * D[75]); // s2 * s3 + f2_coeff[5] = + (6 * D[41] - 6 * D[7] - 6 * D[5] + 6 * D[43] - 6 * D[45] + + 6 * D[49] - 6 * D[53] - 6 * D[63] + 6 * D[67] - 6 * D[71] - + 6 * D[77] - 6 * D[79]); // s2^2 * s3 + f2_coeff[6] = + (4 * D[0] - 4 * D[4] + 4 * D[8] - 4 * D[36] + 4 * D[40] - + 4 * D[44] + 4 * D[72] - 4 * D[76] + 4 * D[80]); // s2^3 + f2_coeff[7] = + (2 * D[17] - 2 * D[3] - 2 * D[9] - 2 * D[13] - 2 * D[1] + + 4 * D[23] + 4 * D[25] - 2 * D[27] - 2 * D[31] + 2 * D[35] - + 2 * D[37] - 2 * D[39] + 4 * D[47] + 4 * D[51] + 4 * D[59] + + 4 * D[61] + 4 * D[65] + 4 * D[69] + 2 * D[73] + + 2 * D[75]); // s1 * s3^2 + f2_coeff[8] = (2 * D[1] + 2 * D[3] + 2 * D[9] + 2 * D[13] + + 2 * D[17] - 4 * D[23] + 4 * D[25] + 2 * D[27] + + 2 * D[31] + 2 * D[35] + 2 * D[37] + 2 * D[39] - + 4 * D[47] + 4 * D[51] + 4 * D[59] - 4 * D[61] + + 4 * D[65] - 4 * D[69] + 2 * D[73] + 2 * D[75]); // s1 + f2_coeff[9] = (2 * D[5] + 2 * D[7] - 4 * D[11] + 4 * D[15] - + 4 * D[19] + 4 * D[21] + 4 * D[29] - 4 * D[33] + + 2 * D[41] + 2 * D[43] + 2 * D[45] + 2 * D[49] + + 2 * D[53] + 4 * D[55] - 4 * D[57] + 2 * D[63] + + 2 * D[67] + 2 * D[71] + 2 * D[77] + 2 * D[79]); // s3 + f2_coeff[10] = + (8 * D[20] - 4 * D[8] - 4 * D[0] - 8 * D[24] + 4 * D[40] - + 8 * D[56] + 8 * D[60] - 4 * D[72] - 4 * D[80]); // s2 + f2_coeff[11] = + (4 * D[0] - 4 * D[40] + 4 * D[44] + 8 * D[50] + 8 * D[52] + + 8 * D[68] + 8 * D[70] + 4 * D[76] - 4 * D[80]); // s2 * s3^2 + f2_coeff[12] = + (2 * D[6] - 2 * D[2] + 4 * D[14] - 4 * D[16] - 2 * D[18] + + 2 * D[22] + 2 * D[26] + 4 * D[32] - 4 * D[34] + 2 * D[38] - + 2 * D[42] + 4 * D[46] + 4 * D[48] + 2 * D[54] - 2 * D[58] - + 2 * D[62] - 4 * D[64] - 4 * D[66] + 2 * D[74] - + 2 * D[78]); // s1^2 + f2_coeff[13] = + (2 * D[2] - 2 * D[6] + 4 * D[14] + 4 * D[16] + 2 * D[18] + + 2 * D[22] - 2 * D[26] - 4 * D[32] - 4 * D[34] + 2 * D[38] - + 2 * D[42] + 4 * D[46] - 4 * D[48] - 2 * D[54] - 2 * D[58] + + 2 * D[62] + 4 * D[64] - 4 * D[66] - 2 * D[74] + + 2 * D[78]); // s3^2 + f2_coeff[14] = + (6 * D[2] - 6 * D[6] + 6 * D[18] - 6 * D[22] + 6 * D[26] - + 6 * D[38] + 6 * D[42] - 6 * D[54] + 6 * D[58] - 6 * D[62] + + 6 * D[74] - 6 * D[78]); // s2^2 + f2_coeff[15] = + (2 * D[53] - 2 * D[7] - 2 * D[41] - 2 * D[43] - 2 * D[45] - + 2 * D[49] - 2 * D[5] - 2 * D[63] - 2 * D[67] + 2 * D[71] + + 2 * D[77] + 2 * D[79]); // s3^3 + f2_coeff[16] = + (8 * D[14] - 4 * D[6] - 4 * D[2] + 8 * D[16] - 4 * D[18] + + 4 * D[22] - 4 * D[26] + 8 * D[32] + 8 * D[34] + 4 * D[38] + + 4 * D[42] + 8 * D[46] + 8 * D[48] - 4 * D[54] + 4 * D[58] - + 4 * D[62] + 8 * D[64] + 8 * D[66] - 4 * D[74] - + 4 * D[78]); // s1 * s2 * s3 + f2_coeff[17] = + (6 * D[13] - 6 * D[3] - 6 * D[9] - 6 * D[1] - 6 * D[17] - + 6 * D[27] + 6 * D[31] - 6 * D[35] + 6 * D[37] + 6 * D[39] - + 6 * D[73] - 6 * D[75]); // s1 * s2^2 + f2_coeff[18] = + (2 * D[5] + 2 * D[7] + 4 * D[11] + 4 * D[15] + 4 * D[19] + + 4 * D[21] + 4 * D[29] + 4 * D[33] - 2 * D[41] - 2 * D[43] + + 2 * D[45] - 2 * D[49] - 2 * D[53] + 4 * D[55] + 4 * D[57] + + 2 * D[63] - 2 * D[67] - 2 * D[71] - 2 * D[77] - + 2 * D[79]); // s1^2 * s3 + f2_coeff[19] = + (2 * D[1] + 2 * D[3] + 2 * D[9] - 2 * D[13] - 2 * D[17] + + 2 * D[27] - 2 * D[31] - 2 * D[35] - 2 * D[37] - 2 * D[39] - + 2 * D[73] - 2 * D[75]); // s1^3 + + f3_coeff[0] = + 2 * D[1] - 2 * D[3] + 2 * D[9] + 2 * D[13] + 2 * D[17] - + 2 * D[27] - 2 * D[31] - 2 * D[35] + 2 * D[37] - 2 * D[39] + + 2 * D[73] - 2 * D[75]; // constant term + f3_coeff[1] = + (2 * D[5] + 2 * D[7] + 4 * D[11] + 4 * D[15] + 4 * D[19] + + 4 * D[21] + 4 * D[29] + 4 * D[33] - 2 * D[41] - 2 * D[43] + + 2 * D[45] - 2 * D[49] - 2 * D[53] + 4 * D[55] + 4 * D[57] + + 2 * D[63] - 2 * D[67] - 2 * D[71] - 2 * D[77] - + 2 * D[79]); // s1^2 * s2 + f3_coeff[2] = (8 * D[10] - 8 * D[20] - 8 * D[30] + 8 * D[50] + + 8 * D[60] - 8 * D[70]); // s1 * s2 + f3_coeff[3] = + (4 * D[7] - 4 * D[5] + 8 * D[11] + 8 * D[15] + 8 * D[19] - + 8 * D[21] - 8 * D[29] - 8 * D[33] - 4 * D[41] + 4 * D[43] - + 4 * D[45] - 4 * D[49] + 4 * D[53] + 8 * D[55] - 8 * D[57] + + 4 * D[63] + 4 * D[67] - 4 * D[71] + 4 * D[77] - + 4 * D[79]); // s1 * s3 + f3_coeff[4] = + (4 * D[2] - 4 * D[6] + 8 * D[14] + 8 * D[16] + 4 * D[18] + + 4 * D[22] - 4 * D[26] - 8 * D[32] - 8 * D[34] + 4 * D[38] - + 4 * D[42] + 8 * D[46] - 8 * D[48] - 4 * D[54] - 4 * D[58] + + 4 * D[62] + 8 * D[64] - 8 * D[66] - 4 * D[74] + + 4 * D[78]); // s2 * s3 + f3_coeff[5] = + (4 * D[0] - 4 * D[40] + 4 * D[44] + 8 * D[50] + 8 * D[52] + + 8 * D[68] + 8 * D[70] + 4 * D[76] - 4 * D[80]); // s2^2 * s3 + f3_coeff[6] = (2 * D[41] - 2 * D[7] - 2 * D[5] + 2 * D[43] - + 2 * D[45] + 2 * D[49] - 2 * D[53] - 2 * D[63] + + 2 * D[67] - 2 * D[71] - 2 * D[77] - 2 * D[79]); // s2^3 + f3_coeff[7] = + (6 * D[26] - 6 * D[6] - 6 * D[18] - 6 * D[22] - 6 * D[2] - + 6 * D[38] - 6 * D[42] - 6 * D[54] - 6 * D[58] + 6 * D[62] + + 6 * D[74] + 6 * D[78]); // s1 * s3^2 + f3_coeff[8] = (2 * D[2] + 2 * D[6] + 4 * D[14] - 4 * D[16] + + 2 * D[18] + 2 * D[22] + 2 * D[26] - 4 * D[32] + + 4 * D[34] + 2 * D[38] + 2 * D[42] + 4 * D[46] - + 4 * D[48] + 2 * D[54] + 2 * D[58] + 2 * D[62] - + 4 * D[64] + 4 * D[66] + 2 * D[74] + 2 * D[78]); // s1 + f3_coeff[9] = + (8 * D[10] - 4 * D[4] - 4 * D[0] - 8 * D[12] - 8 * D[28] + + 8 * D[30] - 4 * D[36] - 4 * D[40] + 4 * D[80]); // s3 + f3_coeff[10] = (2 * D[5] + 2 * D[7] - 4 * D[11] + 4 * D[15] - + 4 * D[19] + 4 * D[21] + 4 * D[29] - 4 * D[33] + + 2 * D[41] + 2 * D[43] + 2 * D[45] + 2 * D[49] + + 2 * D[53] + 4 * D[55] - 4 * D[57] + 2 * D[63] + + 2 * D[67] + 2 * D[71] + 2 * D[77] + 2 * D[79]); // s2 + f3_coeff[11] = + (6 * D[53] - 6 * D[7] - 6 * D[41] - 6 * D[43] - 6 * D[45] - + 6 * D[49] - 6 * D[5] - 6 * D[63] - 6 * D[67] + 6 * D[71] + + 6 * D[77] + 6 * D[79]); // s2 * s3^2 + f3_coeff[12] = + (2 * D[1] - 2 * D[3] + 2 * D[9] - 2 * D[13] - 2 * D[17] + + 4 * D[23] - 4 * D[25] - 2 * D[27] + 2 * D[31] + 2 * D[35] - + 2 * D[37] + 2 * D[39] + 4 * D[47] + 4 * D[51] + 4 * D[59] - + 4 * D[61] - 4 * D[65] - 4 * D[69] - 2 * D[73] + + 2 * D[75]); // s1^2 + f3_coeff[13] = + (6 * D[3] - 6 * D[1] - 6 * D[9] - 6 * D[13] + 6 * D[17] + + 6 * D[27] + 6 * D[31] - 6 * D[35] - 6 * D[37] + 6 * D[39] + + 6 * D[73] - 6 * D[75]); // s3^2 + f3_coeff[14] = + (2 * D[3] - 2 * D[1] - 2 * D[9] + 2 * D[13] - 2 * D[17] - + 4 * D[23] - 4 * D[25] + 2 * D[27] - 2 * D[31] + 2 * D[35] + + 2 * D[37] - 2 * D[39] - 4 * D[47] + 4 * D[51] + 4 * D[59] + + 4 * D[61] - 4 * D[65] + 4 * D[69] - 2 * D[73] + + 2 * D[75]); // s2^2 + f3_coeff[15] = + (4 * D[0] + 4 * D[4] - 4 * D[8] + 4 * D[36] + 4 * D[40] - + 4 * D[44] - 4 * D[72] - 4 * D[76] + 4 * D[80]); // s3^3 + f3_coeff[16] = + (4 * D[17] - 4 * D[3] - 4 * D[9] - 4 * D[13] - 4 * D[1] + + 8 * D[23] + 8 * D[25] - 4 * D[27] - 4 * D[31] + 4 * D[35] - + 4 * D[37] - 4 * D[39] + 8 * D[47] + 8 * D[51] + 8 * D[59] + + 8 * D[61] + 8 * D[65] + 8 * D[69] + 4 * D[73] + + 4 * D[75]); // s1 * s2 * s3 + f3_coeff[17] = + (4 * D[14] - 2 * D[6] - 2 * D[2] + 4 * D[16] - 2 * D[18] + + 2 * D[22] - 2 * D[26] + 4 * D[32] + 4 * D[34] + 2 * D[38] + + 2 * D[42] + 4 * D[46] + 4 * D[48] - 2 * D[54] + 2 * D[58] - + 2 * D[62] + 4 * D[64] + 4 * D[66] - 2 * D[74] - + 2 * D[78]); // s1 * s2^2 + f3_coeff[18] = + (4 * D[8] - 4 * D[0] + 8 * D[20] + 8 * D[24] + 4 * D[40] + + 8 * D[56] + 8 * D[60] + 4 * D[72] - 4 * D[80]); // s1^2 * s3 + f3_coeff[19] = + (2 * D[2] + 2 * D[6] + 2 * D[18] - 2 * D[22] - 2 * D[26] - + 2 * D[38] - 2 * D[42] + 2 * D[54] - 2 * D[58] - 2 * D[62] - + 2 * D[74] - 2 * D[78]); // s1^3 + } +}; +Ptr DLSPnP::create(const Mat &points_, const Mat &calib_norm_pts, const Mat &K) { + return makePtr(points_, calib_norm_pts, K); +} +}} diff --git a/modules/calib3d/src/usac/essential_solver.cpp b/modules/calib3d/src/usac/essential_solver.cpp new file mode 100644 index 0000000..a2e2467 --- /dev/null +++ b/modules/calib3d/src/usac/essential_solver.cpp @@ -0,0 +1,273 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#include "../precomp.hpp" +#include "../usac.hpp" +#if defined(HAVE_EIGEN) +#include +#elif defined(HAVE_LAPACK) +#include "opencv_lapack.h" +#endif + +namespace cv { namespace usac { +// Essential matrix solver: +/* +* H. Stewenius, C. Engels, and D. Nister. Recent developments on direct relative orientation. +* ISPRS J. of Photogrammetry and Remote Sensing, 60:284,294, 2006 +* http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.61.9329&rep=rep1&type=pdf +*/ +class EssentialMinimalSolverStewenius5ptsImpl : public EssentialMinimalSolverStewenius5pts { +private: + // Points must be calibrated K^-1 x + const Mat * points_mat; +#if defined(HAVE_EIGEN) || defined(HAVE_LAPACK) + const float * const pts; +#endif +public: + explicit EssentialMinimalSolverStewenius5ptsImpl (const Mat &points_) : + points_mat(&points_) +#if defined(HAVE_EIGEN) || defined(HAVE_LAPACK) + , pts((float*)points_.data) +#endif + {} + +#if defined(HAVE_LAPACK) || defined(HAVE_EIGEN) + int estimate (const std::vector &sample, std::vector &models) const override { + // (1) Extract 4 null vectors from linear equations of epipolar constraint + std::vector coefficients(45); // 5 pts=rows, 9 columns + auto *coefficients_ = &coefficients[0]; + for (int i = 0; i < 5; i++) { + const int smpl = 4 * sample[i]; + const auto x1 = pts[smpl], y1 = pts[smpl+1], x2 = pts[smpl+2], y2 = pts[smpl+3]; + (*coefficients_++) = x2 * x1; + (*coefficients_++) = x2 * y1; + (*coefficients_++) = x2; + (*coefficients_++) = y2 * x1; + (*coefficients_++) = y2 * y1; + (*coefficients_++) = y2; + (*coefficients_++) = x1; + (*coefficients_++) = y1; + (*coefficients_++) = 1; + } + + const int num_cols = 9, num_e_mat = 4; + double ee[36]; // 9*4 + // eliminate linear equations + Math::eliminateUpperTriangular(coefficients, 5, num_cols); + for (int i = 0; i < num_e_mat; i++) + for (int j = 5; j < num_cols; j++) + ee[num_cols * i + j] = (i + 5 == j) ? 1 : 0; + // use back-substitution + for (int e = 0; e < num_e_mat; e++) { + const int curr_e = num_cols * e; + // start from the last row + for (int i = 4; i >= 0; i--) { + const int row_i = i * num_cols; + double acc = 0; + for (int j = i + 1; j < num_cols; j++) + acc -= coefficients[row_i + j] * ee[curr_e + j]; + ee[curr_e + i] = acc / coefficients[row_i + i]; + // due to numerical errors return 0 solutions + if (std::isnan(ee[curr_e + i])) + return 0; + } + } + + const Matx null_space(ee); + const Matx null_space_mat[3][3] = { + {null_space.col(0), null_space.col(3), null_space.col(6)}, + {null_space.col(1), null_space.col(4), null_space.col(7)}, + {null_space.col(2), null_space.col(5), null_space.col(8)}}; + + // (2) Use the rank constraint and the trace constraint to build ten third-order polynomial + // equations in the three unknowns. The monomials are ordered in GrLex order and + // represented in a 10×20 matrix, where each row corresponds to an equation and each column + // corresponds to a monomial + Matx eet[3][3]; + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + // compute EE Transpose + // Shorthand for multiplying the Essential matrix with its transpose. + eet[i][j] = 2 * (multPolysDegOne(null_space_mat[i][0].val, null_space_mat[j][0].val) + + multPolysDegOne(null_space_mat[i][1].val, null_space_mat[j][1].val) + + multPolysDegOne(null_space_mat[i][2].val, null_space_mat[j][2].val)); + + const Matx trace = eet[0][0] + eet[1][1] + eet[2][2]; + Mat_ constraint_mat(10, 20); + // Trace constraint + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + Mat(multPolysDegOneAndTwo(eet[i][0].val, null_space_mat[0][j].val) + + multPolysDegOneAndTwo(eet[i][1].val, null_space_mat[1][j].val) + + multPolysDegOneAndTwo(eet[i][2].val, null_space_mat[2][j].val) - + 0.5 * multPolysDegOneAndTwo(trace.val, null_space_mat[i][j].val)) + .copyTo(constraint_mat.row(3 * i + j)); + + // Rank = zero determinant constraint + Mat(multPolysDegOneAndTwo( + (multPolysDegOne(null_space_mat[0][1].val, null_space_mat[1][2].val) - + multPolysDegOne(null_space_mat[0][2].val, null_space_mat[1][1].val)).val, + null_space_mat[2][0].val) + + multPolysDegOneAndTwo( + (multPolysDegOne(null_space_mat[0][2].val, null_space_mat[1][0].val) - + multPolysDegOne(null_space_mat[0][0].val, null_space_mat[1][2].val)).val, + null_space_mat[2][1].val) + + multPolysDegOneAndTwo( + (multPolysDegOne(null_space_mat[0][0].val, null_space_mat[1][1].val) - + multPolysDegOne(null_space_mat[0][1].val, null_space_mat[1][0].val)).val, + null_space_mat[2][2].val)).copyTo(constraint_mat.row(9)); + +#ifdef HAVE_EIGEN + const Eigen::Matrix constraint_mat_eig((double *) constraint_mat.data); + // (3) Compute the Gröbner basis. This turns out to be as simple as performing a + // Gauss-Jordan elimination on the 10×20 matrix + const Eigen::Matrix eliminated_mat_eig = constraint_mat_eig.block<10, 10>(0, 0) + .fullPivLu().solve(constraint_mat_eig.block<10, 10>(0, 10)); + + // (4) Compute the 10×10 action matrix for multiplication by one of the un-knowns. + // This is a simple matter of extracting the correct elements fromthe eliminated + // 10×20 matrix and organising them to form the action matrix. + Eigen::Matrix action_mat_eig = Eigen::Matrix::Zero(); + action_mat_eig.block<3, 10>(0, 0) = eliminated_mat_eig.block<3, 10>(0, 0); + action_mat_eig.block<2, 10>(3, 0) = eliminated_mat_eig.block<2, 10>(4, 0); + action_mat_eig.row(5) = eliminated_mat_eig.row(7); + action_mat_eig(6, 0) = -1.0; + action_mat_eig(7, 1) = -1.0; + action_mat_eig(8, 3) = -1.0; + action_mat_eig(9, 6) = -1.0; + + // (5) Compute the left eigenvectors of the action matrix + Eigen::EigenSolver> eigensolver(action_mat_eig); + const Eigen::VectorXcd &eigenvalues = eigensolver.eigenvalues(); + const auto * const eig_vecs_ = (double *) eigensolver.eigenvectors().real().data(); +#else + Matx A = constraint_mat.colRange(0, 10), + B = constraint_mat.colRange(10, 20), eliminated_mat; + if (!solve(A, B, eliminated_mat, DECOMP_LU)) return 0; + + Mat eliminated_mat_dyn = Mat(eliminated_mat); + Mat action_mat = Mat_::zeros(10, 10); + eliminated_mat_dyn.rowRange(0,3).copyTo(action_mat.rowRange(0,3)); + eliminated_mat_dyn.rowRange(4,6).copyTo(action_mat.rowRange(3,5)); + eliminated_mat_dyn.row(7).copyTo(action_mat.row(5)); + auto * action_mat_data = (double *) action_mat.data; + action_mat_data[60] = -1.0; // 6 row, 0 col + action_mat_data[71] = -1.0; // 7 row, 1 col + action_mat_data[83] = -1.0; // 8 row, 3 col + action_mat_data[96] = -1.0; // 9 row, 6 col + + int mat_order = 10, info, lda = 10, ldvl = 10, ldvr = 1, lwork = 100; + double wr[10], wi[10] = {0}, eig_vecs[100], work[100]; // 10 = mat_order, 100 = lwork + char jobvl = 'V', jobvr = 'N'; // only left eigen vectors are computed + dgeev_(&jobvl, &jobvr, &mat_order, action_mat_data, &lda, wr, wi, eig_vecs, &ldvl, + nullptr, &ldvr, work, &lwork, &info); + if (info != 0) return 0; +#endif + + models = std::vector(); models.reserve(10); + + // Read off the values for the three unknowns at all the solution points and + // back-substitute to obtain the solutions for the essential matrix. + for (int i = 0; i < 10; i++) + // process only real solutions +#ifdef HAVE_EIGEN + if (eigenvalues(i).imag() == 0) { + Mat_ model(3, 3); + auto * model_data = (double *) model.data; + const int eig_i = 20 * i + 12; // eigen stores imaginary values too + for (int j = 0; j < 9; j++) + model_data[j] = ee[j ] * eig_vecs_[eig_i ] + ee[j+9 ] * eig_vecs_[eig_i+2] + + ee[j+18] * eig_vecs_[eig_i+4] + ee[j+27] * eig_vecs_[eig_i+6]; +#else + if (wi[i] == 0) { + Mat_ model (3,3); + auto * model_data = (double *) model.data; + const int eig_i = 10 * i + 6; + for (int j = 0; j < 9; j++) + model_data[j] = ee[j ]*eig_vecs[eig_i ] + ee[j+9 ]*eig_vecs[eig_i+1] + + ee[j+18]*eig_vecs[eig_i+2] + ee[j+27]*eig_vecs[eig_i+3]; +#endif + models.emplace_back(model); + } + return static_cast(models.size()); +#else + int estimate (const std::vector &/*sample*/, std::vector &/*models*/) const override { + CV_Error(cv::Error::StsNotImplemented, "To use essential matrix solver LAPACK or Eigen has to be installed!"); +#endif + } + + // number of possible solutions is 0,2,4,6,8,10 + int getMaxNumberOfSolutions () const override { return 10; } + int getSampleSize() const override { return 5; } + Ptr clone () const override { + return makePtr(*points_mat); + } +private: + /* + * Multiply two polynomials of degree one with unknowns x y z + * @p = (p1 x + p2 y + p3 z + p4) [p1 p2 p3 p4] + * @q = (q1 x + q2 y + q3 z + q4) [q1 q2 q3 a4] + * @result is a new polynomial in x^2 xy y^2 xz yz z^2 x y z 1 of size 10 + */ + static inline Matx multPolysDegOne(const double * const p, + const double * const q) { + return + {p[0]*q[0], p[0]*q[1]+p[1]*q[0], p[1]*q[1], p[0]*q[2]+p[2]*q[0], p[1]*q[2]+p[2]*q[1], + p[2]*q[2], p[0]*q[3]+p[3]*q[0], p[1]*q[3]+p[3]*q[1], p[2]*q[3]+p[3]*q[2], p[3]*q[3]}; + } + + /* + * Multiply two polynomials with unknowns x y z + * @p is of size 10 and @q is of size 4 + * @p = (p1 x^2 + p2 xy + p3 y^2 + p4 xz + p5 yz + p6 z^2 + p7 x + p8 y + p9 z + p10) + * @q = (q1 x + q2 y + q3 z + a4) [q1 q2 q3 q4] + * @result is a new polynomial of size 20 + * x^3 x^2y xy^2 y^3 x^2z xyz y^2z xz^2 yz^2 z^3 x^2 xy y^2 xz yz z^2 x y z 1 + */ + static inline Matx multPolysDegOneAndTwo(const double * const p, + const double * const q) { + return Matx + ({p[0]*q[0], p[0]*q[1]+p[1]*q[0], p[1]*q[1]+p[2]*q[0], p[2]*q[1], p[0]*q[2]+p[3]*q[0], + p[1]*q[2]+p[3]*q[1]+p[4]*q[0], p[2]*q[2]+p[4]*q[1], p[3]*q[2]+p[5]*q[0], + p[4]*q[2]+p[5]*q[1], p[5]*q[2], p[0]*q[3]+p[6]*q[0], p[1]*q[3]+p[6]*q[1]+p[7]*q[0], + p[2]*q[3]+p[7]*q[1], p[3]*q[3]+p[6]*q[2]+p[8]*q[0], p[4]*q[3]+p[7]*q[2]+p[8]*q[1], + p[5]*q[3]+p[8]*q[2], p[6]*q[3]+p[9]*q[0], p[7]*q[3]+p[9]*q[1], p[8]*q[3]+p[9]*q[2], + p[9]*q[3]}); + } +}; +Ptr EssentialMinimalSolverStewenius5pts::create + (const Mat &points_) { + return makePtr(points_); +} + +class EssentialNonMinimalSolverImpl : public EssentialNonMinimalSolver { +private: + const Mat * points_mat; + const Ptr non_min_fundamental; +public: + /* + * Input calibrated points K^-1 x. + * Linear 8 points algorithm is used for estimation. + */ + explicit EssentialNonMinimalSolverImpl (const Mat &points_) : + points_mat(&points_), non_min_fundamental(FundamentalNonMinimalSolver::create(points_)) {} + + int estimate (const std::vector &sample, int sample_size, std::vector + &models, const std::vector &weights) const override { + return non_min_fundamental->estimate(sample, sample_size, models, weights); + } + int getMinimumRequiredSampleSize() const override { + return non_min_fundamental->getMinimumRequiredSampleSize(); + } + int getMaxNumberOfSolutions () const override { + return non_min_fundamental->getMaxNumberOfSolutions(); + } + Ptr clone () const override { + return makePtr(*points_mat); + } +}; +Ptr EssentialNonMinimalSolver::create (const Mat &points_) { + return makePtr(points_); +} +}} \ No newline at end of file diff --git a/modules/calib3d/src/usac/estimator.cpp b/modules/calib3d/src/usac/estimator.cpp new file mode 100644 index 0000000..f7af9ee --- /dev/null +++ b/modules/calib3d/src/usac/estimator.cpp @@ -0,0 +1,625 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#include "../precomp.hpp" +#include "../usac.hpp" + +namespace cv { namespace usac { +class HomographyEstimatorImpl : public HomographyEstimator { +private: + const Ptr min_solver; + const Ptr non_min_solver; + const Ptr degeneracy; +public: + HomographyEstimatorImpl (const Ptr &min_solver_, + const Ptr &non_min_solver_, const Ptr °eneracy_) : + min_solver (min_solver_), non_min_solver (non_min_solver_), degeneracy (degeneracy_) {} + + inline int estimateModels (const std::vector &sample, std::vector &models) const override { + if (! degeneracy->isSampleGood(sample)) return 0; + return min_solver->estimate (sample, models); + } + int estimateModelNonMinimalSample(const std::vector &sample, int sample_size, + std::vector &models, const std::vector &weights) const override { + return non_min_solver->estimate (sample, sample_size, models, weights); + }; + int getMaxNumSolutions () const override { + return min_solver->getMaxNumberOfSolutions(); + } + int getMaxNumSolutionsNonMinimal () const override { + return non_min_solver->getMaxNumberOfSolutions(); + } + int getMinimalSampleSize () const override { + return min_solver->getSampleSize(); + } + int getNonMinimalSampleSize () const override { + return non_min_solver->getMinimumRequiredSampleSize(); + } + Ptr clone() const override { + return makePtr(min_solver->clone(), non_min_solver->clone(), + degeneracy->clone(0 /*we don't need state here*/)); + } +}; +Ptr HomographyEstimator::create (const Ptr &min_solver_, + const Ptr &non_min_solver_, const Ptr °eneracy_) { + return makePtr(min_solver_, non_min_solver_, degeneracy_); +} + +///////////////////////////////////////////////////////////////////////// +class FundamentalEstimatorImpl : public FundamentalEstimator { +private: + const Ptr min_solver; + const Ptr non_min_solver; + const Ptr degeneracy; +public: + FundamentalEstimatorImpl (const Ptr &min_solver_, + const Ptr &non_min_solver_, const Ptr °eneracy_) : + min_solver (min_solver_), non_min_solver (non_min_solver_), degeneracy (degeneracy_) {} + + inline int + estimateModels(const std::vector &sample, std::vector &models) const override { + std::vector F; + const int models_count = min_solver->estimate(sample, F); + int valid_models_count = 0; + for (int i = 0; i < models_count; i++) + if (degeneracy->isModelValid(F[i], sample)) + models[valid_models_count++] = F[i]; + return valid_models_count; + } + int estimateModelNonMinimalSample(const std::vector &sample, int sample_size, + std::vector &models, const std::vector &weights) const override { + std::vector Fs; + const int num_est_models = non_min_solver->estimate(sample, sample_size, Fs, weights); + int valid_models_count = 0; + for (int i = 0; i < num_est_models; i++) + if (degeneracy->isModelValid (Fs[i], sample, sample_size)) + models[valid_models_count++] = Fs[i]; + return valid_models_count; + } + int getMaxNumSolutions () const override { + return min_solver->getMaxNumberOfSolutions(); + } + int getMinimalSampleSize () const override { + return min_solver->getSampleSize(); + } + int getNonMinimalSampleSize () const override { + return non_min_solver->getMinimumRequiredSampleSize(); + } + int getMaxNumSolutionsNonMinimal () const override { + return non_min_solver->getMaxNumberOfSolutions(); + } + Ptr clone() const override { + return makePtr(min_solver->clone(), non_min_solver->clone(), + degeneracy->clone(0)); + } +}; +Ptr FundamentalEstimator::create (const Ptr &min_solver_, + const Ptr &non_min_solver_, const Ptr °eneracy_) { + return makePtr(min_solver_, non_min_solver_, degeneracy_); +} + +///////////////////////////////////////////////////////////////////////// +class EssentialEstimatorImpl : public EssentialEstimator { +private: + const Ptr min_solver; + const Ptr non_min_solver; + const Ptr degeneracy; +public: + explicit EssentialEstimatorImpl (const Ptr &min_solver_, + const Ptr &non_min_solver_, const Ptr °eneracy_) : + min_solver (min_solver_), non_min_solver (non_min_solver_), degeneracy (degeneracy_) {} + + inline int + estimateModels(const std::vector &sample, std::vector &models) const override { + std::vector E; + const int models_count = min_solver->estimate(sample, E); + int valid_models_count = 0; + for (int i = 0; i < models_count; i++) + if (degeneracy->isModelValid (E[i], sample)) + models[valid_models_count++] = E[i]; + return valid_models_count; + } + + int estimateModelNonMinimalSample(const std::vector &sample, int sample_size, + std::vector &models, const std::vector &weights) const override { + std::vector Es; + const int num_est_models = non_min_solver->estimate(sample, sample_size, Es, weights); + int valid_models_count = 0; + for (int i = 0; i < num_est_models; i++) + if (degeneracy->isModelValid (Es[i], sample, sample_size)) + models[valid_models_count++] = Es[i]; + return valid_models_count; + }; + int getMaxNumSolutions () const override { + return min_solver->getMaxNumberOfSolutions(); + } + int getMinimalSampleSize () const override { + return min_solver->getSampleSize(); + } + int getNonMinimalSampleSize () const override { + return non_min_solver->getMinimumRequiredSampleSize(); + } + int getMaxNumSolutionsNonMinimal () const override { + return non_min_solver->getMaxNumberOfSolutions(); + } + Ptr clone() const override { + return makePtr(min_solver->clone(), non_min_solver->clone(), + degeneracy->clone(0)); + } +}; +Ptr EssentialEstimator::create (const Ptr &min_solver_, + const Ptr &non_min_solver_, const Ptr °eneracy_) { + return makePtr(min_solver_, non_min_solver_, degeneracy_); +} + +///////////////////////////////////////////////////////////////////////// +class AffineEstimatorImpl : public AffineEstimator { +private: + const Ptr min_solver; + const Ptr non_min_solver; +public: + explicit AffineEstimatorImpl (const Ptr &min_solver_, + const Ptr &non_min_solver_) : + min_solver (min_solver_), non_min_solver (non_min_solver_) {} + + int estimateModels(const std::vector &sample, std::vector &models) const override { + return min_solver->estimate(sample, models); + } + int estimateModelNonMinimalSample (const std::vector &sample, int sample_size, + std::vector &models, const std::vector &weights) const override { + return non_min_solver->estimate(sample, sample_size, models, weights); + } + int getMinimalSampleSize() const override { + return min_solver->getSampleSize(); // 3 points required + } + int getNonMinimalSampleSize() const override { + return non_min_solver->getMinimumRequiredSampleSize(); + } + int getMaxNumSolutions () const override { + return min_solver->getMaxNumberOfSolutions(); + } + int getMaxNumSolutionsNonMinimal () const override { + return non_min_solver->getMaxNumberOfSolutions(); + } + Ptr clone() const override { + return makePtr(min_solver->clone(), non_min_solver->clone()); + } +}; +Ptr AffineEstimator::create (const Ptr &min_solver_, + const Ptr &non_min_solver_) { + return makePtr(min_solver_, non_min_solver_); +} + +///////////////////////////////////////////////////////////////////////// +class PnPEstimatorImpl : public PnPEstimator { +private: + const Ptr min_solver; + const Ptr non_min_solver; +public: + explicit PnPEstimatorImpl (const Ptr &min_solver_, + const Ptr &non_min_solver_) : + min_solver(min_solver_), non_min_solver(non_min_solver_) {} + + int estimateModels (const std::vector &sample, std::vector &models) const override { + return min_solver->estimate(sample, models); + } + int estimateModelNonMinimalSample (const std::vector &sample, int sample_size, + std::vector &models, const std::vector &weights) const override { + return non_min_solver->estimate(sample, sample_size, models, weights); + } + int getMinimalSampleSize() const override { + return min_solver->getSampleSize(); + } + int getNonMinimalSampleSize() const override { + return non_min_solver->getMinimumRequiredSampleSize(); + } + int getMaxNumSolutions () const override { + return min_solver->getMaxNumberOfSolutions(); + } + int getMaxNumSolutionsNonMinimal () const override { + return non_min_solver->getMaxNumberOfSolutions(); + } + Ptr clone() const override { + return makePtr(min_solver->clone(), non_min_solver->clone()); + } +}; +Ptr PnPEstimator::create (const Ptr &min_solver_, + const Ptr &non_min_solver_) { + return makePtr(min_solver_, non_min_solver_); +} + +///////////////////////////////////////////// ERROR ///////////////////////////////////////// +// Symmetric Reprojection Error +class ReprojectedErrorSymmetricImpl : public ReprojectionErrorSymmetric { +private: + const Mat * points_mat; + const float * const points; + float m11, m12, m13, m21, m22, m23, m31, m32, m33; + float minv11, minv12, minv13, minv21, minv22, minv23, minv31, minv32, minv33; + std::vector errors; +public: + explicit ReprojectedErrorSymmetricImpl (const Mat &points_) : + points_mat(&points_), points ((float *) points_.data), errors(points_.rows) {} + + inline void setModelParameters (const Mat &model) override { + const auto * const m = (double *) model.data; + m11=static_cast(m[0]); m12=static_cast(m[1]); m13=static_cast(m[2]); + m21=static_cast(m[3]); m22=static_cast(m[4]); m23=static_cast(m[5]); + m31=static_cast(m[6]); m32=static_cast(m[7]); m33=static_cast(m[8]); + + const Mat model_inv = model.inv(); + const auto * const minv = (double *) model_inv.data; + minv11=(float)minv[0]; minv12=(float)minv[1]; minv13=(float)minv[2]; + minv21=(float)minv[3]; minv22=(float)minv[4]; minv23=(float)minv[5]; + minv31=(float)minv[6]; minv32=(float)minv[7]; minv33=(float)minv[8]; + } + inline float getError (int point_idx) const override { + const int smpl = 4*point_idx; + const float x1=points[smpl], y1=points[smpl+1], x2=points[smpl+2], y2=points[smpl+3]; + const float est_z2 = 1 / (m31 * x1 + m32 * y1 + m33), + dx2 = x2 - (m11 * x1 + m12 * y1 + m13) * est_z2, + dy2 = y2 - (m21 * x1 + m22 * y1 + m23) * est_z2; + const float est_z1 = 1 / (minv31 * x2 + minv32 * y2 + minv33), + dx1 = x1 - (minv11 * x2 + minv12 * y2 + minv13) * est_z1, + dy1 = y1 - (minv21 * x2 + minv22 * y2 + minv23) * est_z1; + return (dx2 * dx2 + dy2 * dy2 + dx1 * dx1 + dy1 * dy1) * .5f; + } + const std::vector &getErrors (const Mat &model) override { + setModelParameters(model); + for (int point_idx = 0; point_idx < points_mat->rows; point_idx++) { + const int smpl = 4*point_idx; + const float x1=points[smpl], y1=points[smpl+1], x2=points[smpl+2], y2=points[smpl+3]; + const float est_z2 = 1 / (m31 * x1 + m32 * y1 + m33), + dx2 = x2 - (m11 * x1 + m12 * y1 + m13) * est_z2, + dy2 = y2 - (m21 * x1 + m22 * y1 + m23) * est_z2; + const float est_z1 = 1 / (minv31 * x2 + minv32 * y2 + minv33), + dx1 = x1 - (minv11 * x2 + minv12 * y2 + minv13) * est_z1, + dy1 = y1 - (minv21 * x2 + minv22 * y2 + minv23) * est_z1; + errors[point_idx] = (dx2 * dx2 + dy2 * dy2 + dx1 * dx1 + dy1 * dy1) * .5f; + } + return errors; + } + Ptr clone () const override { + return makePtr(*points_mat); + } +}; +Ptr +ReprojectionErrorSymmetric::create(const Mat &points) { + return makePtr(points); +} + +// Forward Reprojection Error +class ReprojectedErrorForwardImpl : public ReprojectionErrorForward { +private: + const Mat * points_mat; + const float * const points; + float m11, m12, m13, m21, m22, m23, m31, m32, m33; + std::vector errors; +public: + explicit ReprojectedErrorForwardImpl (const Mat &points_) + : points_mat(&points_), points ((float *)points_.data), errors(points_.rows) {} + + inline void setModelParameters (const Mat &model) override { + const auto * const m = (double *) model.data; + m11=static_cast(m[0]); m12=static_cast(m[1]); m13=static_cast(m[2]); + m21=static_cast(m[3]); m22=static_cast(m[4]); m23=static_cast(m[5]); + m31=static_cast(m[6]); m32=static_cast(m[7]); m33=static_cast(m[8]); + } + inline float getError (int point_idx) const override { + const int smpl = 4*point_idx; + const float x1 = points[smpl], y1 = points[smpl+1], x2 = points[smpl+2], y2 = points[smpl+3]; + const float est_z2 = 1 / (m31 * x1 + m32 * y1 + m33), + dx2 = x2 - (m11 * x1 + m12 * y1 + m13) * est_z2, + dy2 = y2 - (m21 * x1 + m22 * y1 + m23) * est_z2; + return dx2 * dx2 + dy2 * dy2; + } + const std::vector &getErrors (const Mat &model) override { + setModelParameters(model); + for (int point_idx = 0; point_idx < points_mat->rows; point_idx++) { + const int smpl = 4*point_idx; + const float x1=points[smpl], y1=points[smpl+1], x2=points[smpl+2], y2=points[smpl+3]; + const float est_z2 = 1 / (m31 * x1 + m32 * y1 + m33), + dx2 = x2 - (m11 * x1 + m12 * y1 + m13) * est_z2, + dy2 = y2 - (m21 * x1 + m22 * y1 + m23) * est_z2; + errors[point_idx] = dx2 * dx2 + dy2 * dy2; + } + return errors; + } + Ptr clone () const override { + return makePtr(*points_mat); + } +}; +Ptr +ReprojectionErrorForward::create(const Mat &points) { + return makePtr(points); +} + +class SampsonErrorImpl : public SampsonError { +private: + const Mat * points_mat; + const float * const points; + float m11, m12, m13, m21, m22, m23, m31, m32, m33; + std::vector errors; +public: + explicit SampsonErrorImpl (const Mat &points_) : + points_mat(&points_), points ((float *) points_.data), errors(points_.rows) {} + + inline void setModelParameters (const Mat &model) override { + const auto * const m = (double *) model.data; + m11=static_cast(m[0]); m12=static_cast(m[1]); m13=static_cast(m[2]); + m21=static_cast(m[3]); m22=static_cast(m[4]); m23=static_cast(m[5]); + m31=static_cast(m[6]); m32=static_cast(m[7]); m33=static_cast(m[8]); + } + + /* + * (pt2^t * F * pt1)^2) + * Sampson error = ------------------------------------------------------------------------ + * (((F⋅pt1)(0))^2 + ((F⋅pt1)(1))^2 + ((F^t⋅pt2)(0))^2 + ((F^t⋅pt2)(1))^2) + * + * [ x2 y2 1 ] * [ F(1,1) F(1,2) F(1,3) ] [ x1 ] + * [ F(2,1) F(2,2) F(2,3) ] * [ y1 ] + * [ F(3,1) F(3,2) F(3,3) ] [ 1 ] + * + */ + inline float getError (int point_idx) const override { + const int smpl = 4*point_idx; + const float x1=points[smpl], y1=points[smpl+1], x2=points[smpl+2], y2=points[smpl+3]; + const float F_pt1_x = m11 * x1 + m12 * y1 + m13, + F_pt1_y = m21 * x1 + m22 * y1 + m23; + const float pt2_F_x = x2 * m11 + y2 * m21 + m31, + pt2_F_y = x2 * m12 + y2 * m22 + m32; + const float pt2_F_pt1 = x2 * F_pt1_x + y2 * F_pt1_y + m31 * x1 + m32 * y1 + m33; + return pt2_F_pt1 * pt2_F_pt1 / (F_pt1_x * F_pt1_x + F_pt1_y * F_pt1_y + + pt2_F_x * pt2_F_x + pt2_F_y * pt2_F_y); + } + const std::vector &getErrors (const Mat &model) override { + setModelParameters(model); + for (int point_idx = 0; point_idx < points_mat->rows; point_idx++) { + const int smpl = 4*point_idx; + const float x1=points[smpl], y1=points[smpl+1], x2=points[smpl+2], y2=points[smpl+3]; + const float F_pt1_x = m11 * x1 + m12 * y1 + m13, + F_pt1_y = m21 * x1 + m22 * y1 + m23; + const float pt2_F_x = x2 * m11 + y2 * m21 + m31, + pt2_F_y = x2 * m12 + y2 * m22 + m32; + const float pt2_F_pt1 = x2 * F_pt1_x + y2 * F_pt1_y + m31 * x1 + m32 * y1 + m33; + errors[point_idx] = pt2_F_pt1 * pt2_F_pt1 / (F_pt1_x * F_pt1_x + F_pt1_y * F_pt1_y + + pt2_F_x * pt2_F_x + pt2_F_y * pt2_F_y); + } + return errors; + } + Ptr clone () const override { + return makePtr(*points_mat); + } +}; +Ptr +SampsonError::create(const Mat &points) { + return makePtr(points); +} + +class SymmetricGeometricDistanceImpl : public SymmetricGeometricDistance { +private: + const Mat * points_mat; + const float * const points; + float m11, m12, m13, m21, m22, m23, m31, m32, m33; + std::vector errors; +public: + explicit SymmetricGeometricDistanceImpl (const Mat &points_) : + points_mat(&points_), points ((float *) points_.data), errors(points_.rows) {} + + inline void setModelParameters (const Mat &model) override { + const auto * const m = (double *) model.data; + m11=static_cast(m[0]); m12=static_cast(m[1]); m13=static_cast(m[2]); + m21=static_cast(m[3]); m22=static_cast(m[4]); m23=static_cast(m[5]); + m31=static_cast(m[6]); m32=static_cast(m[7]); m33=static_cast(m[8]); + } + + inline float getError (int point_idx) const override { + const int smpl = 4*point_idx; + const float x1=points[smpl], y1=points[smpl+1], x2=points[smpl+2], y2=points[smpl+3]; + // pt2^T * E, line 1 = [l1 l2] + const float l1 = x2 * m11 + y2 * m21 + m31, + l2 = x2 * m12 + y2 * m22 + m32; + // E * pt1, line 2 = [t1 t2] + const float t1 = m11 * x1 + m12 * y1 + m13, + t2 = m21 * x1 + m22 * y1 + m23; + float p2Ep1 = l1 * x1 + l2 * y1 + x2 * m13 + y2 * m23 + m33; + p2Ep1 *= p2Ep1; + return p2Ep1 / (l1 * l1 + l2 * l2) // distance from pt1 to line 1 + + + p2Ep1 / (t1 * t1 + t2 * t2); // distance from pt2 to line 2 + } + const std::vector &getErrors (const Mat &model) override { + setModelParameters(model); + for (int point_idx = 0; point_idx < points_mat->rows; point_idx++) { + const int smpl = 4*point_idx; + const float x1=points[smpl], y1=points[smpl+1], x2=points[smpl+2], y2=points[smpl+3]; + const float l1 = x2 * m11 + y2 * m21 + m31, t1 = m11 * x1 + m12 * y1 + m13, + l2 = x2 * m12 + y2 * m22 + m32, t2 = m21 * x1 + m22 * y1 + m23; + float p2Ep1 = l1 * x1 + l2 * y1 + x2 * m13 + y2 * m23 + m33; + p2Ep1 *= p2Ep1; + errors[point_idx] = p2Ep1 / (l1 * l1 + l2 * l2) + p2Ep1 / (t1 * t1 + t2 * t2); + } + return errors; + } + Ptr clone () const override { + return makePtr(*points_mat); + } +}; +Ptr +SymmetricGeometricDistance::create(const Mat &points) { + return makePtr(points); +} + +class ReprojectionErrorPmatrixImpl : public ReprojectionErrorPmatrix { +private: + const Mat * points_mat; + const float * const points; + float p11, p12, p13, p14, p21, p22, p23, p24, p31, p32, p33, p34; + std::vector errors; +public: + explicit ReprojectionErrorPmatrixImpl (const Mat &points_) : + points_mat(&points_), points ((float *) points_.data), errors(points_.rows) {} + + inline void setModelParameters (const Mat &model) override { + const auto * const p = (double *) model.data; + p11 = (float)p[0]; p12 = (float)p[1]; p13 = (float)p[2]; p14 = (float)p[3]; + p21 = (float)p[4]; p22 = (float)p[5]; p23 = (float)p[6]; p24 = (float)p[7]; + p31 = (float)p[8]; p32 = (float)p[9]; p33 = (float)p[10]; p34 = (float)p[11]; + } + + inline float getError (int point_idx) const override { + const int smpl = 5*point_idx; + const float u = points[smpl ], v = points[smpl+1], + x = points[smpl+2], y = points[smpl+3], z = points[smpl+4]; + const float depth = 1 / (p31 * x + p32 * y + p33 * z + p34); + const float du = u - (p11 * x + p12 * y + p13 * z + p14) * depth; + const float dv = v - (p21 * x + p22 * y + p23 * z + p24) * depth; + return du * du + dv * dv; + } + const std::vector &getErrors (const Mat &model) override { + setModelParameters(model); + for (int point_idx = 0; point_idx < points_mat->rows; point_idx++) { + const int smpl = 5*point_idx; + const float u = points[smpl ], v = points[smpl+1], + x = points[smpl+2], y = points[smpl+3], z = points[smpl+4]; + const float depth = 1 / (p31 * x + p32 * y + p33 * z + p34); + const float du = u - (p11 * x + p12 * y + p13 * z + p14) * depth; + const float dv = v - (p21 * x + p22 * y + p23 * z + p24) * depth; + errors[point_idx] = du * du + dv * dv; + } + return errors; + } + Ptr clone () const override { + return makePtr(*points_mat); + } +}; +Ptr ReprojectionErrorPmatrix::create(const Mat &points) { + return makePtr(points); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Computes forward reprojection error for affine transformation. +class ReprojectedDistanceAffineImpl : public ReprojectionErrorAffine { +private: + /* + * m11 m12 m13 + * m21 m22 m23 + * 0 0 1 + */ + const Mat * points_mat; + const float * const points; + float m11, m12, m13, m21, m22, m23; + std::vector errors; +public: + explicit ReprojectedDistanceAffineImpl (const Mat &points_) : + points_mat(&points_), points ((float*)points_.data), errors(points_.rows) {} + + inline void setModelParameters (const Mat &model) override { + const auto * const m = (double *) model.data; + m11 = (float)m[0]; m12 = (float)m[1]; m13 = (float)m[2]; + m21 = (float)m[3]; m22 = (float)m[4]; m23 = (float)m[5]; + } + inline float getError (int point_idx) const override { + const int smpl = 4*point_idx; + const float x1=points[smpl], y1=points[smpl+1], x2=points[smpl+2], y2=points[smpl+3]; + const float dx2 = x2 - (m11 * x1 + m12 * y1 + m13), dy2 = y2 - (m21 * x1 + m22 * y1 + m23); + return dx2 * dx2 + dy2 * dy2; + } + const std::vector &getErrors (const Mat &model) override { + setModelParameters(model); + for (int point_idx = 0; point_idx < points_mat->rows; point_idx++) { + const int smpl = 4*point_idx; + const float x1=points[smpl], y1=points[smpl+1], x2=points[smpl+2], y2=points[smpl+3]; + const float dx2 = x2 - (m11 * x1 + m12 * y1 + m13), dy2 = y2 - (m21 * x1 + m22 * y1 + m23); + errors[point_idx] = dx2 * dx2 + dy2 * dy2; + } + return errors; + } + Ptr clone () const override { + return makePtr(*points_mat); + } +}; +Ptr +ReprojectionErrorAffine::create(const Mat &points) { + return makePtr(points); +} + +////////////////////////////////////// NORMALIZING TRANSFORMATION ///////////////////////// +class NormTransformImpl : public NormTransform { +private: + const float * const points; +public: + explicit NormTransformImpl (const Mat &points_) : points((float*)points_.data) {} + + // Compute normalized points and transformation matrices. + void getNormTransformation (Mat& norm_points, const std::vector &sample, + int sample_size, Matx33d &T1, Matx33d &T2) const override { + double mean_pts1_x = 0, mean_pts1_y = 0, mean_pts2_x = 0, mean_pts2_y = 0; + + // find average of each coordinate of points. + int smpl; + for (int i = 0; i < sample_size; i++) { + smpl = 4 * sample[i]; + + mean_pts1_x += points[smpl ]; + mean_pts1_y += points[smpl + 1]; + mean_pts2_x += points[smpl + 2]; + mean_pts2_y += points[smpl + 3]; + } + + mean_pts1_x /= sample_size; mean_pts1_y /= sample_size; + mean_pts2_x /= sample_size; mean_pts2_y /= sample_size; + + double avg_dist1 = 0, avg_dist2 = 0, x1_m, y1_m, x2_m, y2_m; + for (int i = 0; i < sample_size; i++) { + smpl = 4 * sample[i]; + /* + * Compute a similarity transform T that takes points xi + * to a new set of points x̃i such that the centroid of + * the points x̃i is the coordinate origin and their + * average distance from the origin is √2 + * + * sqrt(x̃*x̃ + ỹ*ỹ) = sqrt(2) + * ax*ax + by*by = 2 + */ + x1_m = points[smpl ] - mean_pts1_x; + y1_m = points[smpl + 1] - mean_pts1_y; + x2_m = points[smpl + 2] - mean_pts2_x; + y2_m = points[smpl + 3] - mean_pts2_y; + + avg_dist1 += sqrt (x1_m * x1_m + y1_m * y1_m); + avg_dist2 += sqrt (x2_m * x2_m + y2_m * y2_m); + } + + // scale + avg_dist1 = M_SQRT2 / (avg_dist1 / sample_size); + avg_dist2 = M_SQRT2 / (avg_dist2 / sample_size); + + const double transl_x1 = -mean_pts1_x * avg_dist1, transl_y1 = -mean_pts1_y * avg_dist1; + const double transl_x2 = -mean_pts2_x * avg_dist2, transl_y2 = -mean_pts2_y * avg_dist2; + + // transformation matrices + T1 = Matx33d (avg_dist1, 0, transl_x1,0, avg_dist1, transl_y1,0, 0, 1); + T2 = Matx33d (avg_dist2, 0, transl_x2,0, avg_dist2, transl_y2,0, 0, 1); + + norm_points = Mat_(sample_size, 4); // normalized points Nx4 matrix + auto * norm_points_ptr = (float *) norm_points.data; + + // Normalize points: Npts = T*pts 3x3 * 3xN + const float avg_dist1f = (float)avg_dist1, avg_dist2f = (float)avg_dist2; + const float transl_x1f = (float)transl_x1, transl_y1f = (float)transl_y1; + const float transl_x2f = (float)transl_x2, transl_y2f = (float)transl_y2; + for (int i = 0; i < sample_size; i++) { + smpl = 4 * sample[i]; + (*norm_points_ptr++) = avg_dist1f * points[smpl ] + transl_x1f; + (*norm_points_ptr++) = avg_dist1f * points[smpl + 1] + transl_y1f; + (*norm_points_ptr++) = avg_dist2f * points[smpl + 2] + transl_x2f; + (*norm_points_ptr++) = avg_dist2f * points[smpl + 3] + transl_y2f; + } + } +}; +Ptr NormTransform::create (const Mat &points) { + return makePtr(points); +} +}} diff --git a/modules/calib3d/src/usac/fundamental_solver.cpp b/modules/calib3d/src/usac/fundamental_solver.cpp new file mode 100644 index 0000000..5641350 --- /dev/null +++ b/modules/calib3d/src/usac/fundamental_solver.cpp @@ -0,0 +1,335 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#include "../precomp.hpp" +#include "../usac.hpp" +#ifdef HAVE_EIGEN +#include +#endif + +namespace cv { namespace usac { +// Fundamental Matrix Solver: +class FundamentalMinimalSolver7ptsImpl: public FundamentalMinimalSolver7pts { +private: + const Mat * points_mat; + const float * const points; +public: + explicit FundamentalMinimalSolver7ptsImpl (const Mat &points_) : + points_mat (&points_), points ((float *) points_.data) {} + + int estimate (const std::vector &sample, std::vector &models) const override { + const int m = 7, n = 9; // rows, cols + std::vector a(m*n); + auto * a_ = &a[0]; + + for (int i = 0; i < m; i++ ) { + const int smpl = 4*sample[i]; + const auto x1 = points[smpl ], y1 = points[smpl+1], + x2 = points[smpl+2], y2 = points[smpl+3]; + + (*a_++) = x2*x1; + (*a_++) = x2*y1; + (*a_++) = x2; + (*a_++) = y2*x1; + (*a_++) = y2*y1; + (*a_++) = y2; + (*a_++) = x1; + (*a_++) = y1; + (*a_++) = 1; + } + + Math::eliminateUpperTriangular(a, m, n); + + /* + [a11 a12 a13 a14 a15 a16 a17 a18 a19] + [ 0 a22 a23 a24 a25 a26 a27 a28 a29] + [ 0 0 a33 a34 a35 a36 a37 a38 a39] + [ 0 0 0 a44 a45 a46 a47 a48 a49] + [ 0 0 0 0 a55 a56 a57 a58 a59] + [ 0 0 0 0 0 a66 a67 a68 a69] + [ 0 0 0 0 0 0 a77 a78 a79] + + f9 = 1 + */ + double f1[9], f2[9]; + + f1[8] = 1.; + f1[7] = 0.; + f1[6] = -a[6*n+8] / a[6*n+6]; + + f2[8] = 1.; + f2[7] = -a[6*n+8] / a[6*n+7]; + f2[6] = 0.; + + // start from the last row + for (int i = m-2; i >= 0; i--) { + const int row_i = i*n; + double acc1 = 0, acc2 = 0; + for (int j = i+1; j < n; j++) { + acc1 -= a[row_i + j] * f1[j]; + acc2 -= a[row_i + j] * f2[j]; + } + f1[i] = acc1 / a[row_i + i]; + f2[i] = acc2 / a[row_i + i]; + + // due to numerical errors return 0 solutions + if (std::isnan(f1[i]) || std::isnan(f2[i])) + return 0; + } + + // OpenCV: + double c[4], r[3]; + double t0, t1, t2; + Mat_ coeffs (1, 4, c); + Mat_ roots (1, 3, r); + + for (int i = 0; i < 9; i++) + f1[i] -= f2[i]; + + t0 = f2[4]*f2[8] - f2[5]*f2[7]; + t1 = f2[3]*f2[8] - f2[5]*f2[6]; + t2 = f2[3]*f2[7] - f2[4]*f2[6]; + + c[3] = f2[0]*t0 - f2[1]*t1 + f2[2]*t2; + + c[2] = f1[0]*t0 - f1[1]*t1 + f1[2]*t2 - + f1[3]*(f2[1]*f2[8] - f2[2]*f2[7]) + + f1[4]*(f2[0]*f2[8] - f2[2]*f2[6]) - + f1[5]*(f2[0]*f2[7] - f2[1]*f2[6]) + + f1[6]*(f2[1]*f2[5] - f2[2]*f2[4]) - + f1[7]*(f2[0]*f2[5] - f2[2]*f2[3]) + + f1[8]*(f2[0]*f2[4] - f2[1]*f2[3]); + + t0 = f1[4]*f1[8] - f1[5]*f1[7]; + t1 = f1[3]*f1[8] - f1[5]*f1[6]; + t2 = f1[3]*f1[7] - f1[4]*f1[6]; + + c[1] = f2[0]*t0 - f2[1]*t1 + f2[2]*t2 - + f2[3]*(f1[1]*f1[8] - f1[2]*f1[7]) + + f2[4]*(f1[0]*f1[8] - f1[2]*f1[6]) - + f2[5]*(f1[0]*f1[7] - f1[1]*f1[6]) + + f2[6]*(f1[1]*f1[5] - f1[2]*f1[4]) - + f2[7]*(f1[0]*f1[5] - f1[2]*f1[3]) + + f2[8]*(f1[0]*f1[4] - f1[1]*f1[3]); + + c[0] = f1[0]*t0 - f1[1]*t1 + f1[2]*t2; + + // solve the cubic equation; there can be 1 to 3 roots ... + int nroots = solveCubic (coeffs, roots); + if (nroots < 1) return 0; + + models = std::vector(nroots); + for (int k = 0; k < nroots; k++) { + models[k] = Mat_(3,3); + auto * F_ptr = (double *) models[k].data; + + // for each root form the fundamental matrix + double lambda = r[k], mu = 1; + double s = f1[8]*lambda + f2[8]; + + // normalize each matrix, so that F(3,3) (~F[8]) == 1 + if (fabs(s) > FLT_EPSILON) { + mu = 1/s; + lambda *= mu; + F_ptr[8] = 1; + } else + F_ptr[8] = 0; + + for (int i = 0; i < 8; i++) + F_ptr[i] = f1[i] * lambda + f2[i] * mu; + } + return nroots; + } + + int getMaxNumberOfSolutions () const override { return 3; } + int getSampleSize() const override { return 7; } + Ptr clone () const override { + return makePtr(*points_mat); + } +}; +Ptr FundamentalMinimalSolver7pts::create(const Mat &points_) { + return makePtr(points_); +} + +class FundamentalMinimalSolver8ptsImpl : public FundamentalMinimalSolver8pts { +private: + const Mat * points_mat; + const float * const points; +public: + explicit FundamentalMinimalSolver8ptsImpl (const Mat &points_) : + points_mat (&points_), points ((float*) points_.data) {} + + int estimate (const std::vector &sample, std::vector &models) const override { + const int m = 8, n = 9; // rows, cols + std::vector a(m*n); + auto * a_ = &a[0]; + + for (int i = 0; i < m; i++ ) { + const int smpl = 4*sample[i]; + const auto x1 = points[smpl ], y1 = points[smpl+1], + x2 = points[smpl+2], y2 = points[smpl+3]; + + (*a_++) = x2*x1; + (*a_++) = x2*y1; + (*a_++) = x2; + (*a_++) = y2*x1; + (*a_++) = y2*y1; + (*a_++) = y2; + (*a_++) = x1; + (*a_++) = y1; + (*a_++) = 1; + } + + Math::eliminateUpperTriangular(a, m, n); + + /* + [a11 a12 a13 a14 a15 a16 a17 a18 a19] + [ 0 a22 a23 a24 a25 a26 a27 a28 a29] + [ 0 0 a33 a34 a35 a36 a37 a38 a39] + [ 0 0 0 a44 a45 a46 a47 a48 a49] + [ 0 0 0 0 a55 a56 a57 a58 a59] + [ 0 0 0 0 0 a66 a67 a68 a69] + [ 0 0 0 0 0 0 a77 a78 a79] + [ 0 0 0 0 0 0 0 a88 a89] + + f9 = 1 + f8 = (-a89*f9) / a88 + f7 = (-a79*f9 - a78*f8) / a77 + f6 = (-a69*f9 - a68*f8 - a69*f9) / a66 + ... + */ + + models = std::vector{ Mat_(3,3) }; + auto * f = (double *) models[0].data; + f[8] = 1.; + + // start from the last row + for (int i = m-1; i >= 0; i--) { + double acc = 0; + for (int j = i+1; j < n; j++) + acc -= a[i*n+j]*f[j]; + + f[i] = acc / a[i*n+i]; + // due to numerical errors return 0 solutions + if (std::isnan(f[i])) + return 0; + } + return 1; + } + + int getMaxNumberOfSolutions () const override { return 1; } + int getSampleSize() const override { return 8; } + Ptr clone () const override { + return makePtr(*points_mat); + } +}; +Ptr FundamentalMinimalSolver8pts::create(const Mat &points_) { + return makePtr(points_); +} + +class FundamentalNonMinimalSolverImpl : public FundamentalNonMinimalSolver { +private: + const Mat * points_mat; + const Ptr normTr; +public: + explicit FundamentalNonMinimalSolverImpl (const Mat &points_) : + points_mat(&points_), normTr (NormTransform::create(points_)) {} + + int estimate (const std::vector &sample, int sample_size, std::vector + &models, const std::vector &weights) const override { + if (sample_size < getMinimumRequiredSampleSize()) + return 0; + + Matx33d T1, T2; + Mat norm_points; + normTr->getNormTransformation(norm_points, sample, sample_size, T1, T2); + const auto * const norm_pts = (float *) norm_points.data; + + // ------- 8 points algorithm with Eigen and covariance matrix -------------- + double a[9] = {0, 0, 0, 0, 0, 0, 0, 0, 1}; + double AtA[81] = {0}; // 9x9 + + if (weights.empty()) { + for (int i = 0; i < sample_size; i++) { + const int norm_points_idx = 4*i; + const double x1 = norm_pts[norm_points_idx ], y1 = norm_pts[norm_points_idx+1], + x2 = norm_pts[norm_points_idx+2], y2 = norm_pts[norm_points_idx+3]; + a[0] = x2*x1; + a[1] = x2*y1; + a[2] = x2; + a[3] = y2*x1; + a[4] = y2*y1; + a[5] = y2; + a[6] = x1; + a[7] = y1; + + // calculate covariance for eigen + for (int row = 0; row < 9; row++) + for (int col = row; col < 9; col++) + AtA[row*9+col] += a[row]*a[col]; + } + } else { + for (int i = 0; i < sample_size; i++) { + const int smpl = 4*i; + const double weight = weights[i]; + const double x1 = norm_pts[smpl ], y1 = norm_pts[smpl+1], + x2 = norm_pts[smpl+2], y2 = norm_pts[smpl+3]; + const double weight_times_x2 = weight * x2, + weight_times_y2 = weight * y2; + + a[0] = weight_times_x2 * x1; + a[1] = weight_times_x2 * y1; + a[2] = weight_times_x2; + a[3] = weight_times_y2 * x1; + a[4] = weight_times_y2 * y1; + a[5] = weight_times_y2; + a[6] = weight * x1; + a[7] = weight * y1; + a[8] = weight; + + // calculate covariance for eigen + for (int row = 0; row < 9; row++) + for (int col = row; col < 9; col++) + AtA[row*9+col] += a[row]*a[col]; + } + } + + // copy symmetric part of covariance matrix + for (int j = 1; j < 9; j++) + for (int z = 0; z < j; z++) + AtA[j*9+z] = AtA[z*9+j]; + +#ifdef HAVE_EIGEN + models = std::vector{ Mat_(3,3) }; + const Eigen::JacobiSVD> svd((Eigen::Matrix(AtA)), + Eigen::ComputeFullV); + // extract the last nullspace + Eigen::Map>((double *)models[0].data) = svd.matrixV().col(8); +#else + Matx AtA_(AtA), U, Vt; + Vec W; + SVD::compute(AtA_, W, U, Vt, SVD::FULL_UV + SVD::MODIFY_A); + models = std::vector { Mat(Vt.row(8).reshape<3,3>()) }; +#endif + + // Transpose T2 (in T2 the lower diagonal is zero) + T2(2, 0) = T2(0, 2); T2(2, 1) = T2(1, 2); + T2(0, 2) = 0; T2(1, 2) = 0; + + models[0] = T2 * models[0] * T1; + + FundamentalDegeneracy::recoverRank(models[0]); + return 1; + } + + int getMinimumRequiredSampleSize() const override { return 8; } + int getMaxNumberOfSolutions () const override { return 1; } + Ptr clone () const override { + return makePtr(*points_mat); + } +}; +Ptr FundamentalNonMinimalSolver::create(const Mat &points_) { + return makePtr(points_); +} +}} diff --git a/modules/calib3d/src/usac/gamma_values.hpp b/modules/calib3d/src/usac/gamma_values.hpp new file mode 100644 index 0000000..5a30289 --- /dev/null +++ b/modules/calib3d/src/usac/gamma_values.hpp @@ -0,0 +1,237 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +constexpr int stored_gamma_number = 2999; +constexpr int stored_incomplete_gamma_number = 3999; +constexpr double scale_of_stored_gammas_n4 = 1647.8; +constexpr double scale_of_stored_incomplete_gammas_n4 = 603.64; + +constexpr double stored_complete_gamma_values_n4[] = {0.88623,0.88618,0.8861,0.88599,0.88587,0.88573,0.88557,0.8854,0.88522,0.88502,0.88482,0.8846,0.88438,0.88415,0.8839,0.88365,0.8834,0.88313,0.88285,0.88257,0.88229,0.88199,0.88169,0.88138,0.88107,0.88075,0.88042,0.88009,0.87975,0.87941,0.87906,0.8787,0.87834,0.87798,0.87761,0.87724,0.87686,0.87647,0.87609,0.87569,0.8753,0.8749,0.87449,0.87408,0.87367,0.87325,0.87283,0.8724,0.87197,0.87154,0.8711,0.87066,0.87022,0.86977,0.86932,0.86886,0.8684,0.86794,0.86748,0.86701,0.86654,0.86606,0.86559,0.86511,0.86462,0.86414,0.86365,0.86315,0.86266,0.86216,0.86166,0.86116,0.86065,0.86014,0.85963,0.85911,0.8586,0.85808,0.85755,0.85703,0.8565,0.85597,0.85544,0.85491,0.85437,0.85383,0.85329,0.85275,0.8522,0.85165,0.8511,0.85055,0.85,0.84944,0.84888,0.84832,0.84776,0.8472,0.84663,0.84606, +0.84549,0.84492,0.84434,0.84377,0.84319,0.84261,0.84203,0.84145,0.84086,0.84027,0.83969,0.83909,0.8385,0.83791,0.83731,0.83672,0.83612,0.83552,0.83492,0.83431,0.83371,0.8331,0.8325,0.83189,0.83128,0.83066,0.83005,0.82943,0.82882,0.8282,0.82758,0.82696,0.82634,0.82572,0.82509,0.82447,0.82384,0.82321,0.82258,0.82195,0.82132,0.82068,0.82005,0.81941,0.81878,0.81814,0.8175,0.81686,0.81622,0.81558,0.81493,0.81429,0.81364,0.813,0.81235,0.8117,0.81105,0.8104,0.80975,0.80909,0.80844,0.80779,0.80713,0.80647,0.80582,0.80516,0.8045,0.80384,0.80318,0.80251,0.80185,0.80119,0.80052,0.79986,0.79919,0.79852,0.79786,0.79719,0.79652,0.79585,0.79518,0.7945,0.79383,0.79316,0.79248,0.79181,0.79113,0.79046,0.78978,0.7891,0.78843,0.78775,0.78707,0.78639,0.78571,0.78503,0.78434,0.78366,0.78298,0.78229, +0.78161,0.78093,0.78024,0.77955,0.77887,0.77818,0.77749,0.7768,0.77612,0.77543,0.77474,0.77405,0.77336,0.77266,0.77197,0.77128,0.77059,0.76989,0.7692,0.76851,0.76781,0.76712,0.76642,0.76573,0.76503,0.76433,0.76364,0.76294,0.76224,0.76154,0.76085,0.76015,0.75945,0.75875,0.75805,0.75735,0.75665,0.75595,0.75525,0.75454,0.75384,0.75314,0.75244,0.75174,0.75103,0.75033,0.74963,0.74892,0.74822,0.74751,0.74681,0.74611,0.7454,0.7447,0.74399,0.74328,0.74258,0.74187,0.74117,0.74046,0.73975,0.73905,0.73834,0.73763,0.73692,0.73622,0.73551,0.7348,0.73409,0.73339,0.73268,0.73197,0.73126,0.73055,0.72984,0.72913,0.72842,0.72772,0.72701,0.7263,0.72559,0.72488,0.72417,0.72346,0.72275,0.72204,0.72133,0.72062,0.71991,0.7192,0.71849,0.71778,0.71707,0.71636,0.71565,0.71494,0.71423,0.71352,0.71281,0.71209, +0.71138,0.71067,0.70996,0.70925,0.70854,0.70783,0.70712,0.70641,0.7057,0.70499,0.70428,0.70357,0.70286,0.70215,0.70144,0.70073,0.70002,0.69931,0.6986,0.69789,0.69718,0.69647,0.69576,0.69505,0.69434,0.69363,0.69292,0.69221,0.6915,0.69079,0.69008,0.68937,0.68867,0.68796,0.68725,0.68654,0.68583,0.68512,0.68441,0.68371,0.683,0.68229,0.68158,0.68088,0.68017,0.67946,0.67875,0.67805,0.67734,0.67663,0.67593,0.67522,0.67451,0.67381,0.6731,0.6724,0.67169,0.67099,0.67028,0.66958,0.66887,0.66817,0.66746,0.66676,0.66605,0.66535,0.66465,0.66394,0.66324,0.66254,0.66183,0.66113,0.66043,0.65973,0.65903,0.65832,0.65762,0.65692,0.65622,0.65552,0.65482,0.65412,0.65342,0.65272,0.65202,0.65132,0.65062,0.64992,0.64922,0.64853,0.64783,0.64713,0.64643,0.64574,0.64504,0.64434,0.64365,0.64295,0.64225,0.64156, +0.64086,0.64017,0.63947,0.63878,0.63808,0.63739,0.6367,0.636,0.63531,0.63462,0.63393,0.63323,0.63254,0.63185,0.63116,0.63047,0.62978,0.62909,0.6284,0.62771,0.62702,0.62633,0.62564,0.62495,0.62427,0.62358,0.62289,0.6222,0.62152,0.62083,0.62014,0.61946,0.61877,0.61809,0.6174,0.61672,0.61604,0.61535,0.61467,0.61399,0.6133,0.61262,0.61194,0.61126,0.61058,0.6099,0.60922,0.60854,0.60786,0.60718,0.6065,0.60582,0.60514,0.60446,0.60379,0.60311,0.60243,0.60176,0.60108,0.60041,0.59973,0.59906,0.59838,0.59771,0.59703,0.59636,0.59569,0.59501,0.59434,0.59367,0.593,0.59233,0.59166,0.59099,0.59032,0.58965,0.58898,0.58831,0.58764,0.58698,0.58631,0.58564,0.58498,0.58431,0.58365,0.58298,0.58232,0.58165,0.58099,0.58032,0.57966,0.579,0.57834,0.57767,0.57701,0.57635,0.57569,0.57503,0.57437,0.57371, +0.57305,0.5724,0.57174,0.57108,0.57042,0.56977,0.56911,0.56845,0.5678,0.56714,0.56649,0.56584,0.56518,0.56453,0.56388,0.56322,0.56257,0.56192,0.56127,0.56062,0.55997,0.55932,0.55867,0.55802,0.55738,0.55673,0.55608,0.55543,0.55479,0.55414,0.5535,0.55285,0.55221,0.55156,0.55092,0.55028,0.54963,0.54899,0.54835,0.54771,0.54707,0.54643,0.54579,0.54515,0.54451,0.54387,0.54323,0.5426,0.54196,0.54132,0.54069,0.54005,0.53942,0.53878,0.53815,0.53751,0.53688,0.53625,0.53562,0.53498,0.53435,0.53372,0.53309,0.53246,0.53183,0.5312,0.53058,0.52995,0.52932,0.52869,0.52807,0.52744,0.52682,0.52619,0.52557,0.52494,0.52432,0.5237,0.52307,0.52245,0.52183,0.52121,0.52059,0.51997,0.51935,0.51873,0.51811,0.51749,0.51688,0.51626,0.51564,0.51503,0.51441,0.5138,0.51318,0.51257,0.51195,0.51134,0.51073,0.51012, +0.5095,0.50889,0.50828,0.50767,0.50706,0.50645,0.50585,0.50524,0.50463,0.50402,0.50342,0.50281,0.50221,0.5016,0.501,0.50039,0.49979,0.49919,0.49858,0.49798,0.49738,0.49678,0.49618,0.49558,0.49498,0.49438,0.49378,0.49318,0.49259,0.49199,0.49139,0.4908,0.4902,0.48961,0.48901,0.48842,0.48783,0.48724,0.48664,0.48605,0.48546,0.48487,0.48428,0.48369,0.4831,0.48251,0.48192,0.48134,0.48075,0.48016,0.47958,0.47899,0.47841,0.47782,0.47724,0.47666,0.47607,0.47549,0.47491,0.47433,0.47375,0.47317,0.47259,0.47201,0.47143,0.47085,0.47027,0.4697,0.46912,0.46854,0.46797,0.46739,0.46682,0.46625,0.46567,0.4651,0.46453,0.46396,0.46338,0.46281,0.46224,0.46167,0.4611,0.46054,0.45997,0.4594,0.45883,0.45827,0.4577,0.45713,0.45657,0.45601,0.45544,0.45488,0.45432,0.45375,0.45319,0.45263,0.45207,0.45151, +0.45095,0.45039,0.44983,0.44927,0.44872,0.44816,0.4476,0.44705,0.44649,0.44594,0.44538,0.44483,0.44427,0.44372,0.44317,0.44262,0.44207,0.44151,0.44096,0.44041,0.43987,0.43932,0.43877,0.43822,0.43767,0.43713,0.43658,0.43604,0.43549,0.43495,0.4344,0.43386,0.43332,0.43277,0.43223,0.43169,0.43115,0.43061,0.43007,0.42953,0.42899,0.42846,0.42792,0.42738,0.42684,0.42631,0.42577,0.42524,0.4247,0.42417,0.42364,0.4231,0.42257,0.42204,0.42151,0.42098,0.42045,0.41992,0.41939,0.41886,0.41833,0.4178,0.41728,0.41675,0.41623,0.4157,0.41517,0.41465,0.41413,0.4136,0.41308,0.41256,0.41204,0.41152,0.41099,0.41047,0.40996,0.40944,0.40892,0.4084,0.40788,0.40736,0.40685,0.40633,0.40582,0.4053,0.40479,0.40427,0.40376,0.40325,0.40274,0.40222,0.40171,0.4012,0.40069,0.40018,0.39967,0.39916,0.39866,0.39815, +0.39764,0.39714,0.39663,0.39612,0.39562,0.39511,0.39461,0.39411,0.3936,0.3931,0.3926,0.3921,0.3916,0.3911,0.3906,0.3901,0.3896,0.3891,0.3886,0.38811,0.38761,0.38711,0.38662,0.38612,0.38563,0.38514,0.38464,0.38415,0.38366,0.38316,0.38267,0.38218,0.38169,0.3812,0.38071,0.38022,0.37974,0.37925,0.37876,0.37827,0.37779,0.3773,0.37682,0.37633,0.37585,0.37536,0.37488,0.3744,0.37392,0.37343,0.37295,0.37247,0.37199,0.37151,0.37103,0.37056,0.37008,0.3696,0.36912,0.36865,0.36817,0.3677,0.36722,0.36675,0.36627,0.3658,0.36533,0.36485,0.36438,0.36391,0.36344,0.36297,0.3625,0.36203,0.36156,0.36109,0.36062,0.36016,0.35969,0.35922,0.35876,0.35829,0.35783,0.35736,0.3569,0.35644,0.35597,0.35551,0.35505,0.35459,0.35413,0.35367,0.35321,0.35275,0.35229,0.35183,0.35137,0.35092,0.35046,0.35, +0.34955,0.34909,0.34864,0.34818,0.34773,0.34728,0.34682,0.34637,0.34592,0.34547,0.34502,0.34457,0.34412,0.34367,0.34322,0.34277,0.34233,0.34188,0.34143,0.34099,0.34054,0.34009,0.33965,0.33921,0.33876,0.33832,0.33788,0.33743,0.33699,0.33655,0.33611,0.33567,0.33523,0.33479,0.33435,0.33391,0.33348,0.33304,0.3326,0.33216,0.33173,0.33129,0.33086,0.33042,0.32999,0.32956,0.32912,0.32869,0.32826,0.32783,0.3274,0.32697,0.32654,0.32611,0.32568,0.32525,0.32482,0.32439,0.32397,0.32354,0.32311,0.32269,0.32226,0.32184,0.32141,0.32099,0.32057,0.32014,0.31972,0.3193,0.31888,0.31846,0.31804,0.31762,0.3172,0.31678,0.31636,0.31594,0.31553,0.31511,0.31469,0.31428,0.31386,0.31345,0.31303,0.31262,0.3122,0.31179,0.31138,0.31097,0.31055,0.31014,0.30973,0.30932,0.30891,0.3085,0.30809,0.30768,0.30728,0.30687, +0.30646,0.30606,0.30565,0.30524,0.30484,0.30443,0.30403,0.30363,0.30322,0.30282,0.30242,0.30202,0.30161,0.30121,0.30081,0.30041,0.30001,0.29961,0.29922,0.29882,0.29842,0.29802,0.29763,0.29723,0.29683,0.29644,0.29604,0.29565,0.29526,0.29486,0.29447,0.29408,0.29368,0.29329,0.2929,0.29251,0.29212,0.29173,0.29134,0.29095,0.29056,0.29018,0.28979,0.2894,0.28901,0.28863,0.28824,0.28786,0.28747,0.28709,0.2867,0.28632,0.28594,0.28555,0.28517,0.28479,0.28441,0.28403,0.28365,0.28327,0.28289,0.28251,0.28213,0.28175,0.28138,0.281,0.28062,0.28025,0.27987,0.27949,0.27912,0.27875,0.27837,0.278,0.27762,0.27725,0.27688,0.27651,0.27614,0.27577,0.27539,0.27502,0.27466,0.27429,0.27392,0.27355,0.27318,0.27281,0.27245,0.27208,0.27171,0.27135,0.27098,0.27062,0.27025,0.26989,0.26953,0.26916,0.2688,0.26844, +0.26808,0.26772,0.26735,0.26699,0.26663,0.26627,0.26592,0.26556,0.2652,0.26484,0.26448,0.26413,0.26377,0.26341,0.26306,0.2627,0.26235,0.26199,0.26164,0.26129,0.26093,0.26058,0.26023,0.25988,0.25953,0.25917,0.25882,0.25847,0.25812,0.25777,0.25743,0.25708,0.25673,0.25638,0.25603,0.25569,0.25534,0.255,0.25465,0.2543,0.25396,0.25362,0.25327,0.25293,0.25259,0.25224,0.2519,0.25156,0.25122,0.25088,0.25054,0.2502,0.24986,0.24952,0.24918,0.24884,0.2485,0.24817,0.24783,0.24749,0.24715,0.24682,0.24648,0.24615,0.24581,0.24548,0.24515,0.24481,0.24448,0.24415,0.24381,0.24348,0.24315,0.24282,0.24249,0.24216,0.24183,0.2415,0.24117,0.24084,0.24051,0.24019,0.23986,0.23953,0.23921,0.23888,0.23855,0.23823,0.2379,0.23758,0.23726,0.23693,0.23661,0.23629,0.23596,0.23564,0.23532,0.235,0.23468,0.23436, +0.23404,0.23372,0.2334,0.23308,0.23276,0.23244,0.23212,0.23181,0.23149,0.23117,0.23086,0.23054,0.23022,0.22991,0.2296,0.22928,0.22897,0.22865,0.22834,0.22803,0.22772,0.2274,0.22709,0.22678,0.22647,0.22616,0.22585,0.22554,0.22523,0.22492,0.22461,0.22431,0.224,0.22369,0.22338,0.22308,0.22277,0.22247,0.22216,0.22186,0.22155,0.22125,0.22094,0.22064,0.22034,0.22003,0.21973,0.21943,0.21913,0.21883,0.21853,0.21823,0.21793,0.21763,0.21733,0.21703,0.21673,0.21643,0.21613,0.21584,0.21554,0.21524,0.21495,0.21465,0.21436,0.21406,0.21377,0.21347,0.21318,0.21288,0.21259,0.2123,0.212,0.21171,0.21142,0.21113,0.21084,0.21055,0.21026,0.20997,0.20968,0.20939,0.2091,0.20881,0.20852,0.20823,0.20795,0.20766,0.20737,0.20709,0.2068,0.20652,0.20623,0.20595,0.20566,0.20538,0.20509,0.20481,0.20453,0.20424, +0.20396,0.20368,0.2034,0.20312,0.20284,0.20256,0.20228,0.202,0.20172,0.20144,0.20116,0.20088,0.2006,0.20032,0.20005,0.19977,0.19949,0.19922,0.19894,0.19866,0.19839,0.19811,0.19784,0.19757,0.19729,0.19702,0.19675,0.19647,0.1962,0.19593,0.19566,0.19539,0.19511,0.19484,0.19457,0.1943,0.19403,0.19376,0.1935,0.19323,0.19296,0.19269,0.19242,0.19216,0.19189,0.19162,0.19136,0.19109,0.19082,0.19056,0.19029,0.19003,0.18977,0.1895,0.18924,0.18898,0.18871,0.18845,0.18819,0.18793,0.18766,0.1874,0.18714,0.18688,0.18662,0.18636,0.1861,0.18584,0.18558,0.18533,0.18507,0.18481,0.18455,0.1843,0.18404,0.18378,0.18353,0.18327,0.18302,0.18276,0.18251,0.18225,0.182,0.18174,0.18149,0.18124,0.18098,0.18073,0.18048,0.18023,0.17998,0.17972,0.17947,0.17922,0.17897,0.17872,0.17847,0.17822,0.17797,0.17773, +0.17748,0.17723,0.17698,0.17674,0.17649,0.17624,0.176,0.17575,0.1755,0.17526,0.17501,0.17477,0.17452,0.17428,0.17404,0.17379,0.17355,0.17331,0.17306,0.17282,0.17258,0.17234,0.1721,0.17186,0.17162,0.17137,0.17113,0.1709,0.17066,0.17042,0.17018,0.16994,0.1697,0.16946,0.16923,0.16899,0.16875,0.16852,0.16828,0.16804,0.16781,0.16757,0.16734,0.1671,0.16687,0.16663,0.1664,0.16617,0.16593,0.1657,0.16547,0.16524,0.165,0.16477,0.16454,0.16431,0.16408,0.16385,0.16362,0.16339,0.16316,0.16293,0.1627,0.16247,0.16224,0.16202,0.16179,0.16156,0.16133,0.16111,0.16088,0.16065,0.16043,0.1602,0.15998,0.15975,0.15953,0.1593,0.15908,0.15885,0.15863,0.15841,0.15818,0.15796,0.15774,0.15752,0.1573,0.15707,0.15685,0.15663,0.15641,0.15619,0.15597,0.15575,0.15553,0.15531,0.15509,0.15487,0.15466,0.15444, +0.15422,0.154,0.15379,0.15357,0.15335,0.15314,0.15292,0.1527,0.15249,0.15227,0.15206,0.15184,0.15163,0.15142,0.1512,0.15099,0.15077,0.15056,0.15035,0.15014,0.14992,0.14971,0.1495,0.14929,0.14908,0.14887,0.14866,0.14845,0.14824,0.14803,0.14782,0.14761,0.1474,0.14719,0.14699,0.14678,0.14657,0.14636,0.14616,0.14595,0.14574,0.14554,0.14533,0.14512,0.14492,0.14471,0.14451,0.1443,0.1441,0.1439,0.14369,0.14349,0.14329,0.14308,0.14288,0.14268,0.14248,0.14227,0.14207,0.14187,0.14167,0.14147,0.14127,0.14107,0.14087,0.14067,0.14047,0.14027,0.14007,0.13987,0.13967,0.13948,0.13928,0.13908,0.13888,0.13869,0.13849,0.13829,0.1381,0.1379,0.1377,0.13751,0.13731,0.13712,0.13692,0.13673,0.13654,0.13634,0.13615,0.13595,0.13576,0.13557,0.13538,0.13518,0.13499,0.1348,0.13461,0.13442,0.13423,0.13403, +0.13384,0.13365,0.13346,0.13327,0.13308,0.1329,0.13271,0.13252,0.13233,0.13214,0.13195,0.13176,0.13158,0.13139,0.1312,0.13102,0.13083,0.13064,0.13046,0.13027,0.13009,0.1299,0.12972,0.12953,0.12935,0.12916,0.12898,0.12879,0.12861,0.12843,0.12824,0.12806,0.12788,0.1277,0.12752,0.12733,0.12715,0.12697,0.12679,0.12661,0.12643,0.12625,0.12607,0.12589,0.12571,0.12553,0.12535,0.12517,0.12499,0.12481,0.12464,0.12446,0.12428,0.1241,0.12393,0.12375,0.12357,0.1234,0.12322,0.12304,0.12287,0.12269,0.12252,0.12234,0.12217,0.12199,0.12182,0.12164,0.12147,0.1213,0.12112,0.12095,0.12078,0.1206,0.12043,0.12026,0.12009,0.11992,0.11974,0.11957,0.1194,0.11923,0.11906,0.11889,0.11872,0.11855,0.11838,0.11821,0.11804,0.11787,0.1177,0.11754,0.11737,0.1172,0.11703,0.11686,0.1167,0.11653,0.11636,0.1162, +0.11603,0.11586,0.1157,0.11553,0.11537,0.1152,0.11504,0.11487,0.11471,0.11454,0.11438,0.11421,0.11405,0.11389,0.11372,0.11356,0.1134,0.11323,0.11307,0.11291,0.11275,0.11259,0.11242,0.11226,0.1121,0.11194,0.11178,0.11162,0.11146,0.1113,0.11114,0.11098,0.11082,0.11066,0.1105,0.11035,0.11019,0.11003,0.10987,0.10971,0.10955,0.1094,0.10924,0.10908,0.10893,0.10877,0.10861,0.10846,0.1083,0.10815,0.10799,0.10784,0.10768,0.10753,0.10737,0.10722,0.10706,0.10691,0.10675,0.1066,0.10645,0.10629,0.10614,0.10599,0.10584,0.10568,0.10553,0.10538,0.10523,0.10508,0.10493,0.10478,0.10462,0.10447,0.10432,0.10417,0.10402,0.10387,0.10372,0.10357,0.10342,0.10328,0.10313,0.10298,0.10283,0.10268,0.10253,0.10239,0.10224,0.10209,0.10194,0.1018,0.10165,0.1015,0.10136,0.10121,0.10107,0.10092,0.10077,0.10063, +0.10048,0.10034,0.10019,0.10005,0.09991,0.09976,0.09962,0.09947,0.09933,0.09919,0.09904,0.0989,0.09876,0.09862,0.09847,0.09833,0.09819,0.09805,0.09791,0.09776,0.09762,0.09748,0.09734,0.0972,0.09706,0.09692,0.09678,0.09664,0.0965,0.09636,0.09622,0.09608,0.09594,0.09581,0.09567,0.09553,0.09539,0.09525,0.09512,0.09498,0.09484,0.0947,0.09457,0.09443,0.09429,0.09416,0.09402,0.09388,0.09375,0.09361,0.09348,0.09334,0.09321,0.09307,0.09294,0.0928,0.09267,0.09253,0.0924,0.09227,0.09213,0.092,0.09187,0.09173,0.0916,0.09147,0.09134,0.0912,0.09107,0.09094,0.09081,0.09068,0.09055,0.09041,0.09028,0.09015,0.09002,0.08989,0.08976,0.08963,0.0895,0.08937,0.08924,0.08911,0.08898,0.08885,0.08873,0.0886,0.08847,0.08834,0.08821,0.08808,0.08796,0.08783,0.0877,0.08757,0.08745,0.08732,0.08719,0.08707, +0.08694,0.08681,0.08669,0.08656,0.08644,0.08631,0.08619,0.08606,0.08594,0.08581,0.08569,0.08556,0.08544,0.08531,0.08519,0.08507,0.08494,0.08482,0.0847,0.08457,0.08445,0.08433,0.0842,0.08408,0.08396,0.08384,0.08372,0.08359,0.08347,0.08335,0.08323,0.08311,0.08299,0.08287,0.08275,0.08263,0.08251,0.08239,0.08227,0.08215,0.08203,0.08191,0.08179,0.08167,0.08155,0.08143,0.08132,0.0812,0.08108,0.08096,0.08084,0.08073,0.08061,0.08049,0.08037,0.08026,0.08014,0.08002,0.07991,0.07979,0.07967,0.07956,0.07944,0.07933,0.07921,0.0791,0.07898,0.07887,0.07875,0.07864,0.07852,0.07841,0.07829,0.07818,0.07806,0.07795,0.07784,0.07772,0.07761,0.0775,0.07738,0.07727,0.07716,0.07705,0.07693,0.07682,0.07671,0.0766,0.07649,0.07637,0.07626,0.07615,0.07604,0.07593,0.07582,0.07571,0.0756,0.07549,0.07538,0.07527, +0.07516,0.07505,0.07494,0.07483,0.07472,0.07461,0.0745,0.07439,0.07428,0.07418,0.07407,0.07396,0.07385,0.07374,0.07364,0.07353,0.07342,0.07331,0.07321,0.0731,0.07299,0.07289,0.07278,0.07267,0.07257,0.07246,0.07236,0.07225,0.07214,0.07204,0.07193,0.07183,0.07172,0.07162,0.07151,0.07141,0.07131,0.0712,0.0711,0.07099,0.07089,0.07079,0.07068,0.07058,0.07048,0.07037,0.07027,0.07017,0.07006,0.06996,0.06986,0.06976,0.06965,0.06955,0.06945,0.06935,0.06925,0.06915,0.06905,0.06894,0.06884,0.06874,0.06864,0.06854,0.06844,0.06834,0.06824,0.06814,0.06804,0.06794,0.06784,0.06774,0.06764,0.06754,0.06745,0.06735,0.06725,0.06715,0.06705,0.06695,0.06685,0.06676,0.06666,0.06656,0.06646,0.06637,0.06627,0.06617,0.06607,0.06598,0.06588,0.06578,0.06569,0.06559,0.0655,0.0654,0.0653,0.06521,0.06511,0.06502, +0.06492,0.06483,0.06473,0.06464,0.06454,0.06445,0.06435,0.06426,0.06416,0.06407,0.06397,0.06388,0.06379,0.06369,0.0636,0.06351,0.06341,0.06332,0.06323,0.06313,0.06304,0.06295,0.06286,0.06276,0.06267,0.06258,0.06249,0.0624,0.06231,0.06221,0.06212,0.06203,0.06194,0.06185,0.06176,0.06167,0.06158,0.06149,0.0614,0.06131,0.06122,0.06113,0.06104,0.06095,0.06086,0.06077,0.06068,0.06059,0.0605,0.06041,0.06032,0.06023,0.06014,0.06006,0.05997,0.05988,0.05979,0.0597,0.05962,0.05953,0.05944,0.05935,0.05927,0.05918,0.05909,0.059,0.05892,0.05883,0.05874,0.05866,0.05857,0.05849,0.0584,0.05831,0.05823,0.05814,0.05806,0.05797,0.05789,0.0578,0.05771,0.05763,0.05755,0.05746,0.05738,0.05729,0.05721,0.05712,0.05704,0.05695,0.05687,0.05679,0.0567,0.05662,0.05654,0.05645,0.05637,0.05629,0.0562,0.05612, +0.05604,0.05596,0.05587,0.05579,0.05571,0.05563,0.05554,0.05546,0.05538,0.0553,0.05522,0.05514,0.05505,0.05497,0.05489,0.05481,0.05473,0.05465,0.05457,0.05449,0.05441,0.05433,0.05425,0.05417,0.05409,0.05401,0.05393,0.05385,0.05377,0.05369,0.05361,0.05353,0.05345,0.05337,0.0533,0.05322,0.05314,0.05306,0.05298,0.0529,0.05283,0.05275,0.05267,0.05259,0.05251,0.05244,0.05236,0.05228,0.0522,0.05213,0.05205,0.05197,0.0519,0.05182,0.05174,0.05167,0.05159,0.05151,0.05144,0.05136,0.05129,0.05121,0.05113,0.05106,0.05098,0.05091,0.05083,0.05076,0.05068,0.05061,0.05053,0.05046,0.05038,0.05031,0.05024,0.05016,0.05009,0.05001,0.04994,0.04986,0.04979,0.04972,0.04964,0.04957,0.0495,0.04942,0.04935,0.04928,0.0492,0.04913,0.04906,0.04899,0.04891,0.04884,0.04877,0.0487,0.04863,0.04855,0.04848,0.04841, +0.04834,0.04827,0.0482,0.04812,0.04805,0.04798,0.04791,0.04784,0.04777,0.0477,0.04763,0.04756,0.04749,0.04742,0.04735,0.04728,0.04721,0.04714,0.04707,0.047,0.04693,0.04686,0.04679,0.04672,0.04665,0.04658,0.04651,0.04644,0.04637,0.0463,0.04624,0.04617,0.0461,0.04603,0.04596,0.04589,0.04583,0.04576,0.04569,0.04562,0.04555,0.04549,0.04542,0.04535,0.04529,0.04522,0.04515,0.04508,0.04502,0.04495,0.04488,0.04482,0.04475,0.04468,0.04462,0.04455,0.04449,0.04442,0.04435,0.04429,0.04422,0.04416,0.04409,0.04403,0.04396,0.0439,0.04383,0.04376,0.0437,0.04364,0.04357,0.04351,0.04344,0.04338,0.04331,0.04325,0.04318,0.04312,0.04306,0.04299,0.04293,0.04286,0.0428,0.04274,0.04267,0.04261,0.04255,0.04248,0.04242,0.04236,0.04229,0.04223,0.04217,0.04211,0.04204,0.04198,0.04192,0.04186,0.04179,0.04173, +0.04167,0.04161,0.04155,0.04148,0.04142,0.04136,0.0413,0.04124,0.04118,0.04112,0.04105,0.04099,0.04093,0.04087,0.04081,0.04075,0.04069,0.04063,0.04057,0.04051,0.04045,0.04039,0.04033,0.04027,0.04021,0.04015,0.04009,0.04003,0.03997,0.03991,0.03985,0.03979,0.03973,0.03967,0.03961,0.03955,0.0395,0.03944,0.03938,0.03932,0.03926,0.0392,0.03914,0.03909,0.03903,0.03897,0.03891,0.03885,0.0388,0.03874,0.03868,0.03862,0.03857,0.03851,0.03845,0.03839,0.03834,0.03828,0.03822,0.03817,0.03811,0.03805,0.038,0.03794,0.03788,0.03783,0.03777,0.03771,0.03766,0.0376,0.03754,0.03749,0.03743,0.03738,0.03732,0.03727,0.03721,0.03715,0.0371,0.03704,0.03699,0.03693,0.03688,0.03682,0.03677,0.03671,0.03666,0.0366,0.03655,0.0365,0.03644,0.03639,0.03633,0.03628,0.03622,0.03617,0.03612,0.03606,0.03601,0.03595, +0.0359,0.03585,0.03579,0.03574,0.03569,0.03563,0.03558,0.03553,0.03547,0.03542,0.03537,0.03532,0.03526,0.03521,0.03516,0.03511,0.03505,0.035,0.03495,0.0349,0.03484,0.03479,0.03474,0.03469,0.03464,0.03459,0.03453,0.03448,0.03443,0.03438,0.03433,0.03428,0.03423,0.03417,0.03412,0.03407,0.03402,0.03397,0.03392,0.03387,0.03382,0.03377,0.03372,0.03367,0.03362,0.03357,0.03352,0.03347,0.03342,0.03337,0.03332,0.03327,0.03322,0.03317,0.03312,0.03307,0.03302,0.03297,0.03292,0.03287,0.03282,0.03277,0.03272,0.03267,0.03263,0.03258,0.03253,0.03248,0.03243,0.03238,0.03233,0.03229,0.03224,0.03219,0.03214,0.03209,0.03205,0.032,0.03195,0.0319,0.03185,0.03181,0.03176,0.03171,0.03166,0.03162,0.03157,0.03152,0.03147,0.03143,0.03138,0.03133,0.03129,0.03124,0.03119,0.03115,0.0311,0.03105,0.03101,0.03096, +0.03091,0.03087,0.03082,0.03078,0.03073,0.03068,0.03064,0.03059,0.03055,0.0305,0.03045,0.03041,0.03036,0.03032,0.03027,0.03023,0.03018,0.03014,0.03009,0.03005,0.03,0.02996,0.02991,0.02987,0.02982,0.02978,0.02973,0.02969,0.02964,0.0296,0.02955,0.02951,0.02947,0.02942,0.02938,0.02933,0.02929,0.02925,0.0292,0.02916,0.02911,0.02907,0.02903,0.02898,0.02894,0.0289,0.02885,0.02881,0.02877,0.02872,0.02868,0.02864,0.02859,0.02855,0.02851,0.02847,0.02842,0.02838,0.02834,0.0283,0.02825,0.02821,0.02817,0.02813,0.02808,0.02804,0.028,0.02796,0.02792,0.02787,0.02783,0.02779,0.02775,0.02771,0.02767,0.02762,0.02758,0.02754,0.0275,0.02746,0.02742,0.02738,0.02734,0.02729,0.02725,0.02721,0.02717,0.02713,0.02709,0.02705,0.02701,0.02697,0.02693,0.02689,0.02685,0.02681,0.02677,0.02673,0.02669,0.02665, +0.02661,0.02657,0.02653,0.02649,0.02645,0.02641,0.02637,0.02633,0.02629,0.02625,0.02621,0.02617,0.02613,0.02609,0.02605,0.02601,0.02597,0.02593,0.0259,0.02586,0.02582,0.02578,0.02574,0.0257,0.02566,0.02562,0.02559,0.02555,0.02551,0.02547,0.02543,0.02539,0.02536,0.02532,0.02528,0.02524,0.0252,0.02517,0.02513,0.02509,0.02505,0.02501,0.02498,0.02494,0.0249,0.02486,0.02483,0.02479,0.02475,0.02472,0.02468,0.02464,0.0246,0.02457,0.02453,0.02449,0.02446,0.02442,0.02438,0.02435,0.02431,0.02427,0.02424,0.0242,0.02416,0.02413,0.02409,0.02405,0.02402,0.02398,0.02395,0.02391,0.02387,0.02384,0.0238,0.02377,0.02373,0.02369,0.02366,0.02362,0.02359,0.02355,0.02352,0.02348,0.02345,0.02341,0.02338,0.02334,0.02331,0.02327,0.02323,0.0232,0.02316,0.02313,0.0231,0.02306,0.02303,0.02299,0.02296,0.02292, +0.02289,0.02285,0.02282,0.02278,0.02275,0.02272,0.02268,0.02265,0.02261,0.02258,0.02254,0.02251,0.02248,0.02244,0.02241,0.02238,0.02234,0.02231,0.02227,0.02224,0.02221,0.02217,0.02214,0.02211,0.02207,0.02204,0.02201,0.02197,0.02194,0.02191,0.02187,0.02184,0.02181,0.02178,0.02174,0.02171,0.02168,0.02164,0.02161,0.02158,0.02155,0.02151,0.02148,0.02145,0.02142,0.02138,0.02135,0.02132,0.02129,0.02126,0.02122,0.02119,0.02116,0.02113,0.0211,0.02106,0.02103,0.021,0.02097,0.02094,0.02091,0.02087,0.02084,0.02081,0.02078,0.02075,0.02072,0.02069,0.02065,0.02062,0.02059,0.02056,0.02053,0.0205,0.02047,0.02044,0.02041,0.02038,0.02035,0.02031,0.02028,0.02025,0.02022,0.02019,0.02016,0.02013,0.0201,0.02007,0.02004,0.02001,0.01998,0.01995,0.01992,0.01989,0.01986,0.01983,0.0198,0.01977,0.01974,0.01971, +0.01968,0.01965,0.01962,0.01959,0.01956,0.01953,0.0195,0.01947,0.01944,0.01941,0.01938,0.01935,0.01933,0.0193,0.01927,0.01924,0.01921,0.01918,0.01915,0.01912,0.01909,0.01906,0.01904,0.01901,0.01898,0.01895,0.01892,0.01889,0.01886,0.01883,0.01881,0.01878,0.01875,0.01872,0.01869,0.01866,0.01864,0.01861,0.01858,0.01855,0.01852,0.0185,0.01847,0.01844,0.01841,0.01838,0.01836,0.01833,0.0183,0.01827,0.01825,0.01822,0.01819,0.01816,0.01814,0.01811,0.01808,0.01805,0.01803,0.018,0.01797,0.01794,0.01792,0.01789,0.01786,0.01784,0.01781,0.01778,0.01775,0.01773,0.0177,0.01767,0.01765,0.01762,0.01759,0.01757,0.01754,0.01751,0.01749,0.01746,0.01744,0.01741,0.01738,0.01736,0.01733,0.0173,0.01728,0.01725,0.01722,0.0172,0.01717,0.01715,0.01712,0.01709,0.01707,0.01704,0.01702,0.01699,0.01697,0.01694, +0.01691,0.01689,0.01686,0.01684,0.01681,0.01679,0.01676,0.01674,0.01671,0.01669,0.01666,0.01663,0.01661,0.01658,0.01656,0.01653,0.01651,0.01648,0.01646,0.01643,0.01641,0.01638,0.01636,0.01633,0.01631,0.01629,0.01626,0.01624,0.01621,0.01619,0.01616,0.01614,0.01611,0.01609,0.01606,0.01604,0.01602,0.01599,0.01597,0.01594,0.01592,0.01589,0.01587,0.01585,0.01582,0.0158,0.01577,0.01575,0.01573,0.0157,0.01568,0.01565,0.01563,0.01561,0.01558,0.01556,0.01554,0.01551,0.01549,0.01547,0.01544,0.01542,0.0154,0.01537,0.01535,0.01533,0.0153,0.01528,0.01526,0.01523,0.01521,0.01519,0.01516,0.01514,0.01512,0.01509,0.01507,0.01505,0.01503,0.015,0.01498,0.01496,0.01493,0.01491,0.01489,0.01487,0.01484,0.01482,0.0148,0.01478,0.01475,0.01473,0.01471,0.01469,0.01467,0.01464,0.01462,0.0146,0.01458,0.01455, +0.01453,0.01451,0.01449,0.01447,0.01444,0.01442,0.0144,0.01438,0.01436,0.01433,0.01431,0.01429,0.01427,0.01425,0.01423,0.0142,0.01418,0.01416,0.01414,0.01412,0.0141,0.01408,0.01405,0.01403,0.01401,0.01399,0.01397,0.01395,0.01393,0.01391,0.01388,0.01386,0.01384,0.01382,0.0138,0.01378,0.01376,0.01374,0.01372,0.0137,0.01367,0.01365,0.01363,0.01361,0.01359,0.01357,0.01355,0.01353,0.01351,0.01349,0.01347,0.01345,0.01343,0.01341,0.01339,0.01337,0.01335,0.01333,0.0133,0.01328,0.01326,0.01324,0.01322,0.0132,0.01318,0.01316,0.01314,0.01312,0.0131,0.01308,0.01306,0.01304,0.01302,0.013,0.01298,0.01296,0.01295,0.01293,0.01291,0.01289,0.01287,0.01285,0.01283,0.01281,0.01279,0.01277,0.01275,0.01273,0.01271,0.01269,0.01267,0.01265,0.01263,0.01261,0.01259,0.01258,0.01256,0.01254,0.01252,0.0125, +0.01248,0.01246,0.01244,0.01242,0.0124,0.01239,0.01237,0.01235,0.01233,0.01231,0.01229,0.01227,0.01225,0.01224,0.01222,0.0122,0.01218,0.01216,0.01214,0.01212,0.01211,0.01209,0.01207,0.01205,0.01203,0.01201,0.012,0.01198,0.01196,0.01194,0.01192,0.0119,0.01189,0.01187,0.01185,0.01183,0.01181,0.0118,0.01178,0.01176,0.01174,0.01172,0.01171,0.01169,0.01167,0.01165,0.01164,0.01162,0.0116,0.01158,0.01156,0.01155,0.01153,0.01151,0.01149,0.01148,0.01146,0.01144,0.01142,0.01141,0.01139,0.01137,0.01135,0.01134,0.01132,0.0113,0.01129,0.01127,0.01125,0.01123,0.01122,0.0112,0.01118,0.01117,0.01115,0.01113,0.01111,0.0111,0.01108,0.01106,0.01105,0.01103,0.01101,0.011,0.01098,0.01096,0.01095,0.01093,0.01091,0.0109,0.01088,0.01086,0.01085,0.01083,0.01081,0.0108,0.01078,0.01076,0.01075,0.01073, +0.01071,0.0107,0.01068,0.01067,0.01065,0.01063,0.01062,0.0106,0.01058,0.01057,0.01055,0.01054,0.01052,0.0105,0.01049,0.01047,0.01046,0.01044,0.01042,0.01041,0.01039,0.01038,0.01036,0.01034,0.01033,0.01031,0.0103,0.01028,0.01027,0.01025,0.01023,0.01022,0.0102,0.01019,0.01017,0.01016,0.01014,0.01013,0.01011,0.01009,0.01008,0.01006,0.01005,0.01003,0.01002,0.01,0.00999,0.00997,0.00996,0.00994,0.00993,0.00991,0.0099,0.00988,0.00987,0.00985,0.00984,0.00982,0.00981,0.00979,0.00978,0.00976,0.00975,0.00973,0.00972,0.0097,0.00969,0.00967,0.00966,0.00964,0.00963,0.00961,0.0096,0.00958,0.00957,0.00955,0.00954,0.00952,0.00951,0.0095,0.00948,0.00947,0.00945,0.00944,0.00942,0.00941,0.00939,0.00938,0.00937,0.00935,0.00934,0.00932,0.00931,0.00929,0.00928,0.00927,0.00925,0.00924,0.00922,0.00921, +0.0092,0.00918,0.00917,0.00915,0.00914,0.00913,0.00911,0.0091,0.00908,0.00907,0.00906,0.00904,0.00903,0.00901,0.009,0.00899,0.00897,0.00896,0.00895,0.00893,0.00892,0.0089,0.00889,0.00888,0.00886,0.00885,0.00884,0.00882,0.00881,0.0088,0.00878,0.00877,0.00876,0.00874,0.00873,0.00872,0.0087,0.00869,0.00868,0.00866,0.00865,0.00864,0.00862,0.00861,0.0086,0.00858,0.00857,0.00856,0.00854,0.00853,0.00852,0.0085,0.00849,0.00848,0.00847,0.00845,0.00844,0.00843,0.00841,0.0084,0.00839,0.00838,0.00836,0.00835,0.00834,0.00832,0.00831,0.0083,0.00829,0.00827,0.00826,0.00825,0.00824,0.00822,0.00821,0.0082,0.00819,0.00817,0.00816,0.00815,0.00813,0.00812,0.00811,0.0081,0.00809,0.00807,0.00806,0.00805,0.00804,0.00802,0.00801,0.008,0.00799,0.00797,0.00796,0.00795,0.00794,0.00793,0.00791,0.0079, +0.00789,0.00788,0.00787,0.00785,0.00784,0.00783,0.00782,0.00781,0.00779,0.00778,0.00777,0.00776,0.00775,0.00773,0.00772,0.00771,0.0077,0.00769,0.00767,0.00766,0.00765,0.00764,0.00763,0.00762,0.0076,0.00759,0.00758,0.00757,0.00756,0.00755,0.00753,0.00752,0.00751,0.0075,0.00749,0.00748,0.00747,0.00745,0.00744,0.00743,0.00742,0.00741,0.0074,0.00739,0.00737,0.00736,0.00735,0.00734,0.00733,0.00732,0.00731,0.0073,0.00728,0.00727,0.00726,0.00725,0.00724,0.00723,0.00722,0.00721,0.0072,0.00718,0.00717,0.00716,0.00715,0.00714,0.00713,0.00712,0.00711,0.0071,0.00709,0.00707,0.00706,0.00705,0.00704,0.00703,0.00702,0.00701,0.007,0.00699,0.00698,0.00697,0.00696,0.00695,0.00693,0.00692,0.00691,0.0069,0.00689,0.00688,0.00687,0.00686,0.00685,0.00684,0.00683,0.00682,0.00681,0.0068,0.00679,0.00678, +0.00677,0.00676,0.00675,0.00674,0.00673,0.00671,0.0067,0.00669,0.00668,0.00667,0.00666,0.00665,0.00664,0.00663,0.00662,0.00661,0.0066,0.00659,0.00658,0.00657,0.00656,0.00655,0.00654,0.00653,0.00652,0.00651,0.0065,0.00649,0.00648,0.00647,0.00646,0.00645,0.00644,0.00643,0.00642,0.00641,0.0064,0.00639,0.00638,0.00637,0.00636,0.00635,0.00634,0.00633,0.00632,0.00631,0.0063,0.00629,0.00629,0.00628,0.00627,0.00626,0.00625,0.00624,0.00623,0.00622,0.00621,0.0062,0.00619,0.00618,0.00617,0.00616,0.00615,0.00614,0.00613,0.00612,0.00611,0.0061,0.00609,0.00609,0.00608,0.00607,0.00606,0.00605,0.00604,0.00603,0.00602,0.00601,0.006,0.00599,0.00598,0.00597,0.00596,0.00596,0.00595,0.00594,0.00593,0.00592,0.00591,0.0059,0.00589,0.00588,0.00587,0.00586,0.00586,0.00585,0.00584,0.00583,0.00582,0.00581, +0.0058,0.00579,0.00578,0.00578,0.00577,0.00576,0.00575,0.00574,0.00573,0.00572,0.00571,0.0057,0.0057,0.00569,0.00568,0.00567,0.00566,0.00565,0.00564,0.00563,0.00563,0.00562,0.00561,0.0056,0.00559,0.00558,0.00557,0.00557,0.00556,0.00555,0.00554,0.00553,0.00552,0.00551,0.00551,0.0055,0.00549,0.00548,0.00547,0.00546,0.00546,0.00545,0.00544,0.00543,0.00542,0.00541,0.00541,0.0054,0.00539,0.00538,0.00537,0.00536,0.00536,0.00535,0.00534,0.00533,0.00532,0.00531,0.00531,0.0053,0.00529,0.00528,0.00527,0.00527,0.00526,0.00525,0.00524,0.00523,0.00522,0.00522,0.00521,0.0052,0.00519,0.00518,0.00518,0.00517,0.00516,0.00515,0.00515,0.00514,0.00513,0.00512,0.00511,0.00511,0.0051,0.00509,0.00508,0.00507,0.00507,0.00506,0.00505,0.00504,0.00504,0.00503,0.00502,0.00501,0.005,0.005,0.00499,0.00498, +0.00497,0.00497,0.00496,0.00495,0.00494,0.00494,0.00493,0.00492,0.00491,0.0049,0.0049,0.00489,0.00488,0.00487,0.00487,0.00486,0.00485,0.00484,0.00484,0.00483,0.00482,0.00481,0.00481,0.0048,0.00479,0.00479,0.00478,0.00477,0.00476,0.00476,0.00475,0.00474,0.00473,0.00473,0.00472,0.00471,0.0047,0.0047,0.00469,0.00468,0.00468,0.00467,0.00466,0.00465,0.00465,0.00464,0.00463,0.00463,0.00462,0.00461,0.0046,0.0046,0.00459,0.00458,0.00458,0.00457,0.00456,0.00455,0.00455,0.00454,0.00453,0.00453,0.00452,0.00451,0.00451,0.0045,0.00449,0.00448,0.00448,0.00447,0.00446,0.00446,0.00445,0.00444,0.00444,0.00443,0.00442,0.00442,0.00441,0.0044,0.0044,0.00439,0.00438,0.00438,0.00437,0.00436,0.00436,0.00435,0.00434,0.00434,0.00433,0.00432,0.00432,0.00431,0.0043,0.0043,0.00429,0.00428,0.00428,0.00427, +0.00426,0.00426,0.00425,0.00424,0.00424,0.00423,0.00422,0.00422,0.00421,0.0042,0.0042,0.00419,0.00418,0.00418,0.00417,0.00416,0.00416,0.00415,0.00415,0.00414,0.00413,0.00413,0.00412,0.00411,0.00411,0.0041,0.00409,0.00409,0.00408,0.00408,0.00407,0.00406,0.00406,0.00405,0.00404,0.00404,0.00403,0.00403,0.00402,0.00401,0.00401,0.004,0.00399,0.00399,0.00398,0.00398,0.00397,0.00396,0.00396,0.00395,0.00395,0.00394,0.00393,0.00393,0.00392,0.00391,0.00391,0.0039,0.0039,0.00389,0.00388,0.00388,0.00387,0.00387,0.00386,0.00385,0.00385,0.00384,0.00384,0.00383,0.00383,0.00382,0.00381,0.00381,0.0038,0.0038,0.00379,0.00378,0.00378,0.00377,0.00377,0.00376,0.00375,0.00375,0.00374,0.00374,0.00373,0.00373,0.00372,0.00371,0.00371,0.0037,0.0037,0.00369,0.00369,0.00368,0.00367,0.00367,0.00366,0.00366}; + +constexpr double stored_lower_incomplete_gamma_values_n4[] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,1e-05,1e-05,1e-05,1e-05,2e-05,2e-05,3e-05,3e-05,4e-05,4e-05,5e-05,6e-05,7e-05,8e-05,9e-05,0.0001,0.00011,0.00012,0.00014,0.00015,0.00016,0.00018,0.0002,0.00021,0.00023,0.00025,0.00027,0.00029,0.00031,0.00033,0.00036,0.00038,0.00041,0.00043,0.00046,0.00049,0.00051,0.00054,0.00058,0.00061,0.00064,0.00067,0.00071,0.00074,0.00078,0.00082,0.00086,0.0009,0.00094,0.00098,0.00102,0.00107,0.00111,0.00116,0.00121,0.00126,0.00131,0.00136,0.00141,0.00146,0.00152,0.00157,0.00163,0.00169,0.00175,0.00181,0.00187,0.00193,0.00199,0.00206,0.00212,0.00219,0.00226,0.00233,0.0024,0.00247,0.00254,0.00262,0.00269,0.00277,0.00285,0.00293,0.00301,0.00309,0.00317,0.00325,0.00334,0.00343,0.00351,0.0036,0.00369,0.00379,0.00388, +0.00397,0.00407,0.00416,0.00426,0.00436,0.00446,0.00456,0.00467,0.00477,0.00488,0.00498,0.00509,0.0052,0.00531,0.00542,0.00554,0.00565,0.00577,0.00588,0.006,0.00612,0.00624,0.00636,0.00649,0.00661,0.00674,0.00687,0.007,0.00713,0.00726,0.00739,0.00752,0.00766,0.0078,0.00793,0.00807,0.00821,0.00836,0.0085,0.00864,0.00879,0.00894,0.00909,0.00924,0.00939,0.00954,0.0097,0.00985,0.01001,0.01017,0.01032,0.01049,0.01065,0.01081,0.01098,0.01114,0.01131,0.01148,0.01165,0.01182,0.01199,0.01217,0.01234,0.01252,0.0127,0.01288,0.01306,0.01324,0.01342,0.01361,0.01379,0.01398,0.01417,0.01436,0.01455,0.01474,0.01494,0.01513,0.01533,0.01553,0.01573,0.01593,0.01613,0.01633,0.01654,0.01675,0.01695,0.01716,0.01737,0.01758,0.0178,0.01801,0.01823,0.01844,0.01866,0.01888,0.0191,0.01932,0.01955,0.01977, +0.02,0.02023,0.02046,0.02069,0.02092,0.02115,0.02138,0.02162,0.02186,0.02209,0.02233,0.02257,0.02282,0.02306,0.0233,0.02355,0.0238,0.02405,0.0243,0.02455,0.0248,0.02505,0.02531,0.02556,0.02582,0.02608,0.02634,0.0266,0.02687,0.02713,0.0274,0.02766,0.02793,0.0282,0.02847,0.02874,0.02902,0.02929,0.02957,0.02984,0.03012,0.0304,0.03068,0.03097,0.03125,0.03153,0.03182,0.03211,0.0324,0.03269,0.03298,0.03327,0.03356,0.03386,0.03415,0.03445,0.03475,0.03505,0.03535,0.03565,0.03596,0.03626,0.03657,0.03688,0.03719,0.0375,0.03781,0.03812,0.03843,0.03875,0.03906,0.03938,0.0397,0.04002,0.04034,0.04066,0.04099,0.04131,0.04164,0.04197,0.04229,0.04262,0.04296,0.04329,0.04362,0.04396,0.04429,0.04463,0.04497,0.04531,0.04565,0.04599,0.04633,0.04668,0.04702,0.04737,0.04772,0.04806,0.04841,0.04877, +0.04912,0.04947,0.04983,0.05018,0.05054,0.0509,0.05126,0.05162,0.05198,0.05234,0.05271,0.05307,0.05344,0.05381,0.05418,0.05455,0.05492,0.05529,0.05566,0.05604,0.05641,0.05679,0.05717,0.05755,0.05793,0.05831,0.05869,0.05908,0.05946,0.05985,0.06023,0.06062,0.06101,0.0614,0.06179,0.06219,0.06258,0.06297,0.06337,0.06377,0.06417,0.06456,0.06496,0.06537,0.06577,0.06617,0.06658,0.06698,0.06739,0.0678,0.06821,0.06862,0.06903,0.06944,0.06985,0.07027,0.07068,0.0711,0.07152,0.07194,0.07236,0.07278,0.0732,0.07362,0.07405,0.07447,0.0749,0.07532,0.07575,0.07618,0.07661,0.07704,0.07747,0.07791,0.07834,0.07878,0.07921,0.07965,0.08009,0.08053,0.08097,0.08141,0.08185,0.0823,0.08274,0.08319,0.08363,0.08408,0.08453,0.08498,0.08543,0.08588,0.08633,0.08679,0.08724,0.08769,0.08815,0.08861,0.08907,0.08953, +0.08999,0.09045,0.09091,0.09137,0.09184,0.0923,0.09277,0.09323,0.0937,0.09417,0.09464,0.09511,0.09558,0.09605,0.09653,0.097,0.09748,0.09795,0.09843,0.09891,0.09939,0.09987,0.10035,0.10083,0.10131,0.1018,0.10228,0.10277,0.10325,0.10374,0.10423,0.10472,0.10521,0.1057,0.10619,0.10668,0.10718,0.10767,0.10817,0.10866,0.10916,0.10966,0.11015,0.11065,0.11115,0.11166,0.11216,0.11266,0.11316,0.11367,0.11418,0.11468,0.11519,0.1157,0.11621,0.11672,0.11723,0.11774,0.11825,0.11876,0.11928,0.11979,0.12031,0.12082,0.12134,0.12186,0.12238,0.1229,0.12342,0.12394,0.12446,0.12498,0.12551,0.12603,0.12656,0.12708,0.12761,0.12814,0.12867,0.1292,0.12973,0.13026,0.13079,0.13132,0.13185,0.13239,0.13292,0.13346,0.13399,0.13453,0.13507,0.13561,0.13614,0.13668,0.13723,0.13777,0.13831,0.13885,0.1394,0.13994, +0.14049,0.14103,0.14158,0.14212,0.14267,0.14322,0.14377,0.14432,0.14487,0.14542,0.14598,0.14653,0.14708,0.14764,0.14819,0.14875,0.14931,0.14986,0.15042,0.15098,0.15154,0.1521,0.15266,0.15322,0.15378,0.15435,0.15491,0.15547,0.15604,0.1566,0.15717,0.15774,0.1583,0.15887,0.15944,0.16001,0.16058,0.16115,0.16172,0.16229,0.16287,0.16344,0.16401,0.16459,0.16516,0.16574,0.16632,0.16689,0.16747,0.16805,0.16863,0.16921,0.16979,0.17037,0.17095,0.17153,0.17211,0.1727,0.17328,0.17387,0.17445,0.17504,0.17562,0.17621,0.1768,0.17739,0.17797,0.17856,0.17915,0.17974,0.18033,0.18093,0.18152,0.18211,0.1827,0.1833,0.18389,0.18449,0.18508,0.18568,0.18628,0.18687,0.18747,0.18807,0.18867,0.18927,0.18987,0.19047,0.19107,0.19167,0.19227,0.19287,0.19348,0.19408,0.19469,0.19529,0.1959,0.1965,0.19711,0.19771, +0.19832,0.19893,0.19954,0.20015,0.20076,0.20137,0.20198,0.20259,0.2032,0.20381,0.20442,0.20504,0.20565,0.20626,0.20688,0.20749,0.20811,0.20872,0.20934,0.20996,0.21057,0.21119,0.21181,0.21243,0.21305,0.21367,0.21429,0.21491,0.21553,0.21615,0.21677,0.21739,0.21802,0.21864,0.21926,0.21989,0.22051,0.22114,0.22176,0.22239,0.22301,0.22364,0.22427,0.22489,0.22552,0.22615,0.22678,0.22741,0.22804,0.22867,0.2293,0.22993,0.23056,0.23119,0.23182,0.23246,0.23309,0.23372,0.23436,0.23499,0.23563,0.23626,0.2369,0.23753,0.23817,0.2388,0.23944,0.24008,0.24071,0.24135,0.24199,0.24263,0.24327,0.24391,0.24455,0.24519,0.24583,0.24647,0.24711,0.24775,0.24839,0.24904,0.24968,0.25032,0.25096,0.25161,0.25225,0.2529,0.25354,0.25419,0.25483,0.25548,0.25612,0.25677,0.25742,0.25806,0.25871,0.25936,0.26001,0.26065, +0.2613,0.26195,0.2626,0.26325,0.2639,0.26455,0.2652,0.26585,0.2665,0.26715,0.26781,0.26846,0.26911,0.26976,0.27042,0.27107,0.27172,0.27238,0.27303,0.27368,0.27434,0.27499,0.27565,0.2763,0.27696,0.27762,0.27827,0.27893,0.27959,0.28024,0.2809,0.28156,0.28221,0.28287,0.28353,0.28419,0.28485,0.28551,0.28617,0.28683,0.28749,0.28815,0.28881,0.28947,0.29013,0.29079,0.29145,0.29211,0.29277,0.29344,0.2941,0.29476,0.29542,0.29609,0.29675,0.29741,0.29808,0.29874,0.2994,0.30007,0.30073,0.3014,0.30206,0.30273,0.30339,0.30406,0.30472,0.30539,0.30605,0.30672,0.30739,0.30805,0.30872,0.30939,0.31005,0.31072,0.31139,0.31206,0.31272,0.31339,0.31406,0.31473,0.3154,0.31607,0.31674,0.31741,0.31807,0.31874,0.31941,0.32008,0.32075,0.32142,0.32209,0.32276,0.32344,0.32411,0.32478,0.32545,0.32612,0.32679, +0.32746,0.32813,0.32881,0.32948,0.33015,0.33082,0.33149,0.33217,0.33284,0.33351,0.33419,0.33486,0.33553,0.33621,0.33688,0.33755,0.33823,0.3389,0.33957,0.34025,0.34092,0.3416,0.34227,0.34295,0.34362,0.34429,0.34497,0.34564,0.34632,0.34699,0.34767,0.34835,0.34902,0.3497,0.35037,0.35105,0.35172,0.3524,0.35308,0.35375,0.35443,0.3551,0.35578,0.35646,0.35713,0.35781,0.35849,0.35916,0.35984,0.36052,0.3612,0.36187,0.36255,0.36323,0.3639,0.36458,0.36526,0.36594,0.36661,0.36729,0.36797,0.36865,0.36932,0.37,0.37068,0.37136,0.37204,0.37271,0.37339,0.37407,0.37475,0.37543,0.37611,0.37678,0.37746,0.37814,0.37882,0.3795,0.38018,0.38086,0.38153,0.38221,0.38289,0.38357,0.38425,0.38493,0.38561,0.38629,0.38696,0.38764,0.38832,0.389,0.38968,0.39036,0.39104,0.39172,0.3924,0.39308,0.39375,0.39443, +0.39511,0.39579,0.39647,0.39715,0.39783,0.39851,0.39919,0.39987,0.40054,0.40122,0.4019,0.40258,0.40326,0.40394,0.40462,0.4053,0.40598,0.40666,0.40734,0.40801,0.40869,0.40937,0.41005,0.41073,0.41141,0.41209,0.41277,0.41345,0.41412,0.4148,0.41548,0.41616,0.41684,0.41752,0.4182,0.41887,0.41955,0.42023,0.42091,0.42159,0.42227,0.42295,0.42362,0.4243,0.42498,0.42566,0.42634,0.42701,0.42769,0.42837,0.42905,0.42973,0.4304,0.43108,0.43176,0.43244,0.43311,0.43379,0.43447,0.43515,0.43582,0.4365,0.43718,0.43786,0.43853,0.43921,0.43989,0.44056,0.44124,0.44192,0.44259,0.44327,0.44395,0.44462,0.4453,0.44598,0.44665,0.44733,0.448,0.44868,0.44936,0.45003,0.45071,0.45138,0.45206,0.45273,0.45341,0.45408,0.45476,0.45543,0.45611,0.45678,0.45746,0.45813,0.45881,0.45948,0.46016,0.46083,0.46151,0.46218, +0.46285,0.46353,0.4642,0.46487,0.46555,0.46622,0.4669,0.46757,0.46824,0.46891,0.46959,0.47026,0.47093,0.47161,0.47228,0.47295,0.47362,0.47429,0.47497,0.47564,0.47631,0.47698,0.47765,0.47832,0.47899,0.47967,0.48034,0.48101,0.48168,0.48235,0.48302,0.48369,0.48436,0.48503,0.4857,0.48637,0.48704,0.48771,0.48838,0.48905,0.48971,0.49038,0.49105,0.49172,0.49239,0.49306,0.49373,0.49439,0.49506,0.49573,0.4964,0.49706,0.49773,0.4984,0.49907,0.49973,0.5004,0.50106,0.50173,0.5024,0.50306,0.50373,0.50439,0.50506,0.50573,0.50639,0.50706,0.50772,0.50838,0.50905,0.50971,0.51038,0.51104,0.51171,0.51237,0.51303,0.5137,0.51436,0.51502,0.51568,0.51635,0.51701,0.51767,0.51833,0.519,0.51966,0.52032,0.52098,0.52164,0.5223,0.52296,0.52362,0.52428,0.52494,0.5256,0.52626,0.52692,0.52758,0.52824,0.5289, +0.52956,0.53022,0.53088,0.53154,0.53219,0.53285,0.53351,0.53417,0.53482,0.53548,0.53614,0.5368,0.53745,0.53811,0.53876,0.53942,0.54008,0.54073,0.54139,0.54204,0.5427,0.54335,0.54401,0.54466,0.54531,0.54597,0.54662,0.54727,0.54793,0.54858,0.54923,0.54989,0.55054,0.55119,0.55184,0.55249,0.55315,0.5538,0.55445,0.5551,0.55575,0.5564,0.55705,0.5577,0.55835,0.559,0.55965,0.5603,0.56095,0.56159,0.56224,0.56289,0.56354,0.56419,0.56483,0.56548,0.56613,0.56677,0.56742,0.56807,0.56871,0.56936,0.57,0.57065,0.5713,0.57194,0.57258,0.57323,0.57387,0.57452,0.57516,0.5758,0.57645,0.57709,0.57773,0.57838,0.57902,0.57966,0.5803,0.58094,0.58158,0.58222,0.58287,0.58351,0.58415,0.58479,0.58543,0.58607,0.5867,0.58734,0.58798,0.58862,0.58926,0.5899,0.59053,0.59117,0.59181,0.59245,0.59308,0.59372, +0.59436,0.59499,0.59563,0.59626,0.5969,0.59753,0.59817,0.5988,0.59943,0.60007,0.6007,0.60134,0.60197,0.6026,0.60323,0.60387,0.6045,0.60513,0.60576,0.60639,0.60702,0.60765,0.60828,0.60891,0.60954,0.61017,0.6108,0.61143,0.61206,0.61269,0.61332,0.61394,0.61457,0.6152,0.61583,0.61645,0.61708,0.61771,0.61833,0.61896,0.61958,0.62021,0.62083,0.62146,0.62208,0.62271,0.62333,0.62395,0.62458,0.6252,0.62582,0.62644,0.62707,0.62769,0.62831,0.62893,0.62955,0.63017,0.63079,0.63141,0.63203,0.63265,0.63327,0.63389,0.63451,0.63513,0.63574,0.63636,0.63698,0.6376,0.63821,0.63883,0.63945,0.64006,0.64068,0.64129,0.64191,0.64252,0.64314,0.64375,0.64437,0.64498,0.64559,0.6462,0.64682,0.64743,0.64804,0.64865,0.64927,0.64988,0.65049,0.6511,0.65171,0.65232,0.65293,0.65354,0.65415,0.65475,0.65536,0.65597, +0.65658,0.65719,0.65779,0.6584,0.65901,0.65961,0.66022,0.66083,0.66143,0.66204,0.66264,0.66325,0.66385,0.66445,0.66506,0.66566,0.66626,0.66687,0.66747,0.66807,0.66867,0.66927,0.66987,0.67047,0.67107,0.67167,0.67227,0.67287,0.67347,0.67407,0.67467,0.67527,0.67587,0.67646,0.67706,0.67766,0.67825,0.67885,0.67945,0.68004,0.68064,0.68123,0.68183,0.68242,0.68302,0.68361,0.6842,0.6848,0.68539,0.68598,0.68657,0.68717,0.68776,0.68835,0.68894,0.68953,0.69012,0.69071,0.6913,0.69189,0.69248,0.69307,0.69365,0.69424,0.69483,0.69542,0.696,0.69659,0.69718,0.69776,0.69835,0.69893,0.69952,0.7001,0.70069,0.70127,0.70185,0.70244,0.70302,0.7036,0.70419,0.70477,0.70535,0.70593,0.70651,0.70709,0.70767,0.70825,0.70883,0.70941,0.70999,0.71057,0.71115,0.71173,0.7123,0.71288,0.71346,0.71403,0.71461,0.71519, +0.71576,0.71634,0.71691,0.71749,0.71806,0.71863,0.71921,0.71978,0.72035,0.72093,0.7215,0.72207,0.72264,0.72321,0.72378,0.72436,0.72493,0.7255,0.72606,0.72663,0.7272,0.72777,0.72834,0.72891,0.72947,0.73004,0.73061,0.73117,0.73174,0.73231,0.73287,0.73344,0.734,0.73457,0.73513,0.73569,0.73626,0.73682,0.73738,0.73795,0.73851,0.73907,0.73963,0.74019,0.74075,0.74131,0.74187,0.74243,0.74299,0.74355,0.74411,0.74467,0.74522,0.74578,0.74634,0.7469,0.74745,0.74801,0.74856,0.74912,0.74967,0.75023,0.75078,0.75134,0.75189,0.75244,0.753,0.75355,0.7541,0.75465,0.7552,0.75576,0.75631,0.75686,0.75741,0.75796,0.75851,0.75906,0.7596,0.76015,0.7607,0.76125,0.7618,0.76234,0.76289,0.76344,0.76398,0.76453,0.76507,0.76562,0.76616,0.76671,0.76725,0.76779,0.76834,0.76888,0.76942,0.76996,0.7705,0.77105, +0.77159,0.77213,0.77267,0.77321,0.77375,0.77429,0.77482,0.77536,0.7759,0.77644,0.77698,0.77751,0.77805,0.77859,0.77912,0.77966,0.78019,0.78073,0.78126,0.7818,0.78233,0.78286,0.7834,0.78393,0.78446,0.78499,0.78553,0.78606,0.78659,0.78712,0.78765,0.78818,0.78871,0.78924,0.78977,0.79029,0.79082,0.79135,0.79188,0.79241,0.79293,0.79346,0.79398,0.79451,0.79503,0.79556,0.79608,0.79661,0.79713,0.79766,0.79818,0.7987,0.79922,0.79975,0.80027,0.80079,0.80131,0.80183,0.80235,0.80287,0.80339,0.80391,0.80443,0.80495,0.80546,0.80598,0.8065,0.80701,0.80753,0.80805,0.80856,0.80908,0.80959,0.81011,0.81062,0.81114,0.81165,0.81216,0.81268,0.81319,0.8137,0.81421,0.81473,0.81524,0.81575,0.81626,0.81677,0.81728,0.81779,0.8183,0.8188,0.81931,0.81982,0.82033,0.82083,0.82134,0.82185,0.82235,0.82286,0.82337, +0.82387,0.82437,0.82488,0.82538,0.82589,0.82639,0.82689,0.82739,0.8279,0.8284,0.8289,0.8294,0.8299,0.8304,0.8309,0.8314,0.8319,0.8324,0.8329,0.8334,0.83389,0.83439,0.83489,0.83538,0.83588,0.83638,0.83687,0.83737,0.83786,0.83836,0.83885,0.83934,0.83984,0.84033,0.84082,0.84131,0.84181,0.8423,0.84279,0.84328,0.84377,0.84426,0.84475,0.84524,0.84573,0.84622,0.84671,0.84719,0.84768,0.84817,0.84865,0.84914,0.84963,0.85011,0.8506,0.85108,0.85157,0.85205,0.85254,0.85302,0.8535,0.85399,0.85447,0.85495,0.85543,0.85591,0.85639,0.85687,0.85735,0.85783,0.85831,0.85879,0.85927,0.85975,0.86023,0.86071,0.86118,0.86166,0.86214,0.86261,0.86309,0.86356,0.86404,0.86451,0.86499,0.86546,0.86594,0.86641,0.86688,0.86736,0.86783,0.8683,0.86877,0.86924,0.86971,0.87018,0.87065,0.87112,0.87159,0.87206, +0.87253,0.873,0.87347,0.87393,0.8744,0.87487,0.87533,0.8758,0.87627,0.87673,0.8772,0.87766,0.87813,0.87859,0.87905,0.87952,0.87998,0.88044,0.8809,0.88137,0.88183,0.88229,0.88275,0.88321,0.88367,0.88413,0.88459,0.88505,0.8855,0.88596,0.88642,0.88688,0.88733,0.88779,0.88825,0.8887,0.88916,0.88961,0.89007,0.89052,0.89098,0.89143,0.89189,0.89234,0.89279,0.89324,0.8937,0.89415,0.8946,0.89505,0.8955,0.89595,0.8964,0.89685,0.8973,0.89775,0.8982,0.89864,0.89909,0.89954,0.89999,0.90043,0.90088,0.90132,0.90177,0.90221,0.90266,0.9031,0.90355,0.90399,0.90443,0.90488,0.90532,0.90576,0.9062,0.90665,0.90709,0.90753,0.90797,0.90841,0.90885,0.90929,0.90973,0.91017,0.9106,0.91104,0.91148,0.91192,0.91235,0.91279,0.91323,0.91366,0.9141,0.91453,0.91497,0.9154,0.91584,0.91627,0.9167,0.91714, +0.91757,0.918,0.91843,0.91886,0.9193,0.91973,0.92016,0.92059,0.92102,0.92145,0.92188,0.9223,0.92273,0.92316,0.92359,0.92402,0.92444,0.92487,0.9253,0.92572,0.92615,0.92657,0.927,0.92742,0.92785,0.92827,0.92869,0.92912,0.92954,0.92996,0.93038,0.9308,0.93123,0.93165,0.93207,0.93249,0.93291,0.93333,0.93375,0.93416,0.93458,0.935,0.93542,0.93584,0.93625,0.93667,0.93709,0.9375,0.93792,0.93833,0.93875,0.93916,0.93958,0.93999,0.9404,0.94082,0.94123,0.94164,0.94206,0.94247,0.94288,0.94329,0.9437,0.94411,0.94452,0.94493,0.94534,0.94575,0.94616,0.94657,0.94697,0.94738,0.94779,0.9482,0.9486,0.94901,0.94941,0.94982,0.95023,0.95063,0.95103,0.95144,0.95184,0.95225,0.95265,0.95305,0.95345,0.95386,0.95426,0.95466,0.95506,0.95546,0.95586,0.95626,0.95666,0.95706,0.95746,0.95786,0.95826,0.95865, +0.95905,0.95945,0.95985,0.96024,0.96064,0.96103,0.96143,0.96182,0.96222,0.96261,0.96301,0.9634,0.9638,0.96419,0.96458,0.96497,0.96537,0.96576,0.96615,0.96654,0.96693,0.96732,0.96771,0.9681,0.96849,0.96888,0.96927,0.96966,0.97004,0.97043,0.97082,0.97121,0.97159,0.97198,0.97236,0.97275,0.97313,0.97352,0.9739,0.97429,0.97467,0.97506,0.97544,0.97582,0.9762,0.97659,0.97697,0.97735,0.97773,0.97811,0.97849,0.97887,0.97925,0.97963,0.98001,0.98039,0.98077,0.98115,0.98152,0.9819,0.98228,0.98266,0.98303,0.98341,0.98378,0.98416,0.98453,0.98491,0.98528,0.98566,0.98603,0.98641,0.98678,0.98715,0.98752,0.9879,0.98827,0.98864,0.98901,0.98938,0.98975,0.99012,0.99049,0.99086,0.99123,0.9916,0.99197,0.99234,0.9927,0.99307,0.99344,0.9938,0.99417,0.99454,0.9949,0.99527,0.99563,0.996,0.99636,0.99673, +0.99709,0.99745,0.99782,0.99818,0.99854,0.9989,0.99927,0.99963,0.99999,1.00035,1.00071,1.00107,1.00143,1.00179,1.00215,1.00251,1.00287,1.00323,1.00358,1.00394,1.0043,1.00465,1.00501,1.00537,1.00572,1.00608,1.00643,1.00679,1.00714,1.0075,1.00785,1.00821,1.00856,1.00891,1.00927,1.00962,1.00997,1.01032,1.01067,1.01102,1.01137,1.01172,1.01208,1.01242,1.01277,1.01312,1.01347,1.01382,1.01417,1.01452,1.01486,1.01521,1.01556,1.0159,1.01625,1.0166,1.01694,1.01729,1.01763,1.01798,1.01832,1.01867,1.01901,1.01935,1.0197,1.02004,1.02038,1.02072,1.02107,1.02141,1.02175,1.02209,1.02243,1.02277,1.02311,1.02345,1.02379,1.02413,1.02447,1.0248,1.02514,1.02548,1.02582,1.02615,1.02649,1.02683,1.02716,1.0275,1.02783,1.02817,1.0285,1.02884,1.02917,1.02951,1.02984,1.03017,1.03051,1.03084,1.03117,1.0315, +1.03183,1.03217,1.0325,1.03283,1.03316,1.03349,1.03382,1.03415,1.03448,1.03481,1.03513,1.03546,1.03579,1.03612,1.03645,1.03677,1.0371,1.03743,1.03775,1.03808,1.0384,1.03873,1.03905,1.03938,1.0397,1.04003,1.04035,1.04067,1.041,1.04132,1.04164,1.04196,1.04228,1.04261,1.04293,1.04325,1.04357,1.04389,1.04421,1.04453,1.04485,1.04517,1.04549,1.0458,1.04612,1.04644,1.04676,1.04707,1.04739,1.04771,1.04802,1.04834,1.04866,1.04897,1.04929,1.0496,1.04992,1.05023,1.05054,1.05086,1.05117,1.05148,1.0518,1.05211,1.05242,1.05273,1.05304,1.05336,1.05367,1.05398,1.05429,1.0546,1.05491,1.05522,1.05553,1.05583,1.05614,1.05645,1.05676,1.05707,1.05737,1.05768,1.05799,1.05829,1.0586,1.05891,1.05921,1.05952,1.05982,1.06013,1.06043,1.06073,1.06104,1.06134,1.06164,1.06195,1.06225,1.06255,1.06285,1.06316, +1.06346,1.06376,1.06406,1.06436,1.06466,1.06496,1.06526,1.06556,1.06586,1.06616,1.06645,1.06675,1.06705,1.06735,1.06764,1.06794,1.06824,1.06853,1.06883,1.06913,1.06942,1.06972,1.07001,1.07031,1.0706,1.0709,1.07119,1.07148,1.07178,1.07207,1.07236,1.07265,1.07295,1.07324,1.07353,1.07382,1.07411,1.0744,1.07469,1.07498,1.07527,1.07556,1.07585,1.07614,1.07643,1.07672,1.077,1.07729,1.07758,1.07787,1.07815,1.07844,1.07873,1.07901,1.0793,1.07958,1.07987,1.08015,1.08044,1.08072,1.08101,1.08129,1.08158,1.08186,1.08214,1.08242,1.08271,1.08299,1.08327,1.08355,1.08383,1.08411,1.0844,1.08468,1.08496,1.08524,1.08552,1.08579,1.08607,1.08635,1.08663,1.08691,1.08719,1.08746,1.08774,1.08802,1.0883,1.08857,1.08885,1.08912,1.0894,1.08968,1.08995,1.09023,1.0905,1.09077,1.09105,1.09132,1.0916,1.09187, +1.09214,1.09242,1.09269,1.09296,1.09323,1.0935,1.09377,1.09405,1.09432,1.09459,1.09486,1.09513,1.0954,1.09567,1.09594,1.0962,1.09647,1.09674,1.09701,1.09728,1.09754,1.09781,1.09808,1.09835,1.09861,1.09888,1.09914,1.09941,1.09967,1.09994,1.1002,1.10047,1.10073,1.101,1.10126,1.10153,1.10179,1.10205,1.10231,1.10258,1.10284,1.1031,1.10336,1.10362,1.10388,1.10415,1.10441,1.10467,1.10493,1.10519,1.10545,1.1057,1.10596,1.10622,1.10648,1.10674,1.107,1.10725,1.10751,1.10777,1.10803,1.10828,1.10854,1.1088,1.10905,1.10931,1.10956,1.10982,1.11007,1.11033,1.11058,1.11083,1.11109,1.11134,1.11159,1.11185,1.1121,1.11235,1.11261,1.11286,1.11311,1.11336,1.11361,1.11386,1.11411,1.11436,1.11461,1.11486,1.11511,1.11536,1.11561,1.11586,1.11611,1.11636,1.11661,1.11685,1.1171,1.11735,1.11759,1.11784, +1.11809,1.11833,1.11858,1.11883,1.11907,1.11932,1.11956,1.11981,1.12005,1.1203,1.12054,1.12078,1.12103,1.12127,1.12151,1.12176,1.122,1.12224,1.12248,1.12272,1.12297,1.12321,1.12345,1.12369,1.12393,1.12417,1.12441,1.12465,1.12489,1.12513,1.12537,1.12561,1.12584,1.12608,1.12632,1.12656,1.1268,1.12703,1.12727,1.12751,1.12774,1.12798,1.12822,1.12845,1.12869,1.12892,1.12916,1.12939,1.12963,1.12986,1.1301,1.13033,1.13056,1.1308,1.13103,1.13126,1.13149,1.13173,1.13196,1.13219,1.13242,1.13265,1.13289,1.13312,1.13335,1.13358,1.13381,1.13404,1.13427,1.1345,1.13473,1.13495,1.13518,1.13541,1.13564,1.13587,1.1361,1.13632,1.13655,1.13678,1.137,1.13723,1.13746,1.13768,1.13791,1.13814,1.13836,1.13859,1.13881,1.13904,1.13926,1.13948,1.13971,1.13993,1.14016,1.14038,1.1406,1.14082,1.14105,1.14127, +1.14149,1.14171,1.14194,1.14216,1.14238,1.1426,1.14282,1.14304,1.14326,1.14348,1.1437,1.14392,1.14414,1.14436,1.14458,1.1448,1.14501,1.14523,1.14545,1.14567,1.14588,1.1461,1.14632,1.14654,1.14675,1.14697,1.14718,1.1474,1.14762,1.14783,1.14805,1.14826,1.14848,1.14869,1.1489,1.14912,1.14933,1.14955,1.14976,1.14997,1.15019,1.1504,1.15061,1.15082,1.15103,1.15125,1.15146,1.15167,1.15188,1.15209,1.1523,1.15251,1.15272,1.15293,1.15314,1.15335,1.15356,1.15377,1.15398,1.15419,1.1544,1.1546,1.15481,1.15502,1.15523,1.15543,1.15564,1.15585,1.15605,1.15626,1.15647,1.15667,1.15688,1.15708,1.15729,1.15749,1.1577,1.1579,1.15811,1.15831,1.15852,1.15872,1.15892,1.15913,1.15933,1.15953,1.15974,1.15994,1.16014,1.16034,1.16054,1.16075,1.16095,1.16115,1.16135,1.16155,1.16175,1.16195,1.16215,1.16235, +1.16255,1.16275,1.16295,1.16315,1.16335,1.16354,1.16374,1.16394,1.16414,1.16434,1.16453,1.16473,1.16493,1.16512,1.16532,1.16552,1.16571,1.16591,1.16611,1.1663,1.1665,1.16669,1.16689,1.16708,1.16728,1.16747,1.16766,1.16786,1.16805,1.16824,1.16844,1.16863,1.16882,1.16902,1.16921,1.1694,1.16959,1.16978,1.16998,1.17017,1.17036,1.17055,1.17074,1.17093,1.17112,1.17131,1.1715,1.17169,1.17188,1.17207,1.17226,1.17245,1.17264,1.17282,1.17301,1.1732,1.17339,1.17358,1.17376,1.17395,1.17414,1.17432,1.17451,1.1747,1.17488,1.17507,1.17526,1.17544,1.17563,1.17581,1.176,1.17618,1.17637,1.17655,1.17673,1.17692,1.1771,1.17729,1.17747,1.17765,1.17784,1.17802,1.1782,1.17838,1.17857,1.17875,1.17893,1.17911,1.17929,1.17947,1.17965,1.17983,1.18002,1.1802,1.18038,1.18056,1.18074,1.18092,1.18109,1.18127, +1.18145,1.18163,1.18181,1.18199,1.18217,1.18234,1.18252,1.1827,1.18288,1.18305,1.18323,1.18341,1.18358,1.18376,1.18394,1.18411,1.18429,1.18447,1.18464,1.18482,1.18499,1.18517,1.18534,1.18552,1.18569,1.18586,1.18604,1.18621,1.18638,1.18656,1.18673,1.1869,1.18708,1.18725,1.18742,1.18759,1.18777,1.18794,1.18811,1.18828,1.18845,1.18862,1.18879,1.18896,1.18914,1.18931,1.18948,1.18965,1.18982,1.18998,1.19015,1.19032,1.19049,1.19066,1.19083,1.191,1.19117,1.19133,1.1915,1.19167,1.19184,1.192,1.19217,1.19234,1.19251,1.19267,1.19284,1.193,1.19317,1.19334,1.1935,1.19367,1.19383,1.194,1.19416,1.19433,1.19449,1.19466,1.19482,1.19498,1.19515,1.19531,1.19547,1.19564,1.1958,1.19596,1.19613,1.19629,1.19645,1.19661,1.19678,1.19694,1.1971,1.19726,1.19742,1.19758,1.19774,1.1979,1.19806,1.19823, +1.19839,1.19855,1.19871,1.19886,1.19902,1.19918,1.19934,1.1995,1.19966,1.19982,1.19998,1.20014,1.20029,1.20045,1.20061,1.20077,1.20092,1.20108,1.20124,1.20139,1.20155,1.20171,1.20186,1.20202,1.20218,1.20233,1.20249,1.20264,1.2028,1.20295,1.20311,1.20326,1.20342,1.20357,1.20373,1.20388,1.20403,1.20419,1.20434,1.20449,1.20465,1.2048,1.20495,1.2051,1.20526,1.20541,1.20556,1.20571,1.20587,1.20602,1.20617,1.20632,1.20647,1.20662,1.20677,1.20692,1.20707,1.20722,1.20737,1.20752,1.20767,1.20782,1.20797,1.20812,1.20827,1.20842,1.20857,1.20872,1.20886,1.20901,1.20916,1.20931,1.20946,1.2096,1.20975,1.2099,1.21004,1.21019,1.21034,1.21048,1.21063,1.21078,1.21092,1.21107,1.21121,1.21136,1.21151,1.21165,1.2118,1.21194,1.21209,1.21223,1.21237,1.21252,1.21266,1.21281,1.21295,1.21309,1.21324,1.21338, +1.21352,1.21367,1.21381,1.21395,1.21409,1.21424,1.21438,1.21452,1.21466,1.2148,1.21494,1.21509,1.21523,1.21537,1.21551,1.21565,1.21579,1.21593,1.21607,1.21621,1.21635,1.21649,1.21663,1.21677,1.21691,1.21705,1.21719,1.21732,1.21746,1.2176,1.21774,1.21788,1.21802,1.21815,1.21829,1.21843,1.21857,1.2187,1.21884,1.21898,1.21911,1.21925,1.21939,1.21952,1.21966,1.21979,1.21993,1.22007,1.2202,1.22034,1.22047,1.22061,1.22074,1.22088,1.22101,1.22114,1.22128,1.22141,1.22155,1.22168,1.22181,1.22195,1.22208,1.22221,1.22235,1.22248,1.22261,1.22274,1.22288,1.22301,1.22314,1.22327,1.2234,1.22354,1.22367,1.2238,1.22393,1.22406,1.22419,1.22432,1.22445,1.22458,1.22471,1.22484,1.22497,1.2251,1.22523,1.22536,1.22549,1.22562,1.22575,1.22588,1.22601,1.22614,1.22626,1.22639,1.22652,1.22665,1.22678,1.2269, +1.22703,1.22716,1.22729,1.22741,1.22754,1.22767,1.22779,1.22792,1.22805,1.22817,1.2283,1.22842,1.22855,1.22868,1.2288,1.22893,1.22905,1.22918,1.2293,1.22943,1.22955,1.22968,1.2298,1.22992,1.23005,1.23017,1.2303,1.23042,1.23054,1.23067,1.23079,1.23091,1.23104,1.23116,1.23128,1.2314,1.23153,1.23165,1.23177,1.23189,1.23201,1.23213,1.23226,1.23238,1.2325,1.23262,1.23274,1.23286,1.23298,1.2331,1.23322,1.23334,1.23346,1.23358,1.2337,1.23382,1.23394,1.23406,1.23418,1.2343,1.23442,1.23454,1.23466,1.23477,1.23489,1.23501,1.23513,1.23525,1.23537,1.23548,1.2356,1.23572,1.23584,1.23595,1.23607,1.23619,1.2363,1.23642,1.23654,1.23665,1.23677,1.23688,1.237,1.23712,1.23723,1.23735,1.23746,1.23758,1.23769,1.23781,1.23792,1.23804,1.23815,1.23827,1.23838,1.2385,1.23861,1.23872,1.23884,1.23895, +1.23906,1.23918,1.23929,1.2394,1.23952,1.23963,1.23974,1.23985,1.23997,1.24008,1.24019,1.2403,1.24042,1.24053,1.24064,1.24075,1.24086,1.24097,1.24108,1.2412,1.24131,1.24142,1.24153,1.24164,1.24175,1.24186,1.24197,1.24208,1.24219,1.2423,1.24241,1.24252,1.24263,1.24274,1.24285,1.24295,1.24306,1.24317,1.24328,1.24339,1.2435,1.2436,1.24371,1.24382,1.24393,1.24404,1.24414,1.24425,1.24436,1.24447,1.24457,1.24468,1.24479,1.24489,1.245,1.24511,1.24521,1.24532,1.24542,1.24553,1.24564,1.24574,1.24585,1.24595,1.24606,1.24616,1.24627,1.24637,1.24648,1.24658,1.24669,1.24679,1.2469,1.247,1.2471,1.24721,1.24731,1.24742,1.24752,1.24762,1.24773,1.24783,1.24793,1.24803,1.24814,1.24824,1.24834,1.24845,1.24855,1.24865,1.24875,1.24885,1.24896,1.24906,1.24916,1.24926,1.24936,1.24946,1.24956,1.24966, +1.24977,1.24987,1.24997,1.25007,1.25017,1.25027,1.25037,1.25047,1.25057,1.25067,1.25077,1.25087,1.25097,1.25107,1.25117,1.25126,1.25136,1.25146,1.25156,1.25166,1.25176,1.25186,1.25195,1.25205,1.25215,1.25225,1.25235,1.25244,1.25254,1.25264,1.25274,1.25283,1.25293,1.25303,1.25312,1.25322,1.25332,1.25341,1.25351,1.25361,1.2537,1.2538,1.2539,1.25399,1.25409,1.25418,1.25428,1.25437,1.25447,1.25456,1.25466,1.25475,1.25485,1.25494,1.25504,1.25513,1.25523,1.25532,1.25542,1.25551,1.2556,1.2557,1.25579,1.25588,1.25598,1.25607,1.25616,1.25626,1.25635,1.25644,1.25654,1.25663,1.25672,1.25681,1.25691,1.257,1.25709,1.25718,1.25727,1.25737,1.25746,1.25755,1.25764,1.25773,1.25782,1.25791,1.25801,1.2581,1.25819,1.25828,1.25837,1.25846,1.25855,1.25864,1.25873,1.25882,1.25891,1.259,1.25909,1.25918, +1.25927,1.25936,1.25945,1.25954,1.25963,1.25971,1.2598,1.25989,1.25998,1.26007,1.26016,1.26025,1.26033,1.26042,1.26051,1.2606,1.26069,1.26077,1.26086,1.26095,1.26104,1.26112,1.26121,1.2613,1.26139,1.26147,1.26156,1.26165,1.26173,1.26182,1.2619,1.26199,1.26208,1.26216,1.26225,1.26233,1.26242,1.26251,1.26259,1.26268,1.26276,1.26285,1.26293,1.26302,1.2631,1.26319,1.26327,1.26336,1.26344,1.26353,1.26361,1.26369,1.26378,1.26386,1.26395,1.26403,1.26411,1.2642,1.26428,1.26436,1.26445,1.26453,1.26461,1.2647,1.26478,1.26486,1.26494,1.26503,1.26511,1.26519,1.26527,1.26536,1.26544,1.26552,1.2656,1.26568,1.26577,1.26585,1.26593,1.26601,1.26609,1.26617,1.26625,1.26633,1.26642,1.2665,1.26658,1.26666,1.26674,1.26682,1.2669,1.26698,1.26706,1.26714,1.26722,1.2673,1.26738,1.26746,1.26754,1.26762, +1.2677,1.26778,1.26785,1.26793,1.26801,1.26809,1.26817,1.26825,1.26833,1.26841,1.26848,1.26856,1.26864,1.26872,1.2688,1.26887,1.26895,1.26903,1.26911,1.26918,1.26926,1.26934,1.26942,1.26949,1.26957,1.26965,1.26972,1.2698,1.26988,1.26995,1.27003,1.27011,1.27018,1.27026,1.27034,1.27041,1.27049,1.27056,1.27064,1.27072,1.27079,1.27087,1.27094,1.27102,1.27109,1.27117,1.27124,1.27132,1.27139,1.27147,1.27154,1.27162,1.27169,1.27176,1.27184,1.27191,1.27199,1.27206,1.27214,1.27221,1.27228,1.27236,1.27243,1.2725,1.27258,1.27265,1.27272,1.2728,1.27287,1.27294,1.27301,1.27309,1.27316,1.27323,1.27331,1.27338,1.27345,1.27352,1.27359,1.27367,1.27374,1.27381,1.27388,1.27395,1.27403,1.2741,1.27417,1.27424,1.27431,1.27438,1.27445,1.27452,1.27459,1.27467,1.27474,1.27481,1.27488,1.27495,1.27502,1.27509, +1.27516,1.27523,1.2753,1.27537,1.27544,1.27551,1.27558,1.27565,1.27572,1.27579,1.27586,1.27593,1.27599,1.27606,1.27613,1.2762,1.27627,1.27634,1.27641,1.27648,1.27654,1.27661,1.27668,1.27675,1.27682,1.27689,1.27695,1.27702,1.27709,1.27716,1.27723,1.27729,1.27736,1.27743,1.27749,1.27756,1.27763,1.2777,1.27776,1.27783,1.2779,1.27796,1.27803,1.2781,1.27816,1.27823,1.2783,1.27836,1.27843,1.27849,1.27856,1.27863,1.27869,1.27876,1.27882,1.27889,1.27896,1.27902,1.27909,1.27915,1.27922,1.27928,1.27935,1.27941,1.27948,1.27954,1.27961,1.27967,1.27974,1.2798,1.27986,1.27993,1.27999,1.28006,1.28012,1.28018,1.28025,1.28031,1.28038,1.28044,1.2805,1.28057,1.28063,1.28069,1.28076,1.28082,1.28088,1.28095,1.28101,1.28107,1.28114,1.2812,1.28126,1.28132,1.28139,1.28145,1.28151,1.28157,1.28164,1.2817, +1.28176,1.28182,1.28188,1.28194,1.28201,1.28207,1.28213,1.28219,1.28225,1.28231,1.28238,1.28244,1.2825,1.28256,1.28262,1.28268,1.28274,1.2828,1.28286,1.28292,1.28298,1.28304,1.2831,1.28317,1.28323,1.28329,1.28335,1.28341,1.28347,1.28353,1.28359,1.28364,1.2837,1.28376,1.28382,1.28388,1.28394,1.284,1.28406,1.28412,1.28418,1.28424,1.2843,1.28436,1.28441,1.28447,1.28453,1.28459,1.28465,1.28471,1.28477,1.28482,1.28488,1.28494,1.285,1.28506,1.28511,1.28517,1.28523,1.28529,1.28534,1.2854,1.28546,1.28552,1.28557,1.28563,1.28569,1.28575,1.2858,1.28586,1.28592,1.28597,1.28603,1.28609,1.28614,1.2862,1.28626,1.28631,1.28637,1.28643,1.28648,1.28654,1.28659,1.28665,1.28671,1.28676,1.28682,1.28687,1.28693,1.28698,1.28704,1.28709,1.28715,1.28721,1.28726,1.28732,1.28737,1.28743,1.28748,1.28754, +1.28759,1.28764,1.2877,1.28775,1.28781,1.28786,1.28792,1.28797,1.28803,1.28808,1.28813,1.28819,1.28824,1.2883,1.28835,1.2884,1.28846,1.28851,1.28856,1.28862,1.28867,1.28872,1.28878,1.28883,1.28888,1.28894,1.28899,1.28904,1.2891,1.28915,1.2892,1.28925,1.28931,1.28936,1.28941,1.28946,1.28952,1.28957,1.28962,1.28967,1.28973,1.28978,1.28983,1.28988,1.28993,1.28999,1.29004,1.29009,1.29014,1.29019,1.29024,1.29029,1.29035,1.2904,1.29045,1.2905,1.29055,1.2906,1.29065,1.2907,1.29075,1.29081,1.29086,1.29091,1.29096,1.29101,1.29106,1.29111,1.29116,1.29121,1.29126,1.29131,1.29136,1.29141,1.29146,1.29151,1.29156,1.29161,1.29166,1.29171,1.29176,1.29181,1.29186,1.29191,1.29195,1.292,1.29205,1.2921,1.29215,1.2922,1.29225,1.2923,1.29235,1.2924,1.29244,1.29249,1.29254,1.29259,1.29264,1.29269, +1.29274,1.29278,1.29283,1.29288,1.29293,1.29298,1.29302,1.29307,1.29312,1.29317,1.29321,1.29326,1.29331,1.29336,1.29341,1.29345,1.2935,1.29355,1.29359,1.29364,1.29369,1.29374,1.29378,1.29383,1.29388,1.29392,1.29397,1.29402,1.29406,1.29411,1.29416,1.2942,1.29425,1.2943,1.29434,1.29439,1.29443,1.29448,1.29453,1.29457,1.29462,1.29466,1.29471,1.29476,1.2948,1.29485,1.29489,1.29494,1.29498,1.29503,1.29507,1.29512,1.29517,1.29521,1.29526,1.2953,1.29535,1.29539,1.29544,1.29548,1.29552,1.29557,1.29561,1.29566,1.2957,1.29575,1.29579,1.29584,1.29588,1.29593,1.29597,1.29601,1.29606,1.2961,1.29615,1.29619,1.29623,1.29628,1.29632,1.29637,1.29641,1.29645,1.2965,1.29654,1.29658,1.29663,1.29667,1.29671,1.29676,1.2968,1.29684,1.29689,1.29693,1.29697,1.29701,1.29706,1.2971,1.29714,1.29719,1.29723, +1.29727,1.29731,1.29736,1.2974,1.29744,1.29748,1.29752,1.29757,1.29761,1.29765,1.29769,1.29774,1.29778,1.29782,1.29786,1.2979,1.29794,1.29799,1.29803,1.29807,1.29811,1.29815,1.29819,1.29823,1.29828,1.29832,1.29836,1.2984,1.29844,1.29848,1.29852,1.29856,1.2986,1.29865,1.29869,1.29873,1.29877,1.29881,1.29885,1.29889,1.29893,1.29897,1.29901,1.29905,1.29909,1.29913,1.29917,1.29921,1.29925,1.29929,1.29933,1.29937,1.29941,1.29945,1.29949,1.29953,1.29957,1.29961,1.29965,1.29969,1.29973,1.29977,1.29981,1.29985,1.29988,1.29992,1.29996,1.3,1.30004,1.30008,1.30012,1.30016,1.3002,1.30024,1.30027,1.30031,1.30035,1.30039,1.30043,1.30047,1.30051,1.30054,1.30058,1.30062,1.30066,1.3007,1.30074,1.30077,1.30081,1.30085,1.30089,1.30093,1.30096,1.301,1.30104,1.30108,1.30111,1.30115,1.30119,1.30123}; + +constexpr double stored_gamma_values_n4[] = {0.88623,0.88622,0.8862,0.88618,0.88615,0.88612,0.88608,0.88604,0.886,0.88596,0.88591,0.88586,0.88581,0.88576,0.88571,0.88565,0.88559,0.88553,0.88547,0.88541,0.88534,0.88528,0.88521,0.88514,0.88507,0.88499,0.88492,0.88484,0.88477,0.88469,0.88461,0.88453,0.88444,0.88436,0.88428,0.88419,0.8841,0.88401,0.88392,0.88383,0.88374,0.88365,0.88356,0.88346,0.88336,0.88327,0.88317,0.88307,0.88297,0.88287,0.88277,0.88266,0.88256,0.88245,0.88235,0.88224,0.88213,0.88203,0.88192,0.88181,0.88169,0.88158,0.88147,0.88136,0.88124,0.88113,0.88101,0.88089,0.88077,0.88066,0.88054,0.88042,0.8803,0.88017,0.88005,0.87993,0.8798,0.87968,0.87955,0.87943,0.8793,0.87917,0.87904,0.87891,0.87878,0.87865,0.87852,0.87839,0.87826,0.87812,0.87799,0.87786,0.87772,0.87758,0.87745,0.87731,0.87717,0.87703,0.8769,0.87676, +0.87662,0.87647,0.87633,0.87619,0.87605,0.8759,0.87576,0.87562,0.87547,0.87532,0.87518,0.87503,0.87488,0.87474,0.87459,0.87444,0.87429,0.87414,0.87399,0.87384,0.87368,0.87353,0.87338,0.87322,0.87307,0.87292,0.87276,0.8726,0.87245,0.87229,0.87213,0.87198,0.87182,0.87166,0.8715,0.87134,0.87118,0.87102,0.87086,0.8707,0.87053,0.87037,0.87021,0.87004,0.86988,0.86972,0.86955,0.86938,0.86922,0.86905,0.86889,0.86872,0.86855,0.86838,0.86821,0.86804,0.86787,0.8677,0.86753,0.86736,0.86719,0.86702,0.86685,0.86667,0.8665,0.86633,0.86615,0.86598,0.8658,0.86563,0.86545,0.86528,0.8651,0.86492,0.86475,0.86457,0.86439,0.86421,0.86403,0.86386,0.86368,0.8635,0.86332,0.86313,0.86295,0.86277,0.86259,0.86241,0.86222,0.86204,0.86186,0.86167,0.86149,0.86131,0.86112,0.86094,0.86075,0.86056,0.86038,0.86019, +0.86,0.85982,0.85963,0.85944,0.85925,0.85906,0.85887,0.85868,0.85849,0.8583,0.85811,0.85792,0.85773,0.85754,0.85735,0.85716,0.85696,0.85677,0.85658,0.85638,0.85619,0.856,0.8558,0.85561,0.85541,0.85522,0.85502,0.85482,0.85463,0.85443,0.85423,0.85404,0.85384,0.85364,0.85344,0.85324,0.85304,0.85285,0.85265,0.85245,0.85225,0.85205,0.85185,0.85164,0.85144,0.85124,0.85104,0.85084,0.85064,0.85043,0.85023,0.85003,0.84982,0.84962,0.84941,0.84921,0.84901,0.8488,0.8486,0.84839,0.84818,0.84798,0.84777,0.84757,0.84736,0.84715,0.84694,0.84674,0.84653,0.84632,0.84611,0.8459,0.84569,0.84549,0.84528,0.84507,0.84486,0.84465,0.84444,0.84423,0.84401,0.8438,0.84359,0.84338,0.84317,0.84296,0.84274,0.84253,0.84232,0.8421,0.84189,0.84168,0.84146,0.84125,0.84104,0.84082,0.84061,0.84039,0.84018,0.83996, +0.83974,0.83953,0.83931,0.8391,0.83888,0.83866,0.83845,0.83823,0.83801,0.83779,0.83757,0.83736,0.83714,0.83692,0.8367,0.83648,0.83626,0.83604,0.83582,0.8356,0.83538,0.83516,0.83494,0.83472,0.8345,0.83428,0.83406,0.83384,0.83361,0.83339,0.83317,0.83295,0.83273,0.8325,0.83228,0.83206,0.83183,0.83161,0.83139,0.83116,0.83094,0.83071,0.83049,0.83026,0.83004,0.82981,0.82959,0.82936,0.82914,0.82891,0.82869,0.82846,0.82823,0.82801,0.82778,0.82755,0.82733,0.8271,0.82687,0.82664,0.82641,0.82619,0.82596,0.82573,0.8255,0.82527,0.82504,0.82481,0.82458,0.82436,0.82413,0.8239,0.82367,0.82344,0.82321,0.82298,0.82274,0.82251,0.82228,0.82205,0.82182,0.82159,0.82136,0.82113,0.82089,0.82066,0.82043,0.8202,0.81996,0.81973,0.8195,0.81926,0.81903,0.8188,0.81856,0.81833,0.8181,0.81786,0.81763,0.81739, +0.81716,0.81693,0.81669,0.81646,0.81622,0.81599,0.81575,0.81551,0.81528,0.81504,0.81481,0.81457,0.81433,0.8141,0.81386,0.81363,0.81339,0.81315,0.81291,0.81268,0.81244,0.8122,0.81196,0.81173,0.81149,0.81125,0.81101,0.81077,0.81054,0.8103,0.81006,0.80982,0.80958,0.80934,0.8091,0.80886,0.80862,0.80838,0.80814,0.8079,0.80766,0.80742,0.80718,0.80694,0.8067,0.80646,0.80622,0.80598,0.80574,0.8055,0.80526,0.80501,0.80477,0.80453,0.80429,0.80405,0.80381,0.80356,0.80332,0.80308,0.80284,0.80259,0.80235,0.80211,0.80187,0.80162,0.80138,0.80114,0.80089,0.80065,0.80041,0.80016,0.79992,0.79967,0.79943,0.79919,0.79894,0.7987,0.79845,0.79821,0.79796,0.79772,0.79747,0.79723,0.79698,0.79674,0.79649,0.79625,0.796,0.79576,0.79551,0.79526,0.79502,0.79477,0.79453,0.79428,0.79403,0.79379,0.79354,0.79329, +0.79305,0.7928,0.79255,0.79231,0.79206,0.79181,0.79156,0.79132,0.79107,0.79082,0.79057,0.79033,0.79008,0.78983,0.78958,0.78933,0.78909,0.78884,0.78859,0.78834,0.78809,0.78784,0.7876,0.78735,0.7871,0.78685,0.7866,0.78635,0.7861,0.78585,0.7856,0.78535,0.7851,0.78485,0.7846,0.78435,0.7841,0.78385,0.7836,0.78335,0.7831,0.78285,0.7826,0.78235,0.7821,0.78185,0.7816,0.78135,0.7811,0.78085,0.7806,0.78034,0.78009,0.77984,0.77959,0.77934,0.77909,0.77884,0.77858,0.77833,0.77808,0.77783,0.77758,0.77732,0.77707,0.77682,0.77657,0.77632,0.77606,0.77581,0.77556,0.77531,0.77505,0.7748,0.77455,0.77429,0.77404,0.77379,0.77354,0.77328,0.77303,0.77278,0.77252,0.77227,0.77202,0.77176,0.77151,0.77126,0.771,0.77075,0.77049,0.77024,0.76999,0.76973,0.76948,0.76922,0.76897,0.76872,0.76846,0.76821, +0.76795,0.7677,0.76744,0.76719,0.76693,0.76668,0.76642,0.76617,0.76592,0.76566,0.76541,0.76515,0.7649,0.76464,0.76438,0.76413,0.76387,0.76362,0.76336,0.76311,0.76285,0.7626,0.76234,0.76209,0.76183,0.76157,0.76132,0.76106,0.76081,0.76055,0.7603,0.76004,0.75978,0.75953,0.75927,0.75901,0.75876,0.7585,0.75825,0.75799,0.75773,0.75748,0.75722,0.75696,0.75671,0.75645,0.75619,0.75594,0.75568,0.75542,0.75517,0.75491,0.75465,0.75439,0.75414,0.75388,0.75362,0.75337,0.75311,0.75285,0.75259,0.75234,0.75208,0.75182,0.75156,0.75131,0.75105,0.75079,0.75053,0.75028,0.75002,0.74976,0.7495,0.74925,0.74899,0.74873,0.74847,0.74821,0.74796,0.7477,0.74744,0.74718,0.74692,0.74667,0.74641,0.74615,0.74589,0.74563,0.74538,0.74512,0.74486,0.7446,0.74434,0.74408,0.74383,0.74357,0.74331,0.74305,0.74279,0.74253, +0.74227,0.74202,0.74176,0.7415,0.74124,0.74098,0.74072,0.74046,0.7402,0.73994,0.73969,0.73943,0.73917,0.73891,0.73865,0.73839,0.73813,0.73787,0.73761,0.73735,0.7371,0.73684,0.73658,0.73632,0.73606,0.7358,0.73554,0.73528,0.73502,0.73476,0.7345,0.73424,0.73398,0.73372,0.73347,0.73321,0.73295,0.73269,0.73243,0.73217,0.73191,0.73165,0.73139,0.73113,0.73087,0.73061,0.73035,0.73009,0.72983,0.72957,0.72931,0.72905,0.72879,0.72853,0.72827,0.72801,0.72775,0.72749,0.72723,0.72697,0.72671,0.72645,0.72619,0.72593,0.72567,0.72541,0.72515,0.72489,0.72463,0.72437,0.72412,0.72386,0.7236,0.72334,0.72307,0.72281,0.72255,0.72229,0.72203,0.72177,0.72151,0.72125,0.72099,0.72073,0.72047,0.72021,0.71995,0.71969,0.71943,0.71917,0.71891,0.71865,0.71839,0.71813,0.71787,0.71761,0.71735,0.71709,0.71683,0.71657, +0.71631,0.71605,0.71579,0.71553,0.71527,0.71501,0.71475,0.71449,0.71423,0.71397,0.71371,0.71345,0.71319,0.71293,0.71267,0.71241,0.71215,0.71189,0.71163,0.71137,0.71111,0.71085,0.71059,0.71033,0.71007,0.70981,0.70954,0.70928,0.70902,0.70876,0.7085,0.70824,0.70798,0.70772,0.70746,0.7072,0.70694,0.70668,0.70642,0.70616,0.7059,0.70564,0.70538,0.70512,0.70486,0.7046,0.70434,0.70408,0.70382,0.70356,0.7033,0.70304,0.70278,0.70252,0.70226,0.702,0.70174,0.70148,0.70122,0.70096,0.7007,0.70044,0.70018,0.69992,0.69966,0.6994,0.69914,0.69888,0.69862,0.69836,0.6981,0.69784,0.69758,0.69732,0.69706,0.6968,0.69654,0.69628,0.69602,0.69576,0.6955,0.69524,0.69498,0.69472,0.69446,0.6942,0.69394,0.69368,0.69342,0.69316,0.6929,0.69264,0.69238,0.69212,0.69186,0.6916,0.69134,0.69108,0.69082,0.69056, +0.6903,0.69004,0.68978,0.68952,0.68926,0.689,0.68874,0.68848,0.68822,0.68796,0.6877,0.68744,0.68718,0.68692,0.68666,0.6864,0.68614,0.68588,0.68562,0.68537,0.68511,0.68485,0.68459,0.68433,0.68407,0.68381,0.68355,0.68329,0.68303,0.68277,0.68251,0.68225,0.68199,0.68173,0.68148,0.68122,0.68096,0.6807,0.68044,0.68018,0.67992,0.67966,0.6794,0.67914,0.67888,0.67862,0.67837,0.67811,0.67785,0.67759,0.67733,0.67707,0.67681,0.67655,0.67629,0.67604,0.67578,0.67552,0.67526,0.675,0.67474,0.67448,0.67422,0.67397,0.67371,0.67345,0.67319,0.67293,0.67267,0.67242,0.67216,0.6719,0.67164,0.67138,0.67112,0.67086,0.67061,0.67035,0.67009,0.66983,0.66957,0.66932,0.66906,0.6688,0.66854,0.66828,0.66802,0.66777,0.66751,0.66725,0.66699,0.66673,0.66648,0.66622,0.66596,0.6657,0.66545,0.66519,0.66493,0.66467, +0.66441,0.66416,0.6639,0.66364,0.66338,0.66313,0.66287,0.66261,0.66235,0.6621,0.66184,0.66158,0.66132,0.66107,0.66081,0.66055,0.6603,0.66004,0.65978,0.65952,0.65927,0.65901,0.65875,0.6585,0.65824,0.65798,0.65772,0.65747,0.65721,0.65695,0.6567,0.65644,0.65618,0.65593,0.65567,0.65541,0.65516,0.6549,0.65464,0.65439,0.65413,0.65387,0.65362,0.65336,0.6531,0.65285,0.65259,0.65234,0.65208,0.65182,0.65157,0.65131,0.65106,0.6508,0.65054,0.65029,0.65003,0.64978,0.64952,0.64926,0.64901,0.64875,0.6485,0.64824,0.64798,0.64773,0.64747,0.64722,0.64696,0.64671,0.64645,0.6462,0.64594,0.64568,0.64543,0.64517,0.64492,0.64466,0.64441,0.64415,0.6439,0.64364,0.64339,0.64313,0.64288,0.64262,0.64237,0.64211,0.64186,0.6416,0.64135,0.64109,0.64084,0.64059,0.64033,0.64008,0.63982,0.63957,0.63931,0.63906, +0.6388,0.63855,0.6383,0.63804,0.63779,0.63753,0.63728,0.63702,0.63677,0.63652,0.63626,0.63601,0.63575,0.6355,0.63525,0.63499,0.63474,0.63449,0.63423,0.63398,0.63372,0.63347,0.63322,0.63296,0.63271,0.63246,0.6322,0.63195,0.6317,0.63144,0.63119,0.63094,0.63069,0.63043,0.63018,0.62993,0.62967,0.62942,0.62917,0.62891,0.62866,0.62841,0.62816,0.6279,0.62765,0.6274,0.62715,0.62689,0.62664,0.62639,0.62614,0.62588,0.62563,0.62538,0.62513,0.62488,0.62462,0.62437,0.62412,0.62387,0.62362,0.62336,0.62311,0.62286,0.62261,0.62236,0.62211,0.62185,0.6216,0.62135,0.6211,0.62085,0.6206,0.62035,0.62009,0.61984,0.61959,0.61934,0.61909,0.61884,0.61859,0.61834,0.61809,0.61784,0.61758,0.61733,0.61708,0.61683,0.61658,0.61633,0.61608,0.61583,0.61558,0.61533,0.61508,0.61483,0.61458,0.61433,0.61408,0.61383, +0.61358,0.61333,0.61308,0.61283,0.61258,0.61233,0.61208,0.61183,0.61158,0.61133,0.61108,0.61083,0.61058,0.61033,0.61008,0.60983,0.60958,0.60934,0.60909,0.60884,0.60859,0.60834,0.60809,0.60784,0.60759,0.60734,0.60709,0.60685,0.6066,0.60635,0.6061,0.60585,0.6056,0.60535,0.60511,0.60486,0.60461,0.60436,0.60411,0.60386,0.60362,0.60337,0.60312,0.60287,0.60263,0.60238,0.60213,0.60188,0.60163,0.60139,0.60114,0.60089,0.60064,0.6004,0.60015,0.5999,0.59965,0.59941,0.59916,0.59891,0.59867,0.59842,0.59817,0.59793,0.59768,0.59743,0.59718,0.59694,0.59669,0.59644,0.5962,0.59595,0.59571,0.59546,0.59521,0.59497,0.59472,0.59447,0.59423,0.59398,0.59374,0.59349,0.59324,0.593,0.59275,0.59251,0.59226,0.59202,0.59177,0.59152,0.59128,0.59103,0.59079,0.59054,0.5903,0.59005,0.58981,0.58956,0.58932,0.58907, +0.58883,0.58858,0.58834,0.58809,0.58785,0.5876,0.58736,0.58711,0.58687,0.58663,0.58638,0.58614,0.58589,0.58565,0.5854,0.58516,0.58492,0.58467,0.58443,0.58418,0.58394,0.5837,0.58345,0.58321,0.58297,0.58272,0.58248,0.58224,0.58199,0.58175,0.58151,0.58126,0.58102,0.58078,0.58053,0.58029,0.58005,0.5798,0.57956,0.57932,0.57908,0.57883,0.57859,0.57835,0.57811,0.57786,0.57762,0.57738,0.57714,0.57689,0.57665,0.57641,0.57617,0.57593,0.57568,0.57544,0.5752,0.57496,0.57472,0.57447,0.57423,0.57399,0.57375,0.57351,0.57327,0.57303,0.57279,0.57254,0.5723,0.57206,0.57182,0.57158,0.57134,0.5711,0.57086,0.57062,0.57038,0.57014,0.5699,0.56965,0.56941,0.56917,0.56893,0.56869,0.56845,0.56821,0.56797,0.56773,0.56749,0.56725,0.56701,0.56677,0.56653,0.56629,0.56606,0.56582,0.56558,0.56534,0.5651,0.56486, +0.56462,0.56438,0.56414,0.5639,0.56366,0.56342,0.56319,0.56295,0.56271,0.56247,0.56223,0.56199,0.56175,0.56151,0.56128,0.56104,0.5608,0.56056,0.56032,0.56009,0.55985,0.55961,0.55937,0.55913,0.5589,0.55866,0.55842,0.55818,0.55795,0.55771,0.55747,0.55723,0.557,0.55676,0.55652,0.55628,0.55605,0.55581,0.55557,0.55534,0.5551,0.55486,0.55463,0.55439,0.55415,0.55392,0.55368,0.55344,0.55321,0.55297,0.55274,0.5525,0.55226,0.55203,0.55179,0.55156,0.55132,0.55108,0.55085,0.55061,0.55038,0.55014,0.54991,0.54967,0.54944,0.5492,0.54897,0.54873,0.5485,0.54826,0.54803,0.54779,0.54756,0.54732,0.54709,0.54685,0.54662,0.54638,0.54615,0.54591,0.54568,0.54545,0.54521,0.54498,0.54474,0.54451,0.54428,0.54404,0.54381,0.54357,0.54334,0.54311,0.54287,0.54264,0.54241,0.54217,0.54194,0.54171,0.54147,0.54124, +0.54101,0.54077,0.54054,0.54031,0.54008,0.53984,0.53961,0.53938,0.53915,0.53891,0.53868,0.53845,0.53822,0.53798,0.53775,0.53752,0.53729,0.53706,0.53682,0.53659,0.53636,0.53613,0.5359,0.53566,0.53543,0.5352,0.53497,0.53474,0.53451,0.53428,0.53405,0.53381,0.53358,0.53335,0.53312,0.53289,0.53266,0.53243,0.5322,0.53197,0.53174,0.53151,0.53128,0.53105,0.53082,0.53059,0.53036,0.53013,0.5299,0.52967,0.52944,0.52921,0.52898,0.52875,0.52852,0.52829,0.52806,0.52783,0.5276,0.52737,0.52714,0.52691,0.52668,0.52646,0.52623,0.526,0.52577,0.52554,0.52531,0.52508,0.52486,0.52463,0.5244,0.52417,0.52394,0.52371,0.52349,0.52326,0.52303,0.5228,0.52257,0.52235,0.52212,0.52189,0.52166,0.52144,0.52121,0.52098,0.52075,0.52053,0.5203,0.52007,0.51985,0.51962,0.51939,0.51916,0.51894,0.51871,0.51848,0.51826, +0.51803,0.5178,0.51758,0.51735,0.51713,0.5169,0.51667,0.51645,0.51622,0.516,0.51577,0.51554,0.51532,0.51509,0.51487,0.51464,0.51442,0.51419,0.51397,0.51374,0.51352,0.51329,0.51307,0.51284,0.51262,0.51239,0.51217,0.51194,0.51172,0.51149,0.51127,0.51104,0.51082,0.51059,0.51037,0.51015,0.50992,0.5097,0.50947,0.50925,0.50903,0.5088,0.50858,0.50836,0.50813,0.50791,0.50768,0.50746,0.50724,0.50701,0.50679,0.50657,0.50635,0.50612,0.5059,0.50568,0.50545,0.50523,0.50501,0.50479,0.50456,0.50434,0.50412,0.5039,0.50367,0.50345,0.50323,0.50301,0.50279,0.50256,0.50234,0.50212,0.5019,0.50168,0.50146,0.50124,0.50101,0.50079,0.50057,0.50035,0.50013,0.49991,0.49969,0.49947,0.49925,0.49902,0.4988,0.49858,0.49836,0.49814,0.49792,0.4977,0.49748,0.49726,0.49704,0.49682,0.4966,0.49638,0.49616,0.49594, +0.49572,0.4955,0.49528,0.49506,0.49484,0.49462,0.4944,0.49419,0.49397,0.49375,0.49353,0.49331,0.49309,0.49287,0.49265,0.49243,0.49222,0.492,0.49178,0.49156,0.49134,0.49112,0.49091,0.49069,0.49047,0.49025,0.49003,0.48981,0.4896,0.48938,0.48916,0.48894,0.48873,0.48851,0.48829,0.48807,0.48786,0.48764,0.48742,0.48721,0.48699,0.48677,0.48656,0.48634,0.48612,0.48591,0.48569,0.48547,0.48526,0.48504,0.48482,0.48461,0.48439,0.48417,0.48396,0.48374,0.48353,0.48331,0.4831,0.48288,0.48266,0.48245,0.48223,0.48202,0.4818,0.48159,0.48137,0.48116,0.48094,0.48073,0.48051,0.4803,0.48008,0.47987,0.47965,0.47944,0.47922,0.47901,0.4788,0.47858,0.47837,0.47815,0.47794,0.47773,0.47751,0.4773,0.47708,0.47687,0.47666,0.47644,0.47623,0.47602,0.4758,0.47559,0.47538,0.47516,0.47495,0.47474,0.47452,0.47431, +0.4741,0.47389,0.47367,0.47346,0.47325,0.47304,0.47282,0.47261,0.4724,0.47219,0.47197,0.47176,0.47155,0.47134,0.47113,0.47091,0.4707,0.47049,0.47028,0.47007,0.46986,0.46965,0.46943,0.46922,0.46901,0.4688,0.46859,0.46838,0.46817,0.46796,0.46775,0.46754,0.46733,0.46712,0.46691,0.4667,0.46648,0.46627,0.46606,0.46585,0.46564,0.46543,0.46522,0.46501,0.46481,0.4646,0.46439,0.46418,0.46397,0.46376,0.46355,0.46334,0.46313,0.46292,0.46271,0.4625,0.46229,0.46209,0.46188,0.46167,0.46146,0.46125,0.46104,0.46083,0.46063,0.46042,0.46021,0.46,0.45979,0.45959,0.45938,0.45917,0.45896,0.45875,0.45855,0.45834,0.45813,0.45792,0.45772,0.45751,0.4573,0.4571,0.45689,0.45668,0.45648,0.45627,0.45606,0.45585,0.45565,0.45544,0.45524,0.45503,0.45482,0.45462,0.45441,0.4542,0.454,0.45379,0.45359,0.45338, +0.45317,0.45297,0.45276,0.45256,0.45235,0.45215,0.45194,0.45174,0.45153,0.45133,0.45112,0.45092,0.45071,0.45051,0.4503,0.4501,0.44989,0.44969,0.44948,0.44928,0.44907,0.44887,0.44867,0.44846,0.44826,0.44805,0.44785,0.44765,0.44744,0.44724,0.44704,0.44683,0.44663,0.44642,0.44622,0.44602,0.44582,0.44561,0.44541,0.44521,0.445,0.4448,0.4446,0.44439,0.44419,0.44399,0.44379,0.44358,0.44338,0.44318,0.44298,0.44278,0.44257,0.44237,0.44217,0.44197,0.44177,0.44156,0.44136,0.44116,0.44096,0.44076,0.44056,0.44036,0.44015,0.43995,0.43975,0.43955,0.43935,0.43915,0.43895,0.43875,0.43855,0.43835,0.43815,0.43795,0.43775,0.43754,0.43734,0.43714,0.43694,0.43674,0.43654,0.43634,0.43614,0.43595,0.43575,0.43555,0.43535,0.43515,0.43495,0.43475,0.43455,0.43435,0.43415,0.43395,0.43375,0.43355,0.43336,0.43316, +0.43296,0.43276,0.43256,0.43236,0.43216,0.43197,0.43177,0.43157,0.43137,0.43117,0.43098,0.43078,0.43058,0.43038,0.43018,0.42999,0.42979,0.42959,0.42939,0.4292,0.429,0.4288,0.42861,0.42841,0.42821,0.42801,0.42782,0.42762,0.42742,0.42723,0.42703,0.42683,0.42664,0.42644,0.42625,0.42605,0.42585,0.42566,0.42546,0.42527,0.42507,0.42487,0.42468,0.42448,0.42429,0.42409,0.4239,0.4237,0.42351,0.42331,0.42311,0.42292,0.42272,0.42253,0.42234,0.42214,0.42195,0.42175,0.42156,0.42136,0.42117,0.42097,0.42078,0.42058,0.42039,0.4202,0.42,0.41981,0.41961,0.41942,0.41923,0.41903,0.41884,0.41865,0.41845,0.41826,0.41807,0.41787,0.41768,0.41749,0.41729,0.4171,0.41691,0.41672,0.41652,0.41633,0.41614,0.41595,0.41575,0.41556,0.41537,0.41518,0.41498,0.41479,0.4146,0.41441,0.41422,0.41402,0.41383,0.41364, +0.41345,0.41326,0.41307,0.41287,0.41268,0.41249,0.4123,0.41211,0.41192,0.41173,0.41154,0.41135,0.41116,0.41097,0.41077,0.41058,0.41039,0.4102,0.41001,0.40982,0.40963,0.40944,0.40925,0.40906,0.40887,0.40868,0.40849,0.4083,0.40811,0.40792,0.40773,0.40755,0.40736,0.40717,0.40698,0.40679,0.4066,0.40641,0.40622,0.40603,0.40584,0.40566,0.40547,0.40528,0.40509,0.4049,0.40471,0.40452,0.40434,0.40415,0.40396,0.40377,0.40358,0.4034,0.40321,0.40302,0.40283,0.40265,0.40246,0.40227,0.40208,0.4019,0.40171,0.40152,0.40133,0.40115,0.40096,0.40077,0.40059,0.4004,0.40021,0.40003,0.39984,0.39965,0.39947,0.39928,0.3991,0.39891,0.39872,0.39854,0.39835,0.39817,0.39798,0.39779,0.39761,0.39742,0.39724,0.39705,0.39687,0.39668,0.3965,0.39631,0.39613,0.39594,0.39576,0.39557,0.39539,0.3952,0.39502,0.39483, +0.39465,0.39446,0.39428,0.39409,0.39391,0.39373,0.39354,0.39336,0.39317,0.39299,0.39281,0.39262,0.39244,0.39225,0.39207,0.39189,0.3917,0.39152,0.39134,0.39115,0.39097,0.39079,0.3906,0.39042,0.39024,0.39006,0.38987,0.38969,0.38951,0.38933,0.38914,0.38896,0.38878,0.3886,0.38841,0.38823,0.38805,0.38787,0.38769,0.3875,0.38732,0.38714,0.38696,0.38678,0.3866,0.38641,0.38623,0.38605,0.38587,0.38569,0.38551,0.38533,0.38515,0.38497,0.38479,0.3846,0.38442,0.38424,0.38406,0.38388,0.3837,0.38352,0.38334,0.38316,0.38298,0.3828,0.38262,0.38244,0.38226,0.38208,0.3819,0.38172,0.38154,0.38136,0.38118,0.381,0.38083,0.38065,0.38047,0.38029,0.38011,0.37993,0.37975,0.37957,0.37939,0.37922,0.37904,0.37886,0.37868,0.3785,0.37832,0.37815,0.37797,0.37779,0.37761,0.37743,0.37726,0.37708,0.3769,0.37672, +0.37654,0.37637,0.37619,0.37601,0.37583,0.37566,0.37548,0.3753,0.37513,0.37495,0.37477,0.3746,0.37442,0.37424,0.37407,0.37389,0.37371,0.37354,0.37336,0.37318,0.37301,0.37283,0.37266,0.37248,0.3723,0.37213,0.37195,0.37178,0.3716,0.37142,0.37125,0.37107,0.3709,0.37072,0.37055,0.37037,0.3702,0.37002,0.36985,0.36967,0.3695,0.36932,0.36915,0.36897,0.3688,0.36862,0.36845,0.36828,0.3681,0.36793,0.36775,0.36758,0.36741,0.36723,0.36706,0.36688,0.36671,0.36654,0.36636,0.36619,0.36602,0.36584,0.36567,0.3655,0.36532,0.36515,0.36498,0.3648,0.36463,0.36446,0.36428,0.36411,0.36394,0.36377,0.36359,0.36342,0.36325,0.36308,0.36291,0.36273,0.36256,0.36239,0.36222,0.36205,0.36187,0.3617,0.36153,0.36136,0.36119,0.36102,0.36084,0.36067,0.3605,0.36033,0.36016,0.35999,0.35982,0.35965,0.35948,0.3593, +0.35913,0.35896,0.35879,0.35862,0.35845,0.35828,0.35811,0.35794,0.35777,0.3576,0.35743,0.35726,0.35709,0.35692,0.35675,0.35658,0.35641,0.35624,0.35607,0.3559,0.35573,0.35556,0.35539,0.35523,0.35506,0.35489,0.35472,0.35455,0.35438,0.35421,0.35404,0.35387,0.35371,0.35354,0.35337,0.3532,0.35303,0.35286,0.3527,0.35253,0.35236,0.35219,0.35202,0.35186,0.35169,0.35152,0.35135,0.35119,0.35102,0.35085,0.35068,0.35052,0.35035,0.35018,0.35002,0.34985,0.34968,0.34951,0.34935,0.34918,0.34901,0.34885,0.34868,0.34851,0.34835,0.34818,0.34802,0.34785,0.34768,0.34752,0.34735,0.34719,0.34702,0.34685,0.34669,0.34652,0.34636,0.34619,0.34603,0.34586,0.3457,0.34553,0.34536,0.3452,0.34503,0.34487,0.3447,0.34454,0.34437,0.34421,0.34405,0.34388,0.34372,0.34355,0.34339,0.34322,0.34306,0.34289,0.34273,0.34257, +0.3424,0.34224,0.34207,0.34191,0.34175,0.34158,0.34142,0.34126,0.34109,0.34093,0.34077,0.3406,0.34044,0.34028,0.34011,0.33995,0.33979,0.33963,0.33946,0.3393,0.33914,0.33897,0.33881,0.33865,0.33849,0.33832,0.33816,0.338,0.33784,0.33768,0.33751,0.33735,0.33719,0.33703,0.33687,0.33671,0.33654,0.33638,0.33622,0.33606,0.3359,0.33574,0.33558,0.33541,0.33525,0.33509,0.33493,0.33477,0.33461,0.33445,0.33429,0.33413,0.33397,0.33381,0.33365,0.33349,0.33333,0.33317,0.33301,0.33285,0.33269,0.33253,0.33237,0.33221,0.33205,0.33189,0.33173,0.33157,0.33141,0.33125,0.33109,0.33093,0.33077,0.33061,0.33045,0.33029,0.33013,0.32998,0.32982,0.32966,0.3295,0.32934,0.32918,0.32902,0.32886,0.32871,0.32855,0.32839,0.32823,0.32807,0.32792,0.32776,0.3276,0.32744,0.32728,0.32713,0.32697,0.32681,0.32665,0.3265, +0.32634,0.32618,0.32602,0.32587,0.32571,0.32555,0.3254,0.32524,0.32508,0.32493,0.32477,0.32461,0.32446,0.3243,0.32414,0.32399,0.32383,0.32367,0.32352,0.32336,0.3232,0.32305,0.32289,0.32274,0.32258,0.32243,0.32227,0.32211,0.32196,0.3218,0.32165,0.32149,0.32134,0.32118,0.32103,0.32087,0.32072,0.32056,0.32041,0.32025,0.3201,0.31994,0.31979,0.31963,0.31948,0.31932,0.31917,0.31902,0.31886,0.31871,0.31855,0.3184,0.31824,0.31809,0.31794,0.31778,0.31763,0.31748,0.31732,0.31717,0.31701,0.31686,0.31671,0.31655,0.3164,0.31625,0.31609,0.31594,0.31579,0.31564,0.31548,0.31533,0.31518,0.31502,0.31487,0.31472,0.31457,0.31441,0.31426,0.31411,0.31396,0.31381,0.31365,0.3135,0.31335,0.3132,0.31305,0.31289,0.31274,0.31259,0.31244,0.31229,0.31214,0.31199,0.31183,0.31168,0.31153,0.31138,0.31123,0.31108, +0.31093,0.31078,0.31063,0.31047,0.31032,0.31017,0.31002,0.30987,0.30972,0.30957,0.30942,0.30927,0.30912,0.30897,0.30882,0.30867,0.30852,0.30837,0.30822,0.30807,0.30792,0.30777,0.30762,0.30747,0.30732,0.30717,0.30702,0.30688,0.30673,0.30658,0.30643,0.30628,0.30613,0.30598,0.30583,0.30568,0.30554,0.30539,0.30524,0.30509,0.30494,0.30479,0.30464,0.3045,0.30435,0.3042,0.30405,0.3039,0.30376,0.30361,0.30346,0.30331,0.30317,0.30302,0.30287,0.30272,0.30258,0.30243,0.30228,0.30213,0.30199,0.30184,0.30169,0.30155,0.3014,0.30125,0.30111,0.30096,0.30081,0.30067,0.30052,0.30037,0.30023,0.30008,0.29993,0.29979,0.29964,0.29949,0.29935,0.2992,0.29906,0.29891,0.29877,0.29862,0.29847,0.29833,0.29818,0.29804,0.29789,0.29775,0.2976,0.29746,0.29731,0.29717,0.29702,0.29688,0.29673,0.29659,0.29644,0.2963, +0.29615,0.29601,0.29586,0.29572,0.29557,0.29543,0.29529,0.29514,0.295,0.29485,0.29471,0.29456,0.29442,0.29428,0.29413,0.29399,0.29385,0.2937,0.29356,0.29341,0.29327,0.29313,0.29298,0.29284,0.2927,0.29256,0.29241,0.29227,0.29213,0.29198,0.29184,0.2917,0.29156,0.29141,0.29127,0.29113,0.29099,0.29084,0.2907,0.29056,0.29042,0.29027,0.29013,0.28999,0.28985,0.28971,0.28956,0.28942,0.28928,0.28914,0.289,0.28886,0.28871,0.28857,0.28843,0.28829,0.28815,0.28801,0.28787,0.28773,0.28758,0.28744,0.2873,0.28716,0.28702,0.28688,0.28674,0.2866,0.28646,0.28632,0.28618,0.28604,0.2859,0.28576,0.28562,0.28548,0.28534,0.2852,0.28506,0.28492,0.28478,0.28464,0.2845,0.28436,0.28422,0.28408,0.28394,0.2838,0.28366,0.28352,0.28338,0.28324,0.28311,0.28297,0.28283,0.28269,0.28255,0.28241,0.28227,0.28213, +0.282,0.28186,0.28172,0.28158,0.28144,0.2813,0.28117,0.28103,0.28089,0.28075,0.28061,0.28048,0.28034,0.2802,0.28006,0.27992,0.27979,0.27965,0.27951,0.27937,0.27924,0.2791,0.27896,0.27883,0.27869,0.27855,0.27841,0.27828,0.27814,0.278,0.27787,0.27773,0.27759,0.27746,0.27732,0.27718,0.27705,0.27691,0.27678,0.27664,0.2765,0.27637,0.27623,0.27609,0.27596,0.27582,0.27569,0.27555,0.27542,0.27528,0.27514,0.27501,0.27487,0.27474,0.2746,0.27447,0.27433,0.2742,0.27406,0.27393,0.27379,0.27366,0.27352,0.27339,0.27325,0.27312,0.27298,0.27285,0.27271,0.27258,0.27245,0.27231,0.27218,0.27204,0.27191,0.27177,0.27164,0.27151,0.27137,0.27124,0.2711,0.27097,0.27084,0.2707,0.27057,0.27044,0.2703,0.27017,0.27004,0.2699,0.26977,0.26964,0.2695,0.26937,0.26924,0.26911,0.26897,0.26884,0.26871,0.26857}; + +constexpr double scale_of_stored_gammas_n5 = 1545.88; +constexpr double scale_of_stored_incomplete_gammas_n5 = 531.27; + +constexpr double stored_complete_gamma_values_n5[] = {1.0,1.0,0.99999,0.99998,0.99997,0.99996,0.99994,0.99991,0.99989,0.99986,0.99983,0.99979,0.99975,0.99971,0.99966,0.99961,0.99956,0.9995,0.99944,0.99938,0.99931,0.99924,0.99917,0.99909,0.99901,0.99893,0.99884,0.99875,0.99866,0.99856,0.99846,0.99836,0.99826,0.99815,0.99804,0.99792,0.99781,0.99768,0.99756,0.99743,0.9973,0.99717,0.99704,0.9969,0.99675,0.99661,0.99646,0.99631,0.99616,0.996,0.99584,0.99568,0.99551,0.99534,0.99517,0.995,0.99482,0.99464,0.99446,0.99427,0.99408,0.99389,0.9937,0.9935,0.9933,0.9931,0.99289,0.99269,0.99248,0.99226,0.99205,0.99183,0.99161,0.99138,0.99115,0.99093,0.99069,0.99046,0.99022,0.98998,0.98974,0.98949,0.98925,0.989,0.98874,0.98849,0.98823,0.98797,0.98771,0.98744,0.98717,0.9869,0.98663,0.98635,0.98608,0.9858,0.98551,0.98523,0.98494,0.98465, +0.98436,0.98406,0.98377,0.98347,0.98317,0.98286,0.98256,0.98225,0.98194,0.98162,0.98131,0.98099,0.98067,0.98035,0.98002,0.97969,0.97936,0.97903,0.9787,0.97836,0.97803,0.97769,0.97734,0.977,0.97665,0.9763,0.97595,0.9756,0.97524,0.97489,0.97453,0.97416,0.9738,0.97343,0.97307,0.9727,0.97232,0.97195,0.97157,0.9712,0.97082,0.97043,0.97005,0.96966,0.96928,0.96889,0.96849,0.9681,0.9677,0.96731,0.96691,0.9665,0.9661,0.9657,0.96529,0.96488,0.96447,0.96405,0.96364,0.96322,0.9628,0.96238,0.96196,0.96154,0.96111,0.96068,0.96026,0.95982,0.95939,0.95896,0.95852,0.95808,0.95764,0.9572,0.95676,0.95631,0.95586,0.95542,0.95497,0.95451,0.95406,0.9536,0.95315,0.95269,0.95223,0.95177,0.9513,0.95084,0.95037,0.9499,0.94943,0.94896,0.94849,0.94801,0.94754,0.94706,0.94658,0.9461,0.94562,0.94513, +0.94465,0.94416,0.94367,0.94318,0.94269,0.9422,0.9417,0.94121,0.94071,0.94021,0.93971,0.93921,0.9387,0.9382,0.93769,0.93719,0.93668,0.93617,0.93566,0.93514,0.93463,0.93411,0.9336,0.93308,0.93256,0.93204,0.93151,0.93099,0.93046,0.92994,0.92941,0.92888,0.92835,0.92782,0.92728,0.92675,0.92621,0.92568,0.92514,0.9246,0.92406,0.92352,0.92297,0.92243,0.92188,0.92134,0.92079,0.92024,0.91969,0.91914,0.91859,0.91803,0.91748,0.91692,0.91636,0.91581,0.91525,0.91469,0.91412,0.91356,0.913,0.91243,0.91186,0.9113,0.91073,0.91016,0.90959,0.90902,0.90844,0.90787,0.9073,0.90672,0.90614,0.90556,0.90498,0.9044,0.90382,0.90324,0.90266,0.90207,0.90149,0.9009,0.90032,0.89973,0.89914,0.89855,0.89796,0.89737,0.89677,0.89618,0.89558,0.89499,0.89439,0.89379,0.8932,0.8926,0.892,0.89139,0.89079,0.89019, +0.88959,0.88898,0.88838,0.88777,0.88716,0.88655,0.88594,0.88533,0.88472,0.88411,0.8835,0.88289,0.88227,0.88166,0.88104,0.88043,0.87981,0.87919,0.87857,0.87795,0.87733,0.87671,0.87609,0.87547,0.87484,0.87422,0.87359,0.87297,0.87234,0.87171,0.87109,0.87046,0.86983,0.8692,0.86857,0.86794,0.8673,0.86667,0.86604,0.8654,0.86477,0.86413,0.8635,0.86286,0.86222,0.86158,0.86095,0.86031,0.85967,0.85903,0.85838,0.85774,0.8571,0.85646,0.85581,0.85517,0.85452,0.85388,0.85323,0.85258,0.85194,0.85129,0.85064,0.84999,0.84934,0.84869,0.84804,0.84739,0.84674,0.84608,0.84543,0.84478,0.84412,0.84347,0.84281,0.84216,0.8415,0.84085,0.84019,0.83953,0.83887,0.83821,0.83755,0.8369,0.83623,0.83557,0.83491,0.83425,0.83359,0.83293,0.83226,0.8316,0.83094,0.83027,0.82961,0.82894,0.82828,0.82761,0.82694,0.82628, +0.82561,0.82494,0.82427,0.82361,0.82294,0.82227,0.8216,0.82093,0.82026,0.81959,0.81892,0.81824,0.81757,0.8169,0.81623,0.81555,0.81488,0.81421,0.81353,0.81286,0.81218,0.81151,0.81083,0.81016,0.80948,0.8088,0.80813,0.80745,0.80677,0.8061,0.80542,0.80474,0.80406,0.80338,0.8027,0.80202,0.80134,0.80066,0.79998,0.7993,0.79862,0.79794,0.79726,0.79658,0.7959,0.79521,0.79453,0.79385,0.79317,0.79248,0.7918,0.79112,0.79043,0.78975,0.78906,0.78838,0.78769,0.78701,0.78632,0.78564,0.78495,0.78427,0.78358,0.7829,0.78221,0.78152,0.78084,0.78015,0.77946,0.77878,0.77809,0.7774,0.77671,0.77602,0.77534,0.77465,0.77396,0.77327,0.77258,0.77189,0.77121,0.77052,0.76983,0.76914,0.76845,0.76776,0.76707,0.76638,0.76569,0.765,0.76431,0.76362,0.76293,0.76224,0.76155,0.76086,0.76017,0.75947,0.75878,0.75809, +0.7574,0.75671,0.75602,0.75533,0.75464,0.75394,0.75325,0.75256,0.75187,0.75118,0.75049,0.74979,0.7491,0.74841,0.74772,0.74703,0.74633,0.74564,0.74495,0.74426,0.74356,0.74287,0.74218,0.74149,0.7408,0.7401,0.73941,0.73872,0.73803,0.73733,0.73664,0.73595,0.73526,0.73456,0.73387,0.73318,0.73249,0.73179,0.7311,0.73041,0.72972,0.72902,0.72833,0.72764,0.72695,0.72625,0.72556,0.72487,0.72418,0.72349,0.72279,0.7221,0.72141,0.72072,0.72003,0.71933,0.71864,0.71795,0.71726,0.71657,0.71588,0.71519,0.71449,0.7138,0.71311,0.71242,0.71173,0.71104,0.71035,0.70966,0.70897,0.70827,0.70758,0.70689,0.7062,0.70551,0.70482,0.70413,0.70344,0.70275,0.70206,0.70137,0.70068,0.69999,0.69931,0.69862,0.69793,0.69724,0.69655,0.69586,0.69517,0.69448,0.6938,0.69311,0.69242,0.69173,0.69104,0.69036,0.68967,0.68898, +0.68829,0.68761,0.68692,0.68623,0.68555,0.68486,0.68417,0.68349,0.6828,0.68212,0.68143,0.68074,0.68006,0.67937,0.67869,0.678,0.67732,0.67664,0.67595,0.67527,0.67458,0.6739,0.67322,0.67253,0.67185,0.67117,0.67048,0.6698,0.66912,0.66844,0.66775,0.66707,0.66639,0.66571,0.66503,0.66435,0.66367,0.66299,0.66231,0.66163,0.66095,0.66027,0.65959,0.65891,0.65823,0.65755,0.65687,0.65619,0.65551,0.65484,0.65416,0.65348,0.6528,0.65213,0.65145,0.65077,0.6501,0.64942,0.64875,0.64807,0.6474,0.64672,0.64605,0.64537,0.6447,0.64402,0.64335,0.64268,0.642,0.64133,0.64066,0.63998,0.63931,0.63864,0.63797,0.6373,0.63663,0.63596,0.63529,0.63462,0.63394,0.63328,0.63261,0.63194,0.63127,0.6306,0.62993,0.62926,0.62859,0.62793,0.62726,0.62659,0.62593,0.62526,0.62459,0.62393,0.62326,0.6226,0.62193,0.62127, +0.6206,0.61994,0.61928,0.61861,0.61795,0.61729,0.61662,0.61596,0.6153,0.61464,0.61398,0.61332,0.61266,0.612,0.61134,0.61068,0.61002,0.60936,0.6087,0.60804,0.60738,0.60673,0.60607,0.60541,0.60476,0.6041,0.60344,0.60279,0.60213,0.60148,0.60082,0.60017,0.59951,0.59886,0.59821,0.59755,0.5969,0.59625,0.5956,0.59494,0.59429,0.59364,0.59299,0.59234,0.59169,0.59104,0.59039,0.58974,0.5891,0.58845,0.5878,0.58715,0.5865,0.58586,0.58521,0.58457,0.58392,0.58327,0.58263,0.58199,0.58134,0.5807,0.58005,0.57941,0.57877,0.57813,0.57748,0.57684,0.5762,0.57556,0.57492,0.57428,0.57364,0.573,0.57236,0.57172,0.57108,0.57045,0.56981,0.56917,0.56853,0.5679,0.56726,0.56663,0.56599,0.56536,0.56472,0.56409,0.56345,0.56282,0.56219,0.56156,0.56092,0.56029,0.55966,0.55903,0.5584,0.55777,0.55714,0.55651, +0.55588,0.55525,0.55462,0.554,0.55337,0.55274,0.55212,0.55149,0.55086,0.55024,0.54961,0.54899,0.54836,0.54774,0.54712,0.54649,0.54587,0.54525,0.54463,0.54401,0.54339,0.54277,0.54215,0.54153,0.54091,0.54029,0.53967,0.53905,0.53843,0.53782,0.5372,0.53658,0.53597,0.53535,0.53474,0.53412,0.53351,0.53289,0.53228,0.53167,0.53106,0.53044,0.52983,0.52922,0.52861,0.528,0.52739,0.52678,0.52617,0.52556,0.52495,0.52435,0.52374,0.52313,0.52252,0.52192,0.52131,0.52071,0.5201,0.5195,0.51889,0.51829,0.51769,0.51709,0.51648,0.51588,0.51528,0.51468,0.51408,0.51348,0.51288,0.51228,0.51168,0.51108,0.51049,0.50989,0.50929,0.50869,0.5081,0.5075,0.50691,0.50631,0.50572,0.50512,0.50453,0.50394,0.50335,0.50275,0.50216,0.50157,0.50098,0.50039,0.4998,0.49921,0.49862,0.49803,0.49745,0.49686,0.49627,0.49568, +0.4951,0.49451,0.49393,0.49334,0.49276,0.49217,0.49159,0.49101,0.49042,0.48984,0.48926,0.48868,0.4881,0.48752,0.48694,0.48636,0.48578,0.4852,0.48462,0.48405,0.48347,0.48289,0.48232,0.48174,0.48116,0.48059,0.48002,0.47944,0.47887,0.4783,0.47772,0.47715,0.47658,0.47601,0.47544,0.47487,0.4743,0.47373,0.47316,0.47259,0.47202,0.47146,0.47089,0.47032,0.46976,0.46919,0.46863,0.46806,0.4675,0.46693,0.46637,0.46581,0.46524,0.46468,0.46412,0.46356,0.463,0.46244,0.46188,0.46132,0.46076,0.46021,0.45965,0.45909,0.45853,0.45798,0.45742,0.45687,0.45631,0.45576,0.4552,0.45465,0.4541,0.45355,0.45299,0.45244,0.45189,0.45134,0.45079,0.45024,0.44969,0.44914,0.44859,0.44805,0.4475,0.44695,0.44641,0.44586,0.44532,0.44477,0.44423,0.44368,0.44314,0.4426,0.44205,0.44151,0.44097,0.44043,0.43989,0.43935, +0.43881,0.43827,0.43773,0.43719,0.43665,0.43612,0.43558,0.43504,0.43451,0.43397,0.43344,0.4329,0.43237,0.43184,0.4313,0.43077,0.43024,0.42971,0.42918,0.42865,0.42812,0.42759,0.42706,0.42653,0.426,0.42547,0.42495,0.42442,0.42389,0.42337,0.42284,0.42232,0.42179,0.42127,0.42074,0.42022,0.4197,0.41918,0.41866,0.41814,0.41761,0.41709,0.41657,0.41606,0.41554,0.41502,0.4145,0.41398,0.41347,0.41295,0.41244,0.41192,0.41141,0.41089,0.41038,0.40986,0.40935,0.40884,0.40833,0.40782,0.4073,0.40679,0.40628,0.40577,0.40527,0.40476,0.40425,0.40374,0.40323,0.40273,0.40222,0.40172,0.40121,0.40071,0.4002,0.3997,0.3992,0.39869,0.39819,0.39769,0.39719,0.39669,0.39619,0.39569,0.39519,0.39469,0.39419,0.39369,0.39319,0.3927,0.3922,0.3917,0.39121,0.39071,0.39022,0.38972,0.38923,0.38874,0.38824,0.38775, +0.38726,0.38677,0.38628,0.38579,0.3853,0.38481,0.38432,0.38383,0.38334,0.38286,0.38237,0.38188,0.3814,0.38091,0.38043,0.37994,0.37946,0.37897,0.37849,0.37801,0.37753,0.37704,0.37656,0.37608,0.3756,0.37512,0.37464,0.37416,0.37368,0.37321,0.37273,0.37225,0.37178,0.3713,0.37082,0.37035,0.36987,0.3694,0.36893,0.36845,0.36798,0.36751,0.36704,0.36657,0.36609,0.36562,0.36515,0.36469,0.36422,0.36375,0.36328,0.36281,0.36235,0.36188,0.36141,0.36095,0.36048,0.36002,0.35955,0.35909,0.35863,0.35816,0.3577,0.35724,0.35678,0.35632,0.35586,0.3554,0.35494,0.35448,0.35402,0.35356,0.3531,0.35265,0.35219,0.35173,0.35128,0.35082,0.35037,0.34991,0.34946,0.34901,0.34855,0.3481,0.34765,0.3472,0.34675,0.3463,0.34585,0.3454,0.34495,0.3445,0.34405,0.3436,0.34316,0.34271,0.34226,0.34182,0.34137,0.34093, +0.34048,0.34004,0.3396,0.33915,0.33871,0.33827,0.33783,0.33739,0.33694,0.3365,0.33606,0.33563,0.33519,0.33475,0.33431,0.33387,0.33344,0.333,0.33256,0.33213,0.33169,0.33126,0.33082,0.33039,0.32996,0.32952,0.32909,0.32866,0.32823,0.3278,0.32737,0.32694,0.32651,0.32608,0.32565,0.32522,0.32479,0.32436,0.32394,0.32351,0.32309,0.32266,0.32224,0.32181,0.32139,0.32096,0.32054,0.32012,0.31969,0.31927,0.31885,0.31843,0.31801,0.31759,0.31717,0.31675,0.31633,0.31591,0.3155,0.31508,0.31466,0.31425,0.31383,0.31341,0.313,0.31258,0.31217,0.31176,0.31134,0.31093,0.31052,0.31011,0.3097,0.30928,0.30887,0.30846,0.30805,0.30765,0.30724,0.30683,0.30642,0.30601,0.30561,0.3052,0.30479,0.30439,0.30398,0.30358,0.30317,0.30277,0.30237,0.30196,0.30156,0.30116,0.30076,0.30036,0.29996,0.29956,0.29916,0.29876, +0.29836,0.29796,0.29756,0.29716,0.29677,0.29637,0.29597,0.29558,0.29518,0.29479,0.29439,0.294,0.29361,0.29321,0.29282,0.29243,0.29204,0.29164,0.29125,0.29086,0.29047,0.29008,0.28969,0.28931,0.28892,0.28853,0.28814,0.28775,0.28737,0.28698,0.2866,0.28621,0.28583,0.28544,0.28506,0.28467,0.28429,0.28391,0.28353,0.28314,0.28276,0.28238,0.282,0.28162,0.28124,0.28086,0.28048,0.28011,0.27973,0.27935,0.27897,0.2786,0.27822,0.27785,0.27747,0.2771,0.27672,0.27635,0.27597,0.2756,0.27523,0.27485,0.27448,0.27411,0.27374,0.27337,0.273,0.27263,0.27226,0.27189,0.27152,0.27116,0.27079,0.27042,0.27005,0.26969,0.26932,0.26896,0.26859,0.26823,0.26786,0.2675,0.26713,0.26677,0.26641,0.26605,0.26568,0.26532,0.26496,0.2646,0.26424,0.26388,0.26352,0.26316,0.26281,0.26245,0.26209,0.26173,0.26138,0.26102, +0.26066,0.26031,0.25995,0.2596,0.25925,0.25889,0.25854,0.25819,0.25783,0.25748,0.25713,0.25678,0.25643,0.25608,0.25573,0.25538,0.25503,0.25468,0.25433,0.25398,0.25363,0.25329,0.25294,0.25259,0.25225,0.2519,0.25156,0.25121,0.25087,0.25052,0.25018,0.24984,0.24949,0.24915,0.24881,0.24847,0.24813,0.24779,0.24745,0.24711,0.24677,0.24643,0.24609,0.24575,0.24541,0.24508,0.24474,0.2444,0.24407,0.24373,0.24339,0.24306,0.24272,0.24239,0.24206,0.24172,0.24139,0.24106,0.24072,0.24039,0.24006,0.23973,0.2394,0.23907,0.23874,0.23841,0.23808,0.23775,0.23742,0.2371,0.23677,0.23644,0.23611,0.23579,0.23546,0.23514,0.23481,0.23449,0.23416,0.23384,0.23351,0.23319,0.23287,0.23255,0.23222,0.2319,0.23158,0.23126,0.23094,0.23062,0.2303,0.22998,0.22966,0.22934,0.22902,0.22871,0.22839,0.22807,0.22775,0.22744, +0.22712,0.22681,0.22649,0.22618,0.22586,0.22555,0.22524,0.22492,0.22461,0.2243,0.22399,0.22367,0.22336,0.22305,0.22274,0.22243,0.22212,0.22181,0.2215,0.22119,0.22089,0.22058,0.22027,0.21996,0.21966,0.21935,0.21904,0.21874,0.21843,0.21813,0.21782,0.21752,0.21722,0.21691,0.21661,0.21631,0.216,0.2157,0.2154,0.2151,0.2148,0.2145,0.2142,0.2139,0.2136,0.2133,0.213,0.2127,0.21241,0.21211,0.21181,0.21151,0.21122,0.21092,0.21063,0.21033,0.21004,0.20974,0.20945,0.20915,0.20886,0.20857,0.20827,0.20798,0.20769,0.2074,0.20711,0.20682,0.20653,0.20624,0.20595,0.20566,0.20537,0.20508,0.20479,0.2045,0.20421,0.20393,0.20364,0.20335,0.20307,0.20278,0.2025,0.20221,0.20193,0.20164,0.20136,0.20107,0.20079,0.20051,0.20022,0.19994,0.19966,0.19938,0.1991,0.19882,0.19854,0.19826,0.19798,0.1977, +0.19742,0.19714,0.19686,0.19658,0.1963,0.19603,0.19575,0.19547,0.1952,0.19492,0.19465,0.19437,0.1941,0.19382,0.19355,0.19327,0.193,0.19273,0.19245,0.19218,0.19191,0.19164,0.19136,0.19109,0.19082,0.19055,0.19028,0.19001,0.18974,0.18947,0.1892,0.18894,0.18867,0.1884,0.18813,0.18787,0.1876,0.18733,0.18707,0.1868,0.18654,0.18627,0.18601,0.18574,0.18548,0.18521,0.18495,0.18469,0.18443,0.18416,0.1839,0.18364,0.18338,0.18312,0.18286,0.1826,0.18234,0.18208,0.18182,0.18156,0.1813,0.18104,0.18078,0.18052,0.18027,0.18001,0.17975,0.1795,0.17924,0.17899,0.17873,0.17848,0.17822,0.17797,0.17771,0.17746,0.1772,0.17695,0.1767,0.17645,0.17619,0.17594,0.17569,0.17544,0.17519,0.17494,0.17469,0.17444,0.17419,0.17394,0.17369,0.17344,0.17319,0.17295,0.1727,0.17245,0.1722,0.17196,0.17171,0.17147, +0.17122,0.17097,0.17073,0.17048,0.17024,0.17,0.16975,0.16951,0.16927,0.16902,0.16878,0.16854,0.1683,0.16805,0.16781,0.16757,0.16733,0.16709,0.16685,0.16661,0.16637,0.16613,0.16589,0.16566,0.16542,0.16518,0.16494,0.1647,0.16447,0.16423,0.16399,0.16376,0.16352,0.16329,0.16305,0.16282,0.16258,0.16235,0.16212,0.16188,0.16165,0.16142,0.16118,0.16095,0.16072,0.16049,0.16026,0.16002,0.15979,0.15956,0.15933,0.1591,0.15887,0.15864,0.15841,0.15819,0.15796,0.15773,0.1575,0.15727,0.15705,0.15682,0.15659,0.15637,0.15614,0.15592,0.15569,0.15546,0.15524,0.15502,0.15479,0.15457,0.15434,0.15412,0.1539,0.15367,0.15345,0.15323,0.15301,0.15279,0.15257,0.15234,0.15212,0.1519,0.15168,0.15146,0.15124,0.15102,0.15081,0.15059,0.15037,0.15015,0.14993,0.14971,0.1495,0.14928,0.14906,0.14885,0.14863,0.14842, +0.1482,0.14798,0.14777,0.14755,0.14734,0.14713,0.14691,0.1467,0.14649,0.14627,0.14606,0.14585,0.14564,0.14542,0.14521,0.145,0.14479,0.14458,0.14437,0.14416,0.14395,0.14374,0.14353,0.14332,0.14311,0.1429,0.1427,0.14249,0.14228,0.14207,0.14187,0.14166,0.14145,0.14125,0.14104,0.14083,0.14063,0.14042,0.14022,0.14001,0.13981,0.13961,0.1394,0.1392,0.139,0.13879,0.13859,0.13839,0.13818,0.13798,0.13778,0.13758,0.13738,0.13718,0.13698,0.13678,0.13658,0.13638,0.13618,0.13598,0.13578,0.13558,0.13538,0.13518,0.13499,0.13479,0.13459,0.1344,0.1342,0.134,0.13381,0.13361,0.13341,0.13322,0.13302,0.13283,0.13263,0.13244,0.13224,0.13205,0.13186,0.13166,0.13147,0.13128,0.13109,0.13089,0.1307,0.13051,0.13032,0.13013,0.12994,0.12974,0.12955,0.12936,0.12917,0.12898,0.12879,0.12861,0.12842,0.12823, +0.12804,0.12785,0.12766,0.12748,0.12729,0.1271,0.12691,0.12673,0.12654,0.12635,0.12617,0.12598,0.1258,0.12561,0.12543,0.12524,0.12506,0.12487,0.12469,0.12451,0.12432,0.12414,0.12396,0.12377,0.12359,0.12341,0.12323,0.12305,0.12286,0.12268,0.1225,0.12232,0.12214,0.12196,0.12178,0.1216,0.12142,0.12124,0.12106,0.12089,0.12071,0.12053,0.12035,0.12017,0.12,0.11982,0.11964,0.11946,0.11929,0.11911,0.11894,0.11876,0.11858,0.11841,0.11823,0.11806,0.11788,0.11771,0.11754,0.11736,0.11719,0.11701,0.11684,0.11667,0.1165,0.11632,0.11615,0.11598,0.11581,0.11564,0.11546,0.11529,0.11512,0.11495,0.11478,0.11461,0.11444,0.11427,0.1141,0.11393,0.11376,0.1136,0.11343,0.11326,0.11309,0.11292,0.11276,0.11259,0.11242,0.11225,0.11209,0.11192,0.11175,0.11159,0.11142,0.11126,0.11109,0.11093,0.11076,0.1106, +0.11043,0.11027,0.11011,0.10994,0.10978,0.10962,0.10945,0.10929,0.10913,0.10896,0.1088,0.10864,0.10848,0.10832,0.10816,0.108,0.10783,0.10767,0.10751,0.10735,0.10719,0.10703,0.10687,0.10672,0.10656,0.1064,0.10624,0.10608,0.10592,0.10577,0.10561,0.10545,0.10529,0.10514,0.10498,0.10482,0.10467,0.10451,0.10435,0.1042,0.10404,0.10389,0.10373,0.10358,0.10342,0.10327,0.10311,0.10296,0.10281,0.10265,0.1025,0.10235,0.10219,0.10204,0.10189,0.10174,0.10158,0.10143,0.10128,0.10113,0.10098,0.10083,0.10068,0.10053,0.10038,0.10023,0.10008,0.09993,0.09978,0.09963,0.09948,0.09933,0.09918,0.09903,0.09888,0.09874,0.09859,0.09844,0.09829,0.09815,0.098,0.09785,0.0977,0.09756,0.09741,0.09727,0.09712,0.09697,0.09683,0.09668,0.09654,0.09639,0.09625,0.09611,0.09596,0.09582,0.09567,0.09553,0.09539,0.09524, +0.0951,0.09496,0.09482,0.09467,0.09453,0.09439,0.09425,0.09411,0.09396,0.09382,0.09368,0.09354,0.0934,0.09326,0.09312,0.09298,0.09284,0.0927,0.09256,0.09242,0.09228,0.09214,0.09201,0.09187,0.09173,0.09159,0.09145,0.09132,0.09118,0.09104,0.0909,0.09077,0.09063,0.09049,0.09036,0.09022,0.09009,0.08995,0.08981,0.08968,0.08954,0.08941,0.08927,0.08914,0.08901,0.08887,0.08874,0.0886,0.08847,0.08834,0.0882,0.08807,0.08794,0.0878,0.08767,0.08754,0.08741,0.08728,0.08714,0.08701,0.08688,0.08675,0.08662,0.08649,0.08636,0.08623,0.0861,0.08597,0.08584,0.08571,0.08558,0.08545,0.08532,0.08519,0.08506,0.08493,0.08481,0.08468,0.08455,0.08442,0.08429,0.08417,0.08404,0.08391,0.08378,0.08366,0.08353,0.0834,0.08328,0.08315,0.08303,0.0829,0.08278,0.08265,0.08252,0.0824,0.08228,0.08215,0.08203,0.0819, +0.08178,0.08165,0.08153,0.08141,0.08128,0.08116,0.08104,0.08091,0.08079,0.08067,0.08055,0.08042,0.0803,0.08018,0.08006,0.07994,0.07982,0.0797,0.07957,0.07945,0.07933,0.07921,0.07909,0.07897,0.07885,0.07873,0.07861,0.07849,0.07837,0.07826,0.07814,0.07802,0.0779,0.07778,0.07766,0.07755,0.07743,0.07731,0.07719,0.07707,0.07696,0.07684,0.07672,0.07661,0.07649,0.07637,0.07626,0.07614,0.07603,0.07591,0.0758,0.07568,0.07556,0.07545,0.07533,0.07522,0.07511,0.07499,0.07488,0.07476,0.07465,0.07454,0.07442,0.07431,0.0742,0.07408,0.07397,0.07386,0.07374,0.07363,0.07352,0.07341,0.0733,0.07318,0.07307,0.07296,0.07285,0.07274,0.07263,0.07252,0.07241,0.0723,0.07219,0.07208,0.07197,0.07186,0.07175,0.07164,0.07153,0.07142,0.07131,0.0712,0.07109,0.07098,0.07087,0.07077,0.07066,0.07055,0.07044,0.07033, +0.07023,0.07012,0.07001,0.06991,0.0698,0.06969,0.06959,0.06948,0.06937,0.06927,0.06916,0.06906,0.06895,0.06884,0.06874,0.06863,0.06853,0.06842,0.06832,0.06821,0.06811,0.06801,0.0679,0.0678,0.06769,0.06759,0.06749,0.06738,0.06728,0.06718,0.06707,0.06697,0.06687,0.06677,0.06666,0.06656,0.06646,0.06636,0.06626,0.06616,0.06605,0.06595,0.06585,0.06575,0.06565,0.06555,0.06545,0.06535,0.06525,0.06515,0.06505,0.06495,0.06485,0.06475,0.06465,0.06455,0.06445,0.06435,0.06425,0.06416,0.06406,0.06396,0.06386,0.06376,0.06366,0.06357,0.06347,0.06337,0.06327,0.06318,0.06308,0.06298,0.06289,0.06279,0.06269,0.0626,0.0625,0.0624,0.06231,0.06221,0.06212,0.06202,0.06193,0.06183,0.06174,0.06164,0.06155,0.06145,0.06136,0.06126,0.06117,0.06107,0.06098,0.06089,0.06079,0.0607,0.06061,0.06051,0.06042,0.06033, +0.06023,0.06014,0.06005,0.05996,0.05986,0.05977,0.05968,0.05959,0.05949,0.0594,0.05931,0.05922,0.05913,0.05904,0.05895,0.05886,0.05877,0.05867,0.05858,0.05849,0.0584,0.05831,0.05822,0.05813,0.05804,0.05795,0.05787,0.05778,0.05769,0.0576,0.05751,0.05742,0.05733,0.05724,0.05715,0.05707,0.05698,0.05689,0.0568,0.05671,0.05663,0.05654,0.05645,0.05636,0.05628,0.05619,0.0561,0.05602,0.05593,0.05584,0.05576,0.05567,0.05559,0.0555,0.05541,0.05533,0.05524,0.05516,0.05507,0.05499,0.0549,0.05482,0.05473,0.05465,0.05456,0.05448,0.05439,0.05431,0.05423,0.05414,0.05406,0.05397,0.05389,0.05381,0.05372,0.05364,0.05356,0.05348,0.05339,0.05331,0.05323,0.05314,0.05306,0.05298,0.0529,0.05282,0.05273,0.05265,0.05257,0.05249,0.05241,0.05233,0.05225,0.05216,0.05208,0.052,0.05192,0.05184,0.05176,0.05168, +0.0516,0.05152,0.05144,0.05136,0.05128,0.0512,0.05112,0.05104,0.05096,0.05088,0.05081,0.05073,0.05065,0.05057,0.05049,0.05041,0.05033,0.05026,0.05018,0.0501,0.05002,0.04994,0.04987,0.04979,0.04971,0.04964,0.04956,0.04948,0.0494,0.04933,0.04925,0.04917,0.0491,0.04902,0.04894,0.04887,0.04879,0.04872,0.04864,0.04857,0.04849,0.04841,0.04834,0.04826,0.04819,0.04811,0.04804,0.04796,0.04789,0.04782,0.04774,0.04767,0.04759,0.04752,0.04744,0.04737,0.0473,0.04722,0.04715,0.04708,0.047,0.04693,0.04686,0.04678,0.04671,0.04664,0.04657,0.04649,0.04642,0.04635,0.04628,0.0462,0.04613,0.04606,0.04599,0.04592,0.04584,0.04577,0.0457,0.04563,0.04556,0.04549,0.04542,0.04535,0.04528,0.0452,0.04513,0.04506,0.04499,0.04492,0.04485,0.04478,0.04471,0.04464,0.04457,0.0445,0.04443,0.04437,0.0443,0.04423, +0.04416,0.04409,0.04402,0.04395,0.04388,0.04381,0.04375,0.04368,0.04361,0.04354,0.04347,0.0434,0.04334,0.04327,0.0432,0.04313,0.04307,0.043,0.04293,0.04287,0.0428,0.04273,0.04266,0.0426,0.04253,0.04246,0.0424,0.04233,0.04227,0.0422,0.04213,0.04207,0.042,0.04194,0.04187,0.0418,0.04174,0.04167,0.04161,0.04154,0.04148,0.04141,0.04135,0.04128,0.04122,0.04115,0.04109,0.04103,0.04096,0.0409,0.04083,0.04077,0.04071,0.04064,0.04058,0.04051,0.04045,0.04039,0.04032,0.04026,0.0402,0.04013,0.04007,0.04001,0.03995,0.03988,0.03982,0.03976,0.0397,0.03963,0.03957,0.03951,0.03945,0.03939,0.03932,0.03926,0.0392,0.03914,0.03908,0.03902,0.03896,0.03889,0.03883,0.03877,0.03871,0.03865,0.03859,0.03853,0.03847,0.03841,0.03835,0.03829,0.03823,0.03817,0.03811,0.03805,0.03799,0.03793,0.03787,0.03781, +0.03775,0.03769,0.03763,0.03757,0.03751,0.03745,0.0374,0.03734,0.03728,0.03722,0.03716,0.0371,0.03704,0.03699,0.03693,0.03687,0.03681,0.03675,0.0367,0.03664,0.03658,0.03652,0.03647,0.03641,0.03635,0.03629,0.03624,0.03618,0.03612,0.03607,0.03601,0.03595,0.0359,0.03584,0.03578,0.03573,0.03567,0.03561,0.03556,0.0355,0.03545,0.03539,0.03533,0.03528,0.03522,0.03517,0.03511,0.03506,0.035,0.03495,0.03489,0.03484,0.03478,0.03473,0.03467,0.03462,0.03456,0.03451,0.03445,0.0344,0.03434,0.03429,0.03424,0.03418,0.03413,0.03407,0.03402,0.03397,0.03391,0.03386,0.03381,0.03375,0.0337,0.03365,0.03359,0.03354,0.03349,0.03343,0.03338,0.03333,0.03328,0.03322,0.03317,0.03312,0.03307,0.03301,0.03296,0.03291,0.03286,0.03281,0.03275,0.0327,0.03265,0.0326,0.03255,0.0325,0.03245,0.03239,0.03234,0.03229, +0.03224,0.03219,0.03214,0.03209,0.03204,0.03199,0.03194,0.03189,0.03184,0.03178,0.03173,0.03168,0.03163,0.03158,0.03153,0.03148,0.03143,0.03138,0.03134,0.03129,0.03124,0.03119,0.03114,0.03109,0.03104,0.03099,0.03094,0.03089,0.03084,0.03079,0.03075,0.0307,0.03065,0.0306,0.03055,0.0305,0.03045,0.03041,0.03036,0.03031,0.03026,0.03021,0.03017,0.03012,0.03007,0.03002,0.02997,0.02993,0.02988,0.02983,0.02979,0.02974,0.02969,0.02964,0.0296,0.02955,0.0295,0.02946,0.02941,0.02936,0.02932,0.02927,0.02922,0.02918,0.02913,0.02908,0.02904,0.02899,0.02895,0.0289,0.02885,0.02881,0.02876,0.02872,0.02867,0.02863,0.02858,0.02854,0.02849,0.02844,0.0284,0.02835,0.02831,0.02826,0.02822,0.02817,0.02813,0.02809,0.02804,0.028,0.02795,0.02791,0.02786,0.02782,0.02777,0.02773,0.02769,0.02764,0.0276,0.02755, +0.02751,0.02747,0.02742,0.02738,0.02734,0.02729,0.02725,0.02721,0.02716,0.02712,0.02708,0.02703,0.02699,0.02695,0.0269,0.02686,0.02682,0.02678,0.02673,0.02669,0.02665,0.02661,0.02656,0.02652,0.02648,0.02644,0.0264,0.02635,0.02631,0.02627,0.02623,0.02619,0.02614,0.0261,0.02606,0.02602,0.02598,0.02594,0.0259,0.02585,0.02581,0.02577,0.02573,0.02569,0.02565,0.02561,0.02557,0.02553,0.02549,0.02545,0.0254,0.02536,0.02532,0.02528,0.02524,0.0252,0.02516,0.02512,0.02508,0.02504,0.025,0.02496,0.02492,0.02488,0.02484,0.0248,0.02476,0.02472,0.02469,0.02465,0.02461,0.02457,0.02453,0.02449,0.02445,0.02441,0.02437,0.02433,0.02429,0.02426,0.02422,0.02418,0.02414,0.0241,0.02406,0.02402,0.02399,0.02395,0.02391,0.02387,0.02383,0.02379,0.02376,0.02372,0.02368,0.02364,0.02361,0.02357,0.02353,0.02349, +0.02345,0.02342,0.02338,0.02334,0.02331,0.02327,0.02323,0.02319,0.02316,0.02312,0.02308,0.02305,0.02301,0.02297,0.02294,0.0229,0.02286,0.02283,0.02279,0.02275,0.02272,0.02268,0.02264,0.02261,0.02257,0.02254,0.0225,0.02246,0.02243,0.02239,0.02236,0.02232,0.02228,0.02225,0.02221,0.02218,0.02214,0.02211,0.02207,0.02204,0.022,0.02197,0.02193,0.02189,0.02186,0.02182,0.02179,0.02175,0.02172,0.02169,0.02165,0.02162,0.02158,0.02155,0.02151,0.02148,0.02144,0.02141,0.02137,0.02134,0.02131,0.02127,0.02124,0.0212,0.02117,0.02114,0.0211,0.02107,0.02103,0.021,0.02097,0.02093,0.0209,0.02087,0.02083,0.0208,0.02077,0.02073,0.0207,0.02067,0.02063,0.0206,0.02057,0.02053,0.0205,0.02047,0.02044,0.0204,0.02037,0.02034,0.0203,0.02027,0.02024,0.02021,0.02017,0.02014,0.02011,0.02008,0.02005,0.02001, +0.01998,0.01995,0.01992,0.01988,0.01985,0.01982,0.01979,0.01976,0.01973,0.01969,0.01966,0.01963,0.0196,0.01957,0.01954,0.0195,0.01947,0.01944,0.01941,0.01938,0.01935,0.01932,0.01929,0.01926,0.01922,0.01919,0.01916,0.01913,0.0191,0.01907,0.01904,0.01901,0.01898,0.01895,0.01892,0.01889,0.01886,0.01883,0.0188,0.01877,0.01874,0.01871,0.01868,0.01865,0.01862,0.01859,0.01856,0.01853,0.0185,0.01847,0.01844,0.01841,0.01838,0.01835,0.01832,0.01829,0.01826,0.01823,0.0182,0.01817,0.01814,0.01811,0.01808,0.01805,0.01803,0.018,0.01797,0.01794,0.01791,0.01788,0.01785,0.01782,0.01779,0.01777,0.01774,0.01771,0.01768,0.01765,0.01762,0.01759,0.01757,0.01754,0.01751,0.01748,0.01745,0.01743,0.0174,0.01737,0.01734,0.01731,0.01729,0.01726,0.01723,0.0172,0.01717,0.01715,0.01712,0.01709,0.01706,0.01704, +0.01701,0.01698,0.01695,0.01693,0.0169,0.01687,0.01684,0.01682,0.01679,0.01676,0.01674,0.01671,0.01668,0.01666,0.01663,0.0166,0.01657,0.01655,0.01652,0.01649,0.01647,0.01644,0.01641,0.01639,0.01636,0.01634,0.01631,0.01628,0.01626,0.01623,0.0162,0.01618,0.01615,0.01613,0.0161,0.01607,0.01605,0.01602,0.016,0.01597,0.01594,0.01592,0.01589,0.01587,0.01584,0.01582,0.01579,0.01576,0.01574,0.01571,0.01569,0.01566,0.01564,0.01561,0.01559,0.01556,0.01554,0.01551,0.01549,0.01546,0.01544,0.01541,0.01539,0.01536,0.01534,0.01531,0.01529,0.01526,0.01524,0.01521,0.01519,0.01516,0.01514,0.01511,0.01509,0.01507,0.01504,0.01502,0.01499,0.01497,0.01494,0.01492,0.0149,0.01487,0.01485,0.01482,0.0148,0.01478,0.01475,0.01473,0.0147,0.01468,0.01466,0.01463,0.01461,0.01459,0.01456,0.01454,0.01451,0.01449, +0.01447,0.01444,0.01442,0.0144,0.01437,0.01435,0.01433,0.0143,0.01428,0.01426,0.01424,0.01421,0.01419,0.01417,0.01414,0.01412,0.0141,0.01407,0.01405,0.01403,0.01401,0.01398,0.01396,0.01394,0.01392,0.01389,0.01387,0.01385,0.01383,0.0138,0.01378,0.01376,0.01374,0.01371,0.01369,0.01367,0.01365,0.01362,0.0136,0.01358,0.01356,0.01354,0.01351,0.01349,0.01347,0.01345,0.01343,0.01341,0.01338,0.01336,0.01334,0.01332,0.0133,0.01328,0.01325,0.01323,0.01321,0.01319,0.01317,0.01315,0.01313,0.0131,0.01308,0.01306,0.01304,0.01302,0.013,0.01298,0.01296,0.01293,0.01291,0.01289,0.01287,0.01285,0.01283,0.01281,0.01279,0.01277,0.01275,0.01273,0.01271,0.01268,0.01266,0.01264,0.01262,0.0126,0.01258,0.01256,0.01254,0.01252,0.0125,0.01248,0.01246,0.01244,0.01242,0.0124,0.01238,0.01236,0.01234,0.01232, +0.0123,0.01228,0.01226,0.01224,0.01222,0.0122,0.01218,0.01216,0.01214,0.01212,0.0121,0.01208,0.01206,0.01204,0.01202,0.012,0.01198,0.01196,0.01194,0.01192,0.0119,0.01189,0.01187,0.01185,0.01183,0.01181,0.01179,0.01177,0.01175,0.01173,0.01171,0.01169,0.01167,0.01165,0.01164,0.01162,0.0116,0.01158,0.01156,0.01154,0.01152,0.0115,0.01149,0.01147,0.01145,0.01143,0.01141,0.01139,0.01137,0.01135,0.01134,0.01132,0.0113,0.01128,0.01126,0.01124,0.01123,0.01121,0.01119,0.01117,0.01115,0.01113,0.01112,0.0111,0.01108,0.01106,0.01104,0.01103,0.01101,0.01099,0.01097,0.01095,0.01094,0.01092,0.0109,0.01088,0.01087,0.01085,0.01083,0.01081,0.01079,0.01078,0.01076,0.01074,0.01072,0.01071,0.01069,0.01067,0.01065,0.01064,0.01062,0.0106,0.01059,0.01057,0.01055,0.01053,0.01052,0.0105,0.01048,0.01046, +0.01045,0.01043,0.01041,0.0104,0.01038,0.01036,0.01035,0.01033,0.01031,0.0103,0.01028,0.01026,0.01024,0.01023,0.01021,0.01019,0.01018,0.01016,0.01014,0.01013,0.01011,0.01009,0.01008,0.01006,0.01005,0.01003,0.01001,0.01,0.00998,0.00996,0.00995,0.00993,0.00991,0.0099,0.00988,0.00987,0.00985,0.00983,0.00982,0.0098,0.00979,0.00977,0.00975,0.00974,0.00972,0.00971,0.00969,0.00967,0.00966,0.00964,0.00963,0.00961,0.0096,0.00958,0.00956,0.00955,0.00953,0.00952,0.0095,0.00949,0.00947,0.00946,0.00944,0.00942,0.00941,0.00939,0.00938,0.00936,0.00935,0.00933,0.00932,0.0093,0.00929,0.00927,0.00926,0.00924,0.00923,0.00921,0.0092,0.00918,0.00917,0.00915,0.00914,0.00912,0.00911,0.00909,0.00908,0.00906,0.00905,0.00903,0.00902,0.009,0.00899,0.00897,0.00896,0.00894,0.00893,0.00891,0.0089,0.00888, +0.00887,0.00886,0.00884,0.00883,0.00881,0.0088,0.00878,0.00877,0.00875,0.00874,0.00873,0.00871,0.0087,0.00868,0.00867,0.00865,0.00864,0.00863,0.00861,0.0086,0.00858,0.00857,0.00856,0.00854,0.00853,0.00851,0.0085,0.00849,0.00847,0.00846,0.00844,0.00843,0.00842,0.0084,0.00839,0.00837,0.00836,0.00835,0.00833,0.00832,0.00831,0.00829,0.00828,0.00827,0.00825,0.00824,0.00822,0.00821,0.0082,0.00818,0.00817,0.00816,0.00814,0.00813,0.00812,0.0081,0.00809,0.00808,0.00806,0.00805,0.00804,0.00802,0.00801,0.008,0.00798,0.00797,0.00796,0.00795,0.00793,0.00792,0.00791,0.00789,0.00788,0.00787,0.00785,0.00784,0.00783,0.00782,0.0078,0.00779,0.00778,0.00776,0.00775,0.00774,0.00773,0.00771,0.0077,0.00769,0.00768,0.00766,0.00765,0.00764,0.00763,0.00761,0.0076,0.00759,0.00758,0.00756,0.00755,0.00754, +0.00753,0.00751,0.0075,0.00749,0.00748,0.00746,0.00745,0.00744,0.00743,0.00742,0.0074,0.00739,0.00738,0.00737,0.00735,0.00734,0.00733,0.00732,0.00731,0.00729,0.00728,0.00727,0.00726,0.00725,0.00723,0.00722,0.00721,0.0072,0.00719,0.00717,0.00716,0.00715,0.00714,0.00713,0.00712,0.0071,0.00709,0.00708,0.00707,0.00706,0.00705,0.00703,0.00702,0.00701,0.007,0.00699,0.00698,0.00697,0.00695,0.00694,0.00693,0.00692,0.00691,0.0069,0.00689,0.00687,0.00686,0.00685,0.00684,0.00683,0.00682,0.00681,0.00679,0.00678,0.00677,0.00676,0.00675,0.00674,0.00673,0.00672,0.00671,0.00669,0.00668,0.00667,0.00666,0.00665,0.00664,0.00663,0.00662,0.00661,0.0066,0.00659,0.00657,0.00656,0.00655,0.00654,0.00653,0.00652,0.00651,0.0065,0.00649,0.00648,0.00647,0.00646,0.00645,0.00643,0.00642,0.00641,0.0064,0.00639, +0.00638,0.00637,0.00636,0.00635,0.00634,0.00633,0.00632,0.00631,0.0063,0.00629,0.00628,0.00627,0.00626,0.00625,0.00624,0.00623,0.00622,0.00621,0.00619,0.00618,0.00617,0.00616,0.00615,0.00614,0.00613,0.00612,0.00611,0.0061,0.00609,0.00608,0.00607,0.00606,0.00605,0.00604,0.00603,0.00602,0.00601,0.006,0.00599,0.00598,0.00597,0.00596,0.00595,0.00594,0.00593,0.00592,0.00591,0.0059,0.0059,0.00589,0.00588,0.00587,0.00586,0.00585,0.00584,0.00583,0.00582,0.00581,0.0058,0.00579,0.00578,0.00577,0.00576,0.00575,0.00574,0.00573,0.00572,0.00571,0.0057,0.00569,0.00568,0.00568,0.00567,0.00566,0.00565,0.00564,0.00563,0.00562,0.00561,0.0056,0.00559,0.00558,0.00557,0.00556,0.00555,0.00555,0.00554,0.00553,0.00552,0.00551,0.0055,0.00549,0.00548,0.00547,0.00546,0.00545,0.00544,0.00544,0.00543,0.00542, +0.00541,0.0054,0.00539,0.00538,0.00537,0.00536,0.00536,0.00535,0.00534,0.00533,0.00532,0.00531,0.0053,0.00529,0.00528,0.00528,0.00527,0.00526,0.00525,0.00524,0.00523,0.00522,0.00522,0.00521,0.0052,0.00519,0.00518,0.00517,0.00516,0.00516,0.00515,0.00514,0.00513,0.00512,0.00511,0.0051,0.0051,0.00509,0.00508,0.00507,0.00506,0.00505,0.00505,0.00504,0.00503,0.00502,0.00501,0.005,0.005,0.00499,0.00498,0.00497,0.00496,0.00495,0.00495,0.00494,0.00493,0.00492,0.00491,0.0049,0.0049,0.00489,0.00488,0.00487,0.00486,0.00486,0.00485,0.00484,0.00483,0.00482,0.00482,0.00481,0.0048,0.00479,0.00478,0.00478,0.00477,0.00476,0.00475,0.00474,0.00474,0.00473,0.00472,0.00471,0.00471,0.0047,0.00469,0.00468,0.00467,0.00467,0.00466,0.00465,0.00464,0.00464,0.00463,0.00462,0.00461,0.0046,0.0046,0.00459}; + +constexpr double stored_lower_incomplete_gamma_values_n5[] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1e-05,1e-05,1e-05,1e-05,1e-05,1e-05,2e-05,2e-05,2e-05,3e-05,3e-05,3e-05,4e-05,4e-05,5e-05,5e-05,6e-05,6e-05,7e-05,8e-05,8e-05,9e-05,0.0001,0.00011,0.00012,0.00012,0.00013,0.00014,0.00016,0.00017,0.00018,0.00019,0.0002,0.00022,0.00023,0.00024,0.00026,0.00027,0.00029,0.00031,0.00032,0.00034,0.00036,0.00038,0.0004,0.00042,0.00044,0.00046,0.00049,0.00051,0.00053,0.00056,0.00058,0.00061,0.00064,0.00066,0.00069,0.00072,0.00075,0.00078,0.00081,0.00084,0.00088,0.00091,0.00095,0.00098,0.00102,0.00105,0.00109,0.00113,0.00117,0.00121,0.00125,0.0013,0.00134,0.00138,0.00143,0.00147,0.00152,0.00157,0.00162,0.00167,0.00172,0.00177,0.00182,0.00188, +0.00193,0.00199,0.00204,0.0021,0.00216,0.00222,0.00228,0.00234,0.00241,0.00247,0.00254,0.0026,0.00267,0.00274,0.00281,0.00288,0.00295,0.00302,0.00309,0.00317,0.00325,0.00332,0.0034,0.00348,0.00356,0.00364,0.00373,0.00381,0.0039,0.00398,0.00407,0.00416,0.00425,0.00434,0.00443,0.00453,0.00462,0.00472,0.00481,0.00491,0.00501,0.00511,0.00522,0.00532,0.00542,0.00553,0.00564,0.00575,0.00586,0.00597,0.00608,0.00619,0.00631,0.00643,0.00654,0.00666,0.00678,0.0069,0.00703,0.00715,0.00728,0.0074,0.00753,0.00766,0.00779,0.00793,0.00806,0.00819,0.00833,0.00847,0.00861,0.00875,0.00889,0.00903,0.00918,0.00932,0.00947,0.00962,0.00977,0.00992,0.01008,0.01023,0.01039,0.01055,0.0107,0.01086,0.01103,0.01119,0.01135,0.01152,0.01169,0.01186,0.01203,0.0122,0.01237,0.01255,0.01272,0.0129,0.01308,0.01326, +0.01345,0.01363,0.01381,0.014,0.01419,0.01438,0.01457,0.01476,0.01496,0.01515,0.01535,0.01555,0.01575,0.01595,0.01616,0.01636,0.01657,0.01677,0.01698,0.0172,0.01741,0.01762,0.01784,0.01805,0.01827,0.01849,0.01872,0.01894,0.01916,0.01939,0.01962,0.01985,0.02008,0.02031,0.02055,0.02078,0.02102,0.02126,0.0215,0.02174,0.02198,0.02223,0.02248,0.02273,0.02298,0.02323,0.02348,0.02373,0.02399,0.02425,0.02451,0.02477,0.02503,0.0253,0.02556,0.02583,0.0261,0.02637,0.02664,0.02692,0.02719,0.02747,0.02775,0.02803,0.02831,0.02859,0.02888,0.02917,0.02945,0.02974,0.03004,0.03033,0.03062,0.03092,0.03122,0.03152,0.03182,0.03212,0.03243,0.03273,0.03304,0.03335,0.03366,0.03397,0.03429,0.03461,0.03492,0.03524,0.03556,0.03589,0.03621,0.03654,0.03686,0.03719,0.03752,0.03785,0.03819,0.03852,0.03886,0.0392, +0.03954,0.03988,0.04023,0.04057,0.04092,0.04127,0.04162,0.04197,0.04232,0.04268,0.04303,0.04339,0.04375,0.04411,0.04448,0.04484,0.04521,0.04558,0.04595,0.04632,0.04669,0.04707,0.04744,0.04782,0.0482,0.04858,0.04896,0.04935,0.04973,0.05012,0.05051,0.0509,0.0513,0.05169,0.05209,0.05248,0.05288,0.05328,0.05369,0.05409,0.0545,0.0549,0.05531,0.05572,0.05613,0.05655,0.05696,0.05738,0.0578,0.05822,0.05864,0.05907,0.05949,0.05992,0.06035,0.06078,0.06121,0.06164,0.06208,0.06251,0.06295,0.06339,0.06383,0.06427,0.06472,0.06516,0.06561,0.06606,0.06651,0.06697,0.06742,0.06788,0.06833,0.06879,0.06925,0.06971,0.07018,0.07064,0.07111,0.07158,0.07205,0.07252,0.07299,0.07347,0.07395,0.07442,0.0749,0.07539,0.07587,0.07635,0.07684,0.07733,0.07782,0.07831,0.0788,0.07929,0.07979,0.08028,0.08078,0.08128, +0.08179,0.08229,0.08279,0.0833,0.08381,0.08432,0.08483,0.08534,0.08586,0.08637,0.08689,0.08741,0.08793,0.08845,0.08897,0.0895,0.09003,0.09055,0.09108,0.09162,0.09215,0.09268,0.09322,0.09376,0.09429,0.09484,0.09538,0.09592,0.09647,0.09701,0.09756,0.09811,0.09866,0.09921,0.09977,0.10032,0.10088,0.10144,0.102,0.10256,0.10312,0.10369,0.10426,0.10482,0.10539,0.10596,0.10654,0.10711,0.10768,0.10826,0.10884,0.10942,0.11,0.11058,0.11117,0.11175,0.11234,0.11293,0.11352,0.11411,0.1147,0.1153,0.11589,0.11649,0.11709,0.11769,0.11829,0.11889,0.1195,0.1201,0.12071,0.12132,0.12193,0.12254,0.12316,0.12377,0.12439,0.125,0.12562,0.12624,0.12687,0.12749,0.12811,0.12874,0.12937,0.13,0.13063,0.13126,0.13189,0.13253,0.13316,0.1338,0.13444,0.13508,0.13572,0.13636,0.13701,0.13765,0.1383,0.13895, +0.1396,0.14025,0.1409,0.14156,0.14221,0.14287,0.14353,0.14418,0.14485,0.14551,0.14617,0.14684,0.1475,0.14817,0.14884,0.14951,0.15018,0.15085,0.15153,0.1522,0.15288,0.15356,0.15424,0.15492,0.1556,0.15628,0.15697,0.15766,0.15834,0.15903,0.15972,0.16041,0.16111,0.1618,0.1625,0.16319,0.16389,0.16459,0.16529,0.16599,0.16669,0.1674,0.1681,0.16881,0.16952,0.17023,0.17094,0.17165,0.17237,0.17308,0.1738,0.17451,0.17523,0.17595,0.17667,0.17739,0.17812,0.17884,0.17957,0.18029,0.18102,0.18175,0.18248,0.18321,0.18395,0.18468,0.18542,0.18615,0.18689,0.18763,0.18837,0.18911,0.18986,0.1906,0.19135,0.19209,0.19284,0.19359,0.19434,0.19509,0.19584,0.1966,0.19735,0.19811,0.19886,0.19962,0.20038,0.20114,0.2019,0.20267,0.20343,0.2042,0.20496,0.20573,0.2065,0.20727,0.20804,0.20881,0.20958,0.21036, +0.21113,0.21191,0.21269,0.21347,0.21425,0.21503,0.21581,0.21659,0.21738,0.21816,0.21895,0.21974,0.22053,0.22132,0.22211,0.2229,0.22369,0.22449,0.22528,0.22608,0.22688,0.22767,0.22847,0.22928,0.23008,0.23088,0.23168,0.23249,0.23329,0.2341,0.23491,0.23572,0.23653,0.23734,0.23815,0.23897,0.23978,0.24059,0.24141,0.24223,0.24305,0.24387,0.24469,0.24551,0.24633,0.24715,0.24798,0.2488,0.24963,0.25046,0.25129,0.25212,0.25295,0.25378,0.25461,0.25544,0.25628,0.25711,0.25795,0.25879,0.25963,0.26046,0.2613,0.26215,0.26299,0.26383,0.26467,0.26552,0.26637,0.26721,0.26806,0.26891,0.26976,0.27061,0.27146,0.27231,0.27317,0.27402,0.27488,0.27573,0.27659,0.27745,0.2783,0.27916,0.28002,0.28089,0.28175,0.28261,0.28348,0.28434,0.28521,0.28607,0.28694,0.28781,0.28868,0.28955,0.29042,0.29129,0.29217,0.29304, +0.29391,0.29479,0.29567,0.29654,0.29742,0.2983,0.29918,0.30006,0.30094,0.30182,0.30271,0.30359,0.30448,0.30536,0.30625,0.30713,0.30802,0.30891,0.3098,0.31069,0.31158,0.31247,0.31337,0.31426,0.31515,0.31605,0.31695,0.31784,0.31874,0.31964,0.32054,0.32144,0.32234,0.32324,0.32414,0.32504,0.32595,0.32685,0.32776,0.32866,0.32957,0.33048,0.33138,0.33229,0.3332,0.33411,0.33502,0.33594,0.33685,0.33776,0.33867,0.33959,0.3405,0.34142,0.34234,0.34326,0.34417,0.34509,0.34601,0.34693,0.34785,0.34877,0.3497,0.35062,0.35154,0.35247,0.35339,0.35432,0.35525,0.35617,0.3571,0.35803,0.35896,0.35989,0.36082,0.36175,0.36268,0.36361,0.36455,0.36548,0.36641,0.36735,0.36828,0.36922,0.37016,0.37109,0.37203,0.37297,0.37391,0.37485,0.37579,0.37673,0.37767,0.37862,0.37956,0.3805,0.38145,0.38239,0.38334,0.38428, +0.38523,0.38618,0.38712,0.38807,0.38902,0.38997,0.39092,0.39187,0.39282,0.39377,0.39473,0.39568,0.39663,0.39759,0.39854,0.3995,0.40045,0.40141,0.40236,0.40332,0.40428,0.40524,0.4062,0.40716,0.40811,0.40908,0.41004,0.411,0.41196,0.41292,0.41388,0.41485,0.41581,0.41678,0.41774,0.41871,0.41967,0.42064,0.42161,0.42257,0.42354,0.42451,0.42548,0.42645,0.42742,0.42839,0.42936,0.43033,0.4313,0.43227,0.43325,0.43422,0.43519,0.43617,0.43714,0.43812,0.43909,0.44007,0.44104,0.44202,0.443,0.44398,0.44495,0.44593,0.44691,0.44789,0.44887,0.44985,0.45083,0.45181,0.45279,0.45377,0.45476,0.45574,0.45672,0.4577,0.45869,0.45967,0.46066,0.46164,0.46263,0.46361,0.4646,0.46559,0.46657,0.46756,0.46855,0.46953,0.47052,0.47151,0.4725,0.47349,0.47448,0.47547,0.47646,0.47745,0.47844,0.47943,0.48043,0.48142, +0.48241,0.4834,0.4844,0.48539,0.48638,0.48738,0.48837,0.48937,0.49036,0.49136,0.49235,0.49335,0.49435,0.49534,0.49634,0.49734,0.49834,0.49933,0.50033,0.50133,0.50233,0.50333,0.50433,0.50533,0.50633,0.50733,0.50833,0.50933,0.51033,0.51133,0.51233,0.51333,0.51434,0.51534,0.51634,0.51735,0.51835,0.51935,0.52036,0.52136,0.52236,0.52337,0.52437,0.52538,0.52638,0.52739,0.52839,0.5294,0.53041,0.53141,0.53242,0.53343,0.53443,0.53544,0.53645,0.53746,0.53846,0.53947,0.54048,0.54149,0.5425,0.54351,0.54452,0.54552,0.54653,0.54754,0.54855,0.54956,0.55057,0.55159,0.5526,0.55361,0.55462,0.55563,0.55664,0.55765,0.55866,0.55968,0.56069,0.5617,0.56271,0.56372,0.56474,0.56575,0.56676,0.56778,0.56879,0.5698,0.57082,0.57183,0.57284,0.57386,0.57487,0.57589,0.5769,0.57792,0.57893,0.57995,0.58096,0.58198, +0.58299,0.58401,0.58502,0.58604,0.58705,0.58807,0.58908,0.5901,0.59112,0.59213,0.59315,0.59417,0.59518,0.5962,0.59722,0.59823,0.59925,0.60027,0.60128,0.6023,0.60332,0.60434,0.60535,0.60637,0.60739,0.60841,0.60942,0.61044,0.61146,0.61248,0.61349,0.61451,0.61553,0.61655,0.61757,0.61859,0.6196,0.62062,0.62164,0.62266,0.62368,0.6247,0.62571,0.62673,0.62775,0.62877,0.62979,0.63081,0.63183,0.63284,0.63386,0.63488,0.6359,0.63692,0.63794,0.63896,0.63998,0.641,0.64201,0.64303,0.64405,0.64507,0.64609,0.64711,0.64813,0.64915,0.65017,0.65119,0.6522,0.65322,0.65424,0.65526,0.65628,0.6573,0.65832,0.65934,0.66035,0.66137,0.66239,0.66341,0.66443,0.66545,0.66647,0.66749,0.6685,0.66952,0.67054,0.67156,0.67258,0.6736,0.67461,0.67563,0.67665,0.67767,0.67869,0.67971,0.68072,0.68174,0.68276,0.68378, +0.68479,0.68581,0.68683,0.68785,0.68887,0.68988,0.6909,0.69192,0.69293,0.69395,0.69497,0.69599,0.697,0.69802,0.69904,0.70005,0.70107,0.70209,0.7031,0.70412,0.70513,0.70615,0.70717,0.70818,0.7092,0.71021,0.71123,0.71224,0.71326,0.71427,0.71529,0.7163,0.71732,0.71833,0.71935,0.72036,0.72138,0.72239,0.72341,0.72442,0.72543,0.72645,0.72746,0.72847,0.72949,0.7305,0.73151,0.73253,0.73354,0.73455,0.73557,0.73658,0.73759,0.7386,0.73961,0.74063,0.74164,0.74265,0.74366,0.74467,0.74568,0.74669,0.7477,0.74871,0.74972,0.75073,0.75174,0.75275,0.75376,0.75477,0.75578,0.75679,0.7578,0.75881,0.75982,0.76083,0.76183,0.76284,0.76385,0.76486,0.76587,0.76687,0.76788,0.76889,0.76989,0.7709,0.77191,0.77291,0.77392,0.77492,0.77593,0.77694,0.77794,0.77895,0.77995,0.78096,0.78196,0.78296,0.78397,0.78497, +0.78597,0.78698,0.78798,0.78898,0.78999,0.79099,0.79199,0.79299,0.79399,0.795,0.796,0.797,0.798,0.799,0.8,0.801,0.802,0.803,0.804,0.805,0.806,0.807,0.80799,0.80899,0.80999,0.81099,0.81198,0.81298,0.81398,0.81498,0.81597,0.81697,0.81796,0.81896,0.81996,0.82095,0.82195,0.82294,0.82393,0.82493,0.82592,0.82692,0.82791,0.8289,0.82989,0.83089,0.83188,0.83287,0.83386,0.83485,0.83584,0.83684,0.83783,0.83882,0.83981,0.8408,0.84179,0.84277,0.84376,0.84475,0.84574,0.84673,0.84772,0.8487,0.84969,0.85068,0.85166,0.85265,0.85364,0.85462,0.85561,0.85659,0.85758,0.85856,0.85954,0.86053,0.86151,0.86249,0.86348,0.86446,0.86544,0.86642,0.8674,0.86839,0.86937,0.87035,0.87133,0.87231,0.87329,0.87427,0.87525,0.87622,0.8772,0.87818,0.87916,0.88014,0.88111,0.88209,0.88307,0.88404, +0.88502,0.88599,0.88697,0.88794,0.88892,0.88989,0.89086,0.89184,0.89281,0.89378,0.89476,0.89573,0.8967,0.89767,0.89864,0.89961,0.90058,0.90155,0.90252,0.90349,0.90446,0.90543,0.9064,0.90736,0.90833,0.9093,0.91026,0.91123,0.9122,0.91316,0.91413,0.91509,0.91606,0.91702,0.91798,0.91895,0.91991,0.92087,0.92184,0.9228,0.92376,0.92472,0.92568,0.92664,0.9276,0.92856,0.92952,0.93048,0.93144,0.9324,0.93335,0.93431,0.93527,0.93622,0.93718,0.93814,0.93909,0.94005,0.941,0.94196,0.94291,0.94386,0.94482,0.94577,0.94672,0.94767,0.94862,0.94957,0.95053,0.95148,0.95243,0.95338,0.95432,0.95527,0.95622,0.95717,0.95812,0.95906,0.96001,0.96096,0.9619,0.96285,0.96379,0.96474,0.96568,0.96662,0.96757,0.96851,0.96945,0.9704,0.97134,0.97228,0.97322,0.97416,0.9751,0.97604,0.97698,0.97792,0.97886,0.97979, +0.98073,0.98167,0.9826,0.98354,0.98448,0.98541,0.98635,0.98728,0.98822,0.98915,0.99008,0.99102,0.99195,0.99288,0.99381,0.99474,0.99567,0.9966,0.99753,0.99846,0.99939,1.00032,1.00125,1.00217,1.0031,1.00403,1.00495,1.00588,1.0068,1.00773,1.00865,1.00958,1.0105,1.01142,1.01235,1.01327,1.01419,1.01511,1.01603,1.01695,1.01787,1.01879,1.01971,1.02063,1.02155,1.02247,1.02338,1.0243,1.02522,1.02613,1.02705,1.02796,1.02888,1.02979,1.0307,1.03162,1.03253,1.03344,1.03435,1.03526,1.03618,1.03709,1.038,1.0389,1.03981,1.04072,1.04163,1.04254,1.04344,1.04435,1.04526,1.04616,1.04707,1.04797,1.04888,1.04978,1.05068,1.05158,1.05249,1.05339,1.05429,1.05519,1.05609,1.05699,1.05789,1.05879,1.05969,1.06059,1.06148,1.06238,1.06328,1.06417,1.06507,1.06596,1.06686,1.06775,1.06864,1.06954,1.07043,1.07132, +1.07221,1.0731,1.074,1.07489,1.07578,1.07666,1.07755,1.07844,1.07933,1.08022,1.0811,1.08199,1.08287,1.08376,1.08464,1.08553,1.08641,1.0873,1.08818,1.08906,1.08994,1.09082,1.0917,1.09258,1.09346,1.09434,1.09522,1.0961,1.09698,1.09785,1.09873,1.09961,1.10048,1.10136,1.10223,1.10311,1.10398,1.10485,1.10573,1.1066,1.10747,1.10834,1.10921,1.11008,1.11095,1.11182,1.11269,1.11356,1.11442,1.11529,1.11616,1.11702,1.11789,1.11875,1.11962,1.12048,1.12135,1.12221,1.12307,1.12393,1.1248,1.12566,1.12652,1.12738,1.12824,1.12909,1.12995,1.13081,1.13167,1.13252,1.13338,1.13424,1.13509,1.13595,1.1368,1.13765,1.13851,1.13936,1.14021,1.14106,1.14191,1.14276,1.14361,1.14446,1.14531,1.14616,1.14701,1.14786,1.1487,1.14955,1.15039,1.15124,1.15208,1.15293,1.15377,1.15461,1.15546,1.1563,1.15714,1.15798, +1.15882,1.15966,1.1605,1.16134,1.16218,1.16302,1.16385,1.16469,1.16553,1.16636,1.1672,1.16803,1.16887,1.1697,1.17053,1.17136,1.1722,1.17303,1.17386,1.17469,1.17552,1.17635,1.17718,1.178,1.17883,1.17966,1.18049,1.18131,1.18214,1.18296,1.18379,1.18461,1.18543,1.18626,1.18708,1.1879,1.18872,1.18954,1.19036,1.19118,1.192,1.19282,1.19364,1.19445,1.19527,1.19609,1.1969,1.19772,1.19853,1.19935,1.20016,1.20097,1.20178,1.2026,1.20341,1.20422,1.20503,1.20584,1.20665,1.20746,1.20826,1.20907,1.20988,1.21068,1.21149,1.2123,1.2131,1.2139,1.21471,1.21551,1.21631,1.21712,1.21792,1.21872,1.21952,1.22032,1.22112,1.22192,1.22271,1.22351,1.22431,1.22511,1.2259,1.2267,1.22749,1.22829,1.22908,1.22987,1.23067,1.23146,1.23225,1.23304,1.23383,1.23462,1.23541,1.2362,1.23699,1.23777,1.23856,1.23935, +1.24013,1.24092,1.2417,1.24249,1.24327,1.24406,1.24484,1.24562,1.2464,1.24718,1.24796,1.24874,1.24952,1.2503,1.25108,1.25186,1.25263,1.25341,1.25419,1.25496,1.25574,1.25651,1.25729,1.25806,1.25883,1.2596,1.26037,1.26115,1.26192,1.26269,1.26346,1.26422,1.26499,1.26576,1.26653,1.26729,1.26806,1.26882,1.26959,1.27035,1.27112,1.27188,1.27264,1.27341,1.27417,1.27493,1.27569,1.27645,1.27721,1.27797,1.27872,1.27948,1.28024,1.28099,1.28175,1.28251,1.28326,1.28401,1.28477,1.28552,1.28627,1.28703,1.28778,1.28853,1.28928,1.29003,1.29078,1.29153,1.29227,1.29302,1.29377,1.29451,1.29526,1.29601,1.29675,1.29749,1.29824,1.29898,1.29972,1.30046,1.30121,1.30195,1.30269,1.30343,1.30417,1.3049,1.30564,1.30638,1.30712,1.30785,1.30859,1.30932,1.31006,1.31079,1.31152,1.31226,1.31299,1.31372,1.31445,1.31518, +1.31591,1.31664,1.31737,1.3181,1.31883,1.31955,1.32028,1.32101,1.32173,1.32246,1.32318,1.32391,1.32463,1.32535,1.32607,1.3268,1.32752,1.32824,1.32896,1.32968,1.3304,1.33111,1.33183,1.33255,1.33326,1.33398,1.3347,1.33541,1.33612,1.33684,1.33755,1.33826,1.33898,1.33969,1.3404,1.34111,1.34182,1.34253,1.34324,1.34394,1.34465,1.34536,1.34607,1.34677,1.34748,1.34818,1.34889,1.34959,1.35029,1.35099,1.3517,1.3524,1.3531,1.3538,1.3545,1.3552,1.3559,1.35659,1.35729,1.35799,1.35868,1.35938,1.36007,1.36077,1.36146,1.36216,1.36285,1.36354,1.36423,1.36493,1.36562,1.36631,1.367,1.36768,1.36837,1.36906,1.36975,1.37043,1.37112,1.37181,1.37249,1.37318,1.37386,1.37454,1.37523,1.37591,1.37659,1.37727,1.37795,1.37863,1.37931,1.37999,1.38067,1.38135,1.38202,1.3827,1.38338,1.38405,1.38473,1.3854, +1.38607,1.38675,1.38742,1.38809,1.38876,1.38944,1.39011,1.39078,1.39145,1.39211,1.39278,1.39345,1.39412,1.39478,1.39545,1.39612,1.39678,1.39744,1.39811,1.39877,1.39943,1.4001,1.40076,1.40142,1.40208,1.40274,1.4034,1.40406,1.40472,1.40537,1.40603,1.40669,1.40734,1.408,1.40865,1.40931,1.40996,1.41061,1.41127,1.41192,1.41257,1.41322,1.41387,1.41452,1.41517,1.41582,1.41647,1.41712,1.41776,1.41841,1.41906,1.4197,1.42035,1.42099,1.42164,1.42228,1.42292,1.42356,1.4242,1.42485,1.42549,1.42613,1.42677,1.4274,1.42804,1.42868,1.42932,1.42995,1.43059,1.43123,1.43186,1.4325,1.43313,1.43376,1.4344,1.43503,1.43566,1.43629,1.43692,1.43755,1.43818,1.43881,1.43944,1.44007,1.44069,1.44132,1.44195,1.44257,1.4432,1.44382,1.44445,1.44507,1.44569,1.44631,1.44694,1.44756,1.44818,1.4488,1.44942,1.45004, +1.45066,1.45127,1.45189,1.45251,1.45312,1.45374,1.45436,1.45497,1.45558,1.4562,1.45681,1.45742,1.45804,1.45865,1.45926,1.45987,1.46048,1.46109,1.4617,1.4623,1.46291,1.46352,1.46413,1.46473,1.46534,1.46594,1.46655,1.46715,1.46775,1.46836,1.46896,1.46956,1.47016,1.47076,1.47136,1.47196,1.47256,1.47316,1.47376,1.47436,1.47495,1.47555,1.47614,1.47674,1.47733,1.47793,1.47852,1.47912,1.47971,1.4803,1.48089,1.48148,1.48207,1.48266,1.48325,1.48384,1.48443,1.48502,1.4856,1.48619,1.48678,1.48736,1.48795,1.48853,1.48912,1.4897,1.49028,1.49087,1.49145,1.49203,1.49261,1.49319,1.49377,1.49435,1.49493,1.49551,1.49608,1.49666,1.49724,1.49781,1.49839,1.49896,1.49954,1.50011,1.50069,1.50126,1.50183,1.5024,1.50297,1.50354,1.50411,1.50468,1.50525,1.50582,1.50639,1.50696,1.50753,1.50809,1.50866,1.50922, +1.50979,1.51035,1.51092,1.51148,1.51204,1.5126,1.51317,1.51373,1.51429,1.51485,1.51541,1.51597,1.51653,1.51708,1.51764,1.5182,1.51876,1.51931,1.51987,1.52042,1.52098,1.52153,1.52208,1.52264,1.52319,1.52374,1.52429,1.52484,1.52539,1.52594,1.52649,1.52704,1.52759,1.52814,1.52869,1.52923,1.52978,1.53032,1.53087,1.53141,1.53196,1.5325,1.53305,1.53359,1.53413,1.53467,1.53521,1.53575,1.53629,1.53683,1.53737,1.53791,1.53845,1.53899,1.53952,1.54006,1.54059,1.54113,1.54167,1.5422,1.54273,1.54327,1.5438,1.54433,1.54486,1.5454,1.54593,1.54646,1.54699,1.54752,1.54804,1.54857,1.5491,1.54963,1.55015,1.55068,1.55121,1.55173,1.55226,1.55278,1.5533,1.55383,1.55435,1.55487,1.55539,1.55592,1.55644,1.55696,1.55748,1.558,1.55851,1.55903,1.55955,1.56007,1.56058,1.5611,1.56162,1.56213,1.56265,1.56316, +1.56367,1.56419,1.5647,1.56521,1.56572,1.56623,1.56674,1.56726,1.56776,1.56827,1.56878,1.56929,1.5698,1.57031,1.57081,1.57132,1.57182,1.57233,1.57283,1.57334,1.57384,1.57435,1.57485,1.57535,1.57585,1.57635,1.57685,1.57735,1.57785,1.57835,1.57885,1.57935,1.57985,1.58035,1.58084,1.58134,1.58184,1.58233,1.58283,1.58332,1.58381,1.58431,1.5848,1.58529,1.58578,1.58628,1.58677,1.58726,1.58775,1.58824,1.58873,1.58921,1.5897,1.59019,1.59068,1.59116,1.59165,1.59214,1.59262,1.59311,1.59359,1.59407,1.59456,1.59504,1.59552,1.596,1.59648,1.59697,1.59745,1.59793,1.59841,1.59888,1.59936,1.59984,1.60032,1.60079,1.60127,1.60175,1.60222,1.6027,1.60317,1.60365,1.60412,1.60459,1.60507,1.60554,1.60601,1.60648,1.60695,1.60742,1.60789,1.60836,1.60883,1.6093,1.60977,1.61023,1.6107,1.61117,1.61163,1.6121, +1.61256,1.61303,1.61349,1.61396,1.61442,1.61488,1.61535,1.61581,1.61627,1.61673,1.61719,1.61765,1.61811,1.61857,1.61903,1.61949,1.61994,1.6204,1.62086,1.62131,1.62177,1.62222,1.62268,1.62313,1.62359,1.62404,1.62449,1.62495,1.6254,1.62585,1.6263,1.62675,1.6272,1.62765,1.6281,1.62855,1.629,1.62945,1.62989,1.63034,1.63079,1.63123,1.63168,1.63212,1.63257,1.63301,1.63346,1.6339,1.63434,1.63478,1.63523,1.63567,1.63611,1.63655,1.63699,1.63743,1.63787,1.63831,1.63875,1.63918,1.63962,1.64006,1.64049,1.64093,1.64137,1.6418,1.64224,1.64267,1.6431,1.64354,1.64397,1.6444,1.64484,1.64527,1.6457,1.64613,1.64656,1.64699,1.64742,1.64785,1.64828,1.6487,1.64913,1.64956,1.64998,1.65041,1.65084,1.65126,1.65169,1.65211,1.65253,1.65296,1.65338,1.6538,1.65423,1.65465,1.65507,1.65549,1.65591,1.65633, +1.65675,1.65717,1.65759,1.65801,1.65842,1.65884,1.65926,1.65967,1.66009,1.66051,1.66092,1.66134,1.66175,1.66216,1.66258,1.66299,1.6634,1.66382,1.66423,1.66464,1.66505,1.66546,1.66587,1.66628,1.66669,1.6671,1.66751,1.66791,1.66832,1.66873,1.66913,1.66954,1.66995,1.67035,1.67076,1.67116,1.67156,1.67197,1.67237,1.67277,1.67318,1.67358,1.67398,1.67438,1.67478,1.67518,1.67558,1.67598,1.67638,1.67678,1.67717,1.67757,1.67797,1.67837,1.67876,1.67916,1.67955,1.67995,1.68034,1.68074,1.68113,1.68152,1.68192,1.68231,1.6827,1.68309,1.68348,1.68387,1.68426,1.68465,1.68504,1.68543,1.68582,1.68621,1.6866,1.68699,1.68737,1.68776,1.68815,1.68853,1.68892,1.6893,1.68969,1.69007,1.69045,1.69084,1.69122,1.6916,1.69198,1.69237,1.69275,1.69313,1.69351,1.69389,1.69427,1.69465,1.69503,1.69541,1.69578,1.69616, +1.69654,1.69691,1.69729,1.69767,1.69804,1.69842,1.69879,1.69917,1.69954,1.69991,1.70029,1.70066,1.70103,1.7014,1.70178,1.70215,1.70252,1.70289,1.70326,1.70363,1.704,1.70436,1.70473,1.7051,1.70547,1.70583,1.7062,1.70657,1.70693,1.7073,1.70766,1.70803,1.70839,1.70876,1.70912,1.70948,1.70985,1.71021,1.71057,1.71093,1.71129,1.71165,1.71201,1.71237,1.71273,1.71309,1.71345,1.71381,1.71417,1.71452,1.71488,1.71524,1.71559,1.71595,1.71631,1.71666,1.71702,1.71737,1.71772,1.71808,1.71843,1.71878,1.71914,1.71949,1.71984,1.72019,1.72054,1.72089,1.72124,1.72159,1.72194,1.72229,1.72264,1.72299,1.72334,1.72368,1.72403,1.72438,1.72472,1.72507,1.72542,1.72576,1.72611,1.72645,1.72679,1.72714,1.72748,1.72782,1.72817,1.72851,1.72885,1.72919,1.72953,1.72987,1.73021,1.73055,1.73089,1.73123,1.73157,1.73191, +1.73225,1.73258,1.73292,1.73326,1.73359,1.73393,1.73427,1.7346,1.73494,1.73527,1.7356,1.73594,1.73627,1.73661,1.73694,1.73727,1.7376,1.73793,1.73826,1.7386,1.73893,1.73926,1.73959,1.73992,1.74024,1.74057,1.7409,1.74123,1.74156,1.74188,1.74221,1.74254,1.74286,1.74319,1.74351,1.74384,1.74416,1.74449,1.74481,1.74514,1.74546,1.74578,1.7461,1.74643,1.74675,1.74707,1.74739,1.74771,1.74803,1.74835,1.74867,1.74899,1.74931,1.74963,1.74994,1.75026,1.75058,1.7509,1.75121,1.75153,1.75185,1.75216,1.75248,1.75279,1.75311,1.75342,1.75373,1.75405,1.75436,1.75467,1.75499,1.7553,1.75561,1.75592,1.75623,1.75654,1.75685,1.75716,1.75747,1.75778,1.75809,1.7584,1.75871,1.75901,1.75932,1.75963,1.75994,1.76024,1.76055,1.76085,1.76116,1.76146,1.76177,1.76207,1.76238,1.76268,1.76298,1.76329,1.76359,1.76389, +1.76419,1.7645,1.7648,1.7651,1.7654,1.7657,1.766,1.7663,1.7666,1.7669,1.76719,1.76749,1.76779,1.76809,1.76838,1.76868,1.76898,1.76927,1.76957,1.76987,1.77016,1.77046,1.77075,1.77104,1.77134,1.77163,1.77192,1.77222,1.77251,1.7728,1.77309,1.77338,1.77368,1.77397,1.77426,1.77455,1.77484,1.77513,1.77541,1.7757,1.77599,1.77628,1.77657,1.77685,1.77714,1.77743,1.77771,1.778,1.77829,1.77857,1.77886,1.77914,1.77943,1.77971,1.77999,1.78028,1.78056,1.78084,1.78113,1.78141,1.78169,1.78197,1.78225,1.78253,1.78281,1.78309,1.78337,1.78365,1.78393,1.78421,1.78449,1.78477,1.78505,1.78532,1.7856,1.78588,1.78615,1.78643,1.78671,1.78698,1.78726,1.78753,1.78781,1.78808,1.78836,1.78863,1.7889,1.78918,1.78945,1.78972,1.78999,1.79027,1.79054,1.79081,1.79108,1.79135,1.79162,1.79189,1.79216,1.79243, +1.7927,1.79297,1.79323,1.7935,1.79377,1.79404,1.7943,1.79457,1.79484,1.7951,1.79537,1.79564,1.7959,1.79617,1.79643,1.79669,1.79696,1.79722,1.79749,1.79775,1.79801,1.79827,1.79854,1.7988,1.79906,1.79932,1.79958,1.79984,1.8001,1.80036,1.80062,1.80088,1.80114,1.8014,1.80166,1.80192,1.80217,1.80243,1.80269,1.80295,1.8032,1.80346,1.80371,1.80397,1.80423,1.80448,1.80474,1.80499,1.80524,1.8055,1.80575,1.80601,1.80626,1.80651,1.80676,1.80702,1.80727,1.80752,1.80777,1.80802,1.80827,1.80852,1.80877,1.80902,1.80927,1.80952,1.80977,1.81002,1.81027,1.81052,1.81076,1.81101,1.81126,1.8115,1.81175,1.812,1.81224,1.81249,1.81273,1.81298,1.81322,1.81347,1.81371,1.81396,1.8142,1.81444,1.81469,1.81493,1.81517,1.81541,1.81566,1.8159,1.81614,1.81638,1.81662,1.81686,1.8171,1.81734,1.81758,1.81782, +1.81806,1.8183,1.81854,1.81877,1.81901,1.81925,1.81949,1.81972,1.81996,1.8202,1.82043,1.82067,1.82091,1.82114,1.82138,1.82161,1.82185,1.82208,1.82231,1.82255,1.82278,1.82301,1.82325,1.82348,1.82371,1.82394,1.82418,1.82441,1.82464,1.82487,1.8251,1.82533,1.82556,1.82579,1.82602,1.82625,1.82648,1.82671,1.82693,1.82716,1.82739,1.82762,1.82785,1.82807,1.8283,1.82853,1.82875,1.82898,1.8292,1.82943,1.82965,1.82988,1.8301,1.83033,1.83055,1.83078,1.831,1.83122,1.83145,1.83167,1.83189,1.83211,1.83233,1.83256,1.83278,1.833,1.83322,1.83344,1.83366,1.83388,1.8341,1.83432,1.83454,1.83476,1.83498,1.83519,1.83541,1.83563,1.83585,1.83607,1.83628,1.8365,1.83672,1.83693,1.83715,1.83736,1.83758,1.8378,1.83801,1.83823,1.83844,1.83865,1.83887,1.83908,1.8393,1.83951,1.83972,1.83993,1.84015,1.84036, +1.84057,1.84078,1.84099,1.8412,1.84142,1.84163,1.84184,1.84205,1.84226,1.84247,1.84268,1.84288,1.84309,1.8433,1.84351,1.84372,1.84393,1.84413,1.84434,1.84455,1.84476,1.84496,1.84517,1.84537,1.84558,1.84579,1.84599,1.8462,1.8464,1.84661,1.84681,1.84701,1.84722,1.84742,1.84762,1.84783,1.84803,1.84823,1.84844,1.84864,1.84884,1.84904,1.84924,1.84944,1.84964,1.84984,1.85005,1.85025,1.85045,1.85064,1.85084,1.85104,1.85124,1.85144,1.85164,1.85184,1.85204,1.85223,1.85243,1.85263,1.85282,1.85302,1.85322,1.85341,1.85361,1.85381,1.854,1.8542,1.85439,1.85459,1.85478,1.85497,1.85517,1.85536,1.85556,1.85575,1.85594,1.85614,1.85633,1.85652,1.85671,1.8569,1.8571,1.85729,1.85748,1.85767,1.85786,1.85805,1.85824,1.85843,1.85862,1.85881,1.859,1.85919,1.85938,1.85957,1.85975,1.85994,1.86013,1.86032, +1.86051,1.86069,1.86088,1.86107,1.86125,1.86144,1.86163,1.86181,1.862,1.86218,1.86237,1.86255,1.86274,1.86292,1.86311,1.86329,1.86347,1.86366,1.86384,1.86402,1.86421,1.86439,1.86457,1.86475,1.86494,1.86512,1.8653,1.86548,1.86566,1.86584,1.86602,1.8662,1.86638,1.86656,1.86674,1.86692,1.8671,1.86728,1.86746,1.86764,1.86782,1.868,1.86817,1.86835,1.86853,1.86871,1.86888,1.86906,1.86924,1.86941,1.86959,1.86976,1.86994,1.87012,1.87029,1.87047,1.87064,1.87082,1.87099,1.87116,1.87134,1.87151,1.87169,1.87186,1.87203,1.87221,1.87238,1.87255,1.87272,1.87289,1.87307,1.87324,1.87341,1.87358,1.87375,1.87392,1.87409,1.87426,1.87443,1.8746,1.87477,1.87494,1.87511,1.87528,1.87545,1.87562,1.87579,1.87595,1.87612,1.87629,1.87646,1.87663,1.87679,1.87696,1.87713,1.87729,1.87746,1.87763,1.87779,1.87796, +1.87812,1.87829,1.87845,1.87862,1.87878,1.87895,1.87911,1.87928,1.87944,1.8796,1.87977,1.87993,1.88009,1.88025,1.88042,1.88058,1.88074,1.8809,1.88107,1.88123,1.88139,1.88155,1.88171,1.88187,1.88203,1.88219,1.88235,1.88251,1.88267,1.88283,1.88299,1.88315,1.88331,1.88347,1.88363,1.88378,1.88394,1.8841,1.88426,1.88442,1.88457,1.88473,1.88489,1.88504,1.8852,1.88536,1.88551,1.88567,1.88583,1.88598,1.88614,1.88629,1.88645,1.8866,1.88676,1.88691,1.88706,1.88722,1.88737,1.88753,1.88768,1.88783,1.88799,1.88814,1.88829,1.88844,1.8886,1.88875,1.8889,1.88905,1.8892,1.88935,1.8895,1.88966,1.88981,1.88996,1.89011,1.89026,1.89041,1.89056,1.89071,1.89086,1.89101,1.89115,1.8913,1.89145,1.8916,1.89175,1.8919,1.89204,1.89219,1.89234,1.89249,1.89263,1.89278,1.89293,1.89307,1.89322,1.89337,1.89351, +1.89366,1.8938,1.89395,1.89409,1.89424,1.89438,1.89453,1.89467,1.89482,1.89496,1.89511,1.89525,1.89539,1.89554,1.89568,1.89582,1.89597,1.89611,1.89625,1.89639,1.89654,1.89668,1.89682,1.89696,1.8971,1.89724,1.89738,1.89752,1.89767,1.89781,1.89795,1.89809,1.89823,1.89837,1.89851,1.89865,1.89878,1.89892,1.89906,1.8992,1.89934,1.89948,1.89962,1.89975,1.89989,1.90003,1.90017,1.9003,1.90044,1.90058,1.90071,1.90085,1.90099,1.90112,1.90126,1.9014,1.90153,1.90167,1.9018,1.90194,1.90207,1.90221,1.90234,1.90248,1.90261,1.90275,1.90288,1.90301,1.90315,1.90328,1.90341,1.90355,1.90368,1.90381,1.90394,1.90408,1.90421,1.90434,1.90447,1.9046,1.90474,1.90487,1.905,1.90513,1.90526,1.90539,1.90552,1.90565,1.90578,1.90591,1.90604,1.90617,1.9063,1.90643,1.90656,1.90669,1.90682,1.90695,1.90708,1.9072, +1.90733,1.90746,1.90759,1.90772,1.90784,1.90797,1.9081,1.90823,1.90835,1.90848,1.90861,1.90873,1.90886,1.90898,1.90911,1.90924,1.90936,1.90949,1.90961,1.90974,1.90986,1.90999,1.91011,1.91024,1.91036,1.91048,1.91061,1.91073,1.91086,1.91098,1.9111,1.91123,1.91135,1.91147,1.91159,1.91172,1.91184,1.91196,1.91208,1.91221,1.91233,1.91245,1.91257,1.91269,1.91281,1.91293,1.91305,1.91317,1.9133,1.91342,1.91354,1.91366,1.91378,1.9139,1.91401,1.91413,1.91425,1.91437,1.91449,1.91461,1.91473,1.91485,1.91497,1.91508,1.9152,1.91532,1.91544,1.91555,1.91567,1.91579,1.91591,1.91602,1.91614,1.91626,1.91637,1.91649,1.91661,1.91672,1.91684,1.91695,1.91707,1.91718,1.9173,1.91741,1.91753,1.91764,1.91776,1.91787,1.91799,1.9181,1.91822,1.91833,1.91844,1.91856,1.91867,1.91878,1.9189,1.91901,1.91912,1.91923, +1.91935,1.91946,1.91957,1.91968,1.9198,1.91991,1.92002,1.92013,1.92024,1.92035,1.92046,1.92058,1.92069,1.9208,1.92091,1.92102,1.92113,1.92124,1.92135,1.92146,1.92157,1.92168,1.92179,1.9219,1.922,1.92211,1.92222,1.92233,1.92244,1.92255,1.92266,1.92276,1.92287,1.92298,1.92309,1.9232,1.9233,1.92341,1.92352,1.92362,1.92373,1.92384,1.92394,1.92405,1.92416,1.92426,1.92437,1.92447,1.92458,1.92469,1.92479,1.9249,1.925,1.92511,1.92521,1.92532,1.92542,1.92552,1.92563,1.92573,1.92584,1.92594,1.92604,1.92615,1.92625,1.92636,1.92646,1.92656,1.92666,1.92677,1.92687,1.92697,1.92707,1.92718,1.92728,1.92738,1.92748,1.92758,1.92769,1.92779,1.92789,1.92799,1.92809,1.92819,1.92829,1.92839,1.92849,1.92859,1.92869,1.92879,1.92889,1.92899,1.92909,1.92919,1.92929,1.92939,1.92949,1.92959,1.92969,1.92979, +1.92989,1.92999,1.93008,1.93018,1.93028,1.93038,1.93048,1.93057,1.93067,1.93077,1.93087,1.93096,1.93106,1.93116,1.93125,1.93135,1.93145,1.93154,1.93164,1.93174,1.93183,1.93193,1.93202,1.93212,1.93222,1.93231,1.93241,1.9325,1.9326,1.93269,1.93279,1.93288,1.93298,1.93307,1.93316,1.93326,1.93335,1.93345,1.93354,1.93363,1.93373,1.93382,1.93391,1.93401,1.9341,1.93419,1.93429,1.93438,1.93447,1.93456,1.93466,1.93475,1.93484,1.93493,1.93502,1.93512,1.93521,1.9353,1.93539,1.93548,1.93557,1.93566,1.93575,1.93584,1.93593,1.93603,1.93612,1.93621,1.9363,1.93639,1.93648,1.93657,1.93666,1.93674,1.93683,1.93692,1.93701,1.9371,1.93719,1.93728,1.93737,1.93746,1.93754,1.93763,1.93772,1.93781,1.9379,1.93799,1.93807,1.93816,1.93825,1.93834,1.93842,1.93851,1.9386,1.93868,1.93877,1.93886,1.93894,1.93903, +1.93912,1.9392,1.93929,1.93937,1.93946,1.93955,1.93963,1.93972,1.9398,1.93989,1.93997,1.94006,1.94014,1.94023,1.94031,1.9404,1.94048,1.94057,1.94065,1.94074,1.94082,1.9409,1.94099,1.94107,1.94115,1.94124,1.94132,1.9414,1.94149,1.94157,1.94165,1.94174,1.94182,1.9419,1.94198,1.94207,1.94215,1.94223,1.94231,1.94239,1.94248,1.94256,1.94264,1.94272,1.9428,1.94288,1.94296,1.94305,1.94313,1.94321,1.94329,1.94337,1.94345,1.94353,1.94361,1.94369,1.94377,1.94385,1.94393,1.94401,1.94409,1.94417,1.94425,1.94433,1.94441,1.94449,1.94456,1.94464,1.94472,1.9448,1.94488,1.94496,1.94504,1.94511,1.94519,1.94527,1.94535,1.94543,1.9455,1.94558,1.94566,1.94574,1.94581,1.94589,1.94597,1.94605,1.94612,1.9462,1.94628,1.94635,1.94643,1.94651,1.94658,1.94666,1.94673,1.94681,1.94689,1.94696,1.94704,1.94711, +1.94719,1.94726,1.94734,1.94741,1.94749,1.94756,1.94764,1.94771,1.94779,1.94786,1.94794,1.94801,1.94809,1.94816,1.94823,1.94831,1.94838,1.94845,1.94853,1.9486,1.94868,1.94875,1.94882,1.94889,1.94897,1.94904,1.94911,1.94919,1.94926,1.94933,1.9494,1.94948,1.94955,1.94962,1.94969,1.94976,1.94984,1.94991,1.94998,1.95005,1.95012,1.95019,1.95027,1.95034,1.95041,1.95048,1.95055,1.95062,1.95069,1.95076,1.95083,1.9509,1.95097,1.95104,1.95111,1.95118,1.95125,1.95132,1.95139,1.95146,1.95153,1.9516,1.95167,1.95174,1.95181,1.95188,1.95195,1.95202,1.95208,1.95215,1.95222,1.95229,1.95236,1.95243,1.95249,1.95256,1.95263,1.9527,1.95277,1.95283,1.9529,1.95297,1.95304,1.9531,1.95317,1.95324,1.95331,1.95337,1.95344,1.95351,1.95357,1.95364,1.95371,1.95377,1.95384,1.95391,1.95397,1.95404,1.9541,1.95417, +1.95424,1.9543,1.95437,1.95443,1.9545,1.95456,1.95463,1.95469,1.95476,1.95482,1.95489,1.95495,1.95502,1.95508,1.95515,1.95521,1.95528,1.95534,1.95541,1.95547,1.95553,1.9556,1.95566,1.95573,1.95579,1.95585,1.95592,1.95598,1.95604,1.95611,1.95617,1.95623,1.9563,1.95636,1.95642,1.95648,1.95655,1.95661,1.95667,1.95673,1.9568,1.95686,1.95692,1.95698,1.95704,1.95711,1.95717,1.95723,1.95729,1.95735,1.95741,1.95748,1.95754,1.9576,1.95766,1.95772,1.95778,1.95784,1.9579,1.95796,1.95802,1.95808,1.95815,1.95821,1.95827,1.95833,1.95839,1.95845,1.95851,1.95857,1.95863,1.95869,1.95875,1.9588,1.95886,1.95892,1.95898,1.95904,1.9591,1.95916,1.95922,1.95928,1.95934,1.9594,1.95945,1.95951,1.95957,1.95963,1.95969,1.95975,1.9598,1.95986,1.95992,1.95998,1.96004,1.96009,1.96015,1.96021,1.96027,1.96032}; + +constexpr double stored_gamma_values_n5[] = {1.0,1.0,1.0,1.0,1.0,0.99999,0.99999,0.99999,0.99999,0.99998,0.99998,0.99997,0.99997,0.99996,0.99996,0.99995,0.99995,0.99994,0.99993,0.99993,0.99992,0.99991,0.9999,0.99989,0.99988,0.99987,0.99986,0.99985,0.99984,0.99983,0.99981,0.9998,0.99979,0.99978,0.99976,0.99975,0.99973,0.99972,0.9997,0.99969,0.99967,0.99965,0.99964,0.99962,0.9996,0.99958,0.99957,0.99955,0.99953,0.99951,0.99949,0.99947,0.99945,0.99943,0.9994,0.99938,0.99936,0.99934,0.99931,0.99929,0.99927,0.99924,0.99922,0.99919,0.99917,0.99914,0.99911,0.99909,0.99906,0.99903,0.99901,0.99898,0.99895,0.99892,0.99889,0.99886,0.99883,0.9988,0.99877,0.99874,0.99871,0.99867,0.99864,0.99861,0.99858,0.99854,0.99851,0.99847,0.99844,0.9984,0.99837,0.99833,0.9983,0.99826,0.99822,0.99819,0.99815,0.99811,0.99807,0.99803, +0.998,0.99796,0.99792,0.99788,0.99784,0.9978,0.99775,0.99771,0.99767,0.99763,0.99759,0.99754,0.9975,0.99746,0.99741,0.99737,0.99732,0.99728,0.99723,0.99718,0.99714,0.99709,0.99704,0.997,0.99695,0.9969,0.99685,0.9968,0.99676,0.99671,0.99666,0.99661,0.99656,0.9965,0.99645,0.9964,0.99635,0.9963,0.99624,0.99619,0.99614,0.99608,0.99603,0.99598,0.99592,0.99587,0.99581,0.99576,0.9957,0.99564,0.99559,0.99553,0.99547,0.99541,0.99536,0.9953,0.99524,0.99518,0.99512,0.99506,0.995,0.99494,0.99488,0.99482,0.99476,0.99469,0.99463,0.99457,0.99451,0.99444,0.99438,0.99431,0.99425,0.99419,0.99412,0.99406,0.99399,0.99392,0.99386,0.99379,0.99372,0.99366,0.99359,0.99352,0.99345,0.99339,0.99332,0.99325,0.99318,0.99311,0.99304,0.99297,0.9929,0.99283,0.99275,0.99268,0.99261,0.99254,0.99247,0.99239, +0.99232,0.99225,0.99217,0.9921,0.99202,0.99195,0.99187,0.9918,0.99172,0.99164,0.99157,0.99149,0.99141,0.99134,0.99126,0.99118,0.9911,0.99102,0.99094,0.99086,0.99078,0.9907,0.99062,0.99054,0.99046,0.99038,0.9903,0.99022,0.99014,0.99005,0.98997,0.98989,0.9898,0.98972,0.98964,0.98955,0.98947,0.98938,0.9893,0.98921,0.98913,0.98904,0.98895,0.98887,0.98878,0.98869,0.9886,0.98852,0.98843,0.98834,0.98825,0.98816,0.98807,0.98798,0.98789,0.9878,0.98771,0.98762,0.98753,0.98744,0.98735,0.98725,0.98716,0.98707,0.98698,0.98688,0.98679,0.9867,0.9866,0.98651,0.98641,0.98632,0.98622,0.98613,0.98603,0.98593,0.98584,0.98574,0.98564,0.98555,0.98545,0.98535,0.98525,0.98515,0.98506,0.98496,0.98486,0.98476,0.98466,0.98456,0.98446,0.98436,0.98426,0.98415,0.98405,0.98395,0.98385,0.98375,0.98364,0.98354, +0.98344,0.98333,0.98323,0.98313,0.98302,0.98292,0.98281,0.98271,0.9826,0.9825,0.98239,0.98228,0.98218,0.98207,0.98196,0.98186,0.98175,0.98164,0.98153,0.98142,0.98131,0.98121,0.9811,0.98099,0.98088,0.98077,0.98066,0.98055,0.98043,0.98032,0.98021,0.9801,0.97999,0.97988,0.97976,0.97965,0.97954,0.97942,0.97931,0.9792,0.97908,0.97897,0.97885,0.97874,0.97862,0.97851,0.97839,0.97828,0.97816,0.97805,0.97793,0.97781,0.97769,0.97758,0.97746,0.97734,0.97722,0.9771,0.97699,0.97687,0.97675,0.97663,0.97651,0.97639,0.97627,0.97615,0.97603,0.97591,0.97579,0.97566,0.97554,0.97542,0.9753,0.97518,0.97505,0.97493,0.97481,0.97468,0.97456,0.97443,0.97431,0.97419,0.97406,0.97394,0.97381,0.97369,0.97356,0.97343,0.97331,0.97318,0.97305,0.97293,0.9728,0.97267,0.97255,0.97242,0.97229,0.97216,0.97203,0.9719, +0.97177,0.97165,0.97152,0.97139,0.97126,0.97113,0.97099,0.97086,0.97073,0.9706,0.97047,0.97034,0.97021,0.97007,0.96994,0.96981,0.96968,0.96954,0.96941,0.96928,0.96914,0.96901,0.96887,0.96874,0.96861,0.96847,0.96833,0.9682,0.96806,0.96793,0.96779,0.96766,0.96752,0.96738,0.96724,0.96711,0.96697,0.96683,0.96669,0.96656,0.96642,0.96628,0.96614,0.966,0.96586,0.96572,0.96558,0.96544,0.9653,0.96516,0.96502,0.96488,0.96474,0.9646,0.96446,0.96432,0.96417,0.96403,0.96389,0.96375,0.9636,0.96346,0.96332,0.96317,0.96303,0.96289,0.96274,0.9626,0.96245,0.96231,0.96216,0.96202,0.96187,0.96173,0.96158,0.96143,0.96129,0.96114,0.961,0.96085,0.9607,0.96055,0.96041,0.96026,0.96011,0.95996,0.95981,0.95967,0.95952,0.95937,0.95922,0.95907,0.95892,0.95877,0.95862,0.95847,0.95832,0.95817,0.95802,0.95787, +0.95771,0.95756,0.95741,0.95726,0.95711,0.95695,0.9568,0.95665,0.9565,0.95634,0.95619,0.95604,0.95588,0.95573,0.95557,0.95542,0.95527,0.95511,0.95496,0.9548,0.95465,0.95449,0.95433,0.95418,0.95402,0.95387,0.95371,0.95355,0.9534,0.95324,0.95308,0.95292,0.95277,0.95261,0.95245,0.95229,0.95213,0.95197,0.95182,0.95166,0.9515,0.95134,0.95118,0.95102,0.95086,0.9507,0.95054,0.95038,0.95022,0.95006,0.94989,0.94973,0.94957,0.94941,0.94925,0.94909,0.94892,0.94876,0.9486,0.94844,0.94827,0.94811,0.94795,0.94778,0.94762,0.94745,0.94729,0.94713,0.94696,0.9468,0.94663,0.94647,0.9463,0.94614,0.94597,0.9458,0.94564,0.94547,0.94531,0.94514,0.94497,0.94481,0.94464,0.94447,0.9443,0.94414,0.94397,0.9438,0.94363,0.94347,0.9433,0.94313,0.94296,0.94279,0.94262,0.94245,0.94228,0.94211,0.94194,0.94177, +0.9416,0.94143,0.94126,0.94109,0.94092,0.94075,0.94058,0.94041,0.94023,0.94006,0.93989,0.93972,0.93955,0.93937,0.9392,0.93903,0.93886,0.93868,0.93851,0.93834,0.93816,0.93799,0.93781,0.93764,0.93747,0.93729,0.93712,0.93694,0.93677,0.93659,0.93642,0.93624,0.93607,0.93589,0.93571,0.93554,0.93536,0.93518,0.93501,0.93483,0.93465,0.93448,0.9343,0.93412,0.93394,0.93377,0.93359,0.93341,0.93323,0.93305,0.93288,0.9327,0.93252,0.93234,0.93216,0.93198,0.9318,0.93162,0.93144,0.93126,0.93108,0.9309,0.93072,0.93054,0.93036,0.93018,0.93,0.92982,0.92963,0.92945,0.92927,0.92909,0.92891,0.92873,0.92854,0.92836,0.92818,0.928,0.92781,0.92763,0.92745,0.92726,0.92708,0.9269,0.92671,0.92653,0.92634,0.92616,0.92598,0.92579,0.92561,0.92542,0.92524,0.92505,0.92487,0.92468,0.92449,0.92431,0.92412,0.92394, +0.92375,0.92356,0.92338,0.92319,0.923,0.92282,0.92263,0.92244,0.92226,0.92207,0.92188,0.92169,0.92151,0.92132,0.92113,0.92094,0.92075,0.92056,0.92038,0.92019,0.92,0.91981,0.91962,0.91943,0.91924,0.91905,0.91886,0.91867,0.91848,0.91829,0.9181,0.91791,0.91772,0.91753,0.91734,0.91714,0.91695,0.91676,0.91657,0.91638,0.91619,0.916,0.9158,0.91561,0.91542,0.91523,0.91503,0.91484,0.91465,0.91446,0.91426,0.91407,0.91388,0.91368,0.91349,0.91329,0.9131,0.91291,0.91271,0.91252,0.91232,0.91213,0.91193,0.91174,0.91154,0.91135,0.91115,0.91096,0.91076,0.91057,0.91037,0.91018,0.90998,0.90978,0.90959,0.90939,0.90919,0.909,0.9088,0.9086,0.90841,0.90821,0.90801,0.90782,0.90762,0.90742,0.90722,0.90702,0.90683,0.90663,0.90643,0.90623,0.90603,0.90584,0.90564,0.90544,0.90524,0.90504,0.90484,0.90464, +0.90444,0.90424,0.90404,0.90384,0.90364,0.90344,0.90324,0.90304,0.90284,0.90264,0.90244,0.90224,0.90204,0.90184,0.90164,0.90144,0.90123,0.90103,0.90083,0.90063,0.90043,0.90023,0.90002,0.89982,0.89962,0.89942,0.89921,0.89901,0.89881,0.89861,0.8984,0.8982,0.898,0.89779,0.89759,0.89739,0.89718,0.89698,0.89677,0.89657,0.89637,0.89616,0.89596,0.89575,0.89555,0.89534,0.89514,0.89494,0.89473,0.89453,0.89432,0.89411,0.89391,0.8937,0.8935,0.89329,0.89309,0.89288,0.89267,0.89247,0.89226,0.89206,0.89185,0.89164,0.89144,0.89123,0.89102,0.89082,0.89061,0.8904,0.89019,0.88999,0.88978,0.88957,0.88936,0.88916,0.88895,0.88874,0.88853,0.88832,0.88811,0.88791,0.8877,0.88749,0.88728,0.88707,0.88686,0.88665,0.88644,0.88623,0.88603,0.88582,0.88561,0.8854,0.88519,0.88498,0.88477,0.88456,0.88435,0.88414, +0.88393,0.88372,0.88351,0.88329,0.88308,0.88287,0.88266,0.88245,0.88224,0.88203,0.88182,0.88161,0.88139,0.88118,0.88097,0.88076,0.88055,0.88034,0.88012,0.87991,0.8797,0.87949,0.87927,0.87906,0.87885,0.87864,0.87842,0.87821,0.878,0.87778,0.87757,0.87736,0.87714,0.87693,0.87672,0.8765,0.87629,0.87608,0.87586,0.87565,0.87543,0.87522,0.87501,0.87479,0.87458,0.87436,0.87415,0.87393,0.87372,0.8735,0.87329,0.87307,0.87286,0.87264,0.87243,0.87221,0.872,0.87178,0.87157,0.87135,0.87113,0.87092,0.8707,0.87049,0.87027,0.87005,0.86984,0.86962,0.8694,0.86919,0.86897,0.86875,0.86854,0.86832,0.8681,0.86789,0.86767,0.86745,0.86723,0.86702,0.8668,0.86658,0.86636,0.86615,0.86593,0.86571,0.86549,0.86527,0.86506,0.86484,0.86462,0.8644,0.86418,0.86396,0.86375,0.86353,0.86331,0.86309,0.86287,0.86265, +0.86243,0.86221,0.86199,0.86177,0.86156,0.86134,0.86112,0.8609,0.86068,0.86046,0.86024,0.86002,0.8598,0.85958,0.85936,0.85914,0.85892,0.8587,0.85848,0.85826,0.85803,0.85781,0.85759,0.85737,0.85715,0.85693,0.85671,0.85649,0.85627,0.85605,0.85582,0.8556,0.85538,0.85516,0.85494,0.85472,0.8545,0.85427,0.85405,0.85383,0.85361,0.85339,0.85316,0.85294,0.85272,0.8525,0.85227,0.85205,0.85183,0.85161,0.85138,0.85116,0.85094,0.85071,0.85049,0.85027,0.85005,0.84982,0.8496,0.84938,0.84915,0.84893,0.8487,0.84848,0.84826,0.84803,0.84781,0.84759,0.84736,0.84714,0.84691,0.84669,0.84647,0.84624,0.84602,0.84579,0.84557,0.84534,0.84512,0.84489,0.84467,0.84445,0.84422,0.844,0.84377,0.84355,0.84332,0.8431,0.84287,0.84265,0.84242,0.84219,0.84197,0.84174,0.84152,0.84129,0.84107,0.84084,0.84061,0.84039, +0.84016,0.83994,0.83971,0.83949,0.83926,0.83903,0.83881,0.83858,0.83835,0.83813,0.8379,0.83767,0.83745,0.83722,0.83699,0.83677,0.83654,0.83631,0.83609,0.83586,0.83563,0.83541,0.83518,0.83495,0.83472,0.8345,0.83427,0.83404,0.83381,0.83359,0.83336,0.83313,0.8329,0.83268,0.83245,0.83222,0.83199,0.83176,0.83154,0.83131,0.83108,0.83085,0.83062,0.83039,0.83017,0.82994,0.82971,0.82948,0.82925,0.82902,0.8288,0.82857,0.82834,0.82811,0.82788,0.82765,0.82742,0.82719,0.82696,0.82673,0.82651,0.82628,0.82605,0.82582,0.82559,0.82536,0.82513,0.8249,0.82467,0.82444,0.82421,0.82398,0.82375,0.82352,0.82329,0.82306,0.82283,0.8226,0.82237,0.82214,0.82191,0.82168,0.82145,0.82122,0.82099,0.82076,0.82053,0.8203,0.82007,0.81984,0.81961,0.81938,0.81915,0.81892,0.81869,0.81845,0.81822,0.81799,0.81776,0.81753, +0.8173,0.81707,0.81684,0.81661,0.81638,0.81614,0.81591,0.81568,0.81545,0.81522,0.81499,0.81476,0.81452,0.81429,0.81406,0.81383,0.8136,0.81337,0.81313,0.8129,0.81267,0.81244,0.81221,0.81197,0.81174,0.81151,0.81128,0.81105,0.81081,0.81058,0.81035,0.81012,0.80988,0.80965,0.80942,0.80919,0.80896,0.80872,0.80849,0.80826,0.80802,0.80779,0.80756,0.80733,0.80709,0.80686,0.80663,0.8064,0.80616,0.80593,0.8057,0.80546,0.80523,0.805,0.80476,0.80453,0.8043,0.80406,0.80383,0.8036,0.80336,0.80313,0.8029,0.80266,0.80243,0.8022,0.80196,0.80173,0.8015,0.80126,0.80103,0.8008,0.80056,0.80033,0.80009,0.79986,0.79963,0.79939,0.79916,0.79892,0.79869,0.79846,0.79822,0.79799,0.79775,0.79752,0.79729,0.79705,0.79682,0.79658,0.79635,0.79611,0.79588,0.79565,0.79541,0.79518,0.79494,0.79471,0.79447,0.79424, +0.794,0.79377,0.79353,0.7933,0.79307,0.79283,0.7926,0.79236,0.79213,0.79189,0.79166,0.79142,0.79119,0.79095,0.79072,0.79048,0.79025,0.79001,0.78978,0.78954,0.78931,0.78907,0.78884,0.7886,0.78836,0.78813,0.78789,0.78766,0.78742,0.78719,0.78695,0.78672,0.78648,0.78625,0.78601,0.78578,0.78554,0.7853,0.78507,0.78483,0.7846,0.78436,0.78413,0.78389,0.78365,0.78342,0.78318,0.78295,0.78271,0.78248,0.78224,0.782,0.78177,0.78153,0.7813,0.78106,0.78082,0.78059,0.78035,0.78012,0.77988,0.77964,0.77941,0.77917,0.77893,0.7787,0.77846,0.77823,0.77799,0.77775,0.77752,0.77728,0.77704,0.77681,0.77657,0.77634,0.7761,0.77586,0.77563,0.77539,0.77515,0.77492,0.77468,0.77444,0.77421,0.77397,0.77373,0.7735,0.77326,0.77302,0.77279,0.77255,0.77231,0.77208,0.77184,0.7716,0.77137,0.77113,0.77089,0.77066, +0.77042,0.77018,0.76995,0.76971,0.76947,0.76924,0.769,0.76876,0.76852,0.76829,0.76805,0.76781,0.76758,0.76734,0.7671,0.76687,0.76663,0.76639,0.76615,0.76592,0.76568,0.76544,0.76521,0.76497,0.76473,0.76449,0.76426,0.76402,0.76378,0.76354,0.76331,0.76307,0.76283,0.7626,0.76236,0.76212,0.76188,0.76165,0.76141,0.76117,0.76093,0.7607,0.76046,0.76022,0.75998,0.75975,0.75951,0.75927,0.75903,0.7588,0.75856,0.75832,0.75808,0.75785,0.75761,0.75737,0.75713,0.7569,0.75666,0.75642,0.75618,0.75595,0.75571,0.75547,0.75523,0.755,0.75476,0.75452,0.75428,0.75405,0.75381,0.75357,0.75333,0.7531,0.75286,0.75262,0.75238,0.75214,0.75191,0.75167,0.75143,0.75119,0.75096,0.75072,0.75048,0.75024,0.75,0.74977,0.74953,0.74929,0.74905,0.74882,0.74858,0.74834,0.7481,0.74786,0.74763,0.74739,0.74715,0.74691, +0.74667,0.74644,0.7462,0.74596,0.74572,0.74549,0.74525,0.74501,0.74477,0.74453,0.7443,0.74406,0.74382,0.74358,0.74334,0.74311,0.74287,0.74263,0.74239,0.74215,0.74192,0.74168,0.74144,0.7412,0.74096,0.74073,0.74049,0.74025,0.74001,0.73977,0.73954,0.7393,0.73906,0.73882,0.73859,0.73835,0.73811,0.73787,0.73763,0.7374,0.73716,0.73692,0.73668,0.73644,0.73621,0.73597,0.73573,0.73549,0.73525,0.73502,0.73478,0.73454,0.7343,0.73406,0.73383,0.73359,0.73335,0.73311,0.73287,0.73264,0.7324,0.73216,0.73192,0.73168,0.73145,0.73121,0.73097,0.73073,0.73049,0.73026,0.73002,0.72978,0.72954,0.7293,0.72907,0.72883,0.72859,0.72835,0.72811,0.72788,0.72764,0.7274,0.72716,0.72693,0.72669,0.72645,0.72621,0.72597,0.72574,0.7255,0.72526,0.72502,0.72478,0.72455,0.72431,0.72407,0.72383,0.72359,0.72336,0.72312, +0.72288,0.72264,0.72241,0.72217,0.72193,0.72169,0.72145,0.72122,0.72098,0.72074,0.7205,0.72027,0.72003,0.71979,0.71955,0.71931,0.71908,0.71884,0.7186,0.71836,0.71813,0.71789,0.71765,0.71741,0.71718,0.71694,0.7167,0.71646,0.71622,0.71599,0.71575,0.71551,0.71527,0.71504,0.7148,0.71456,0.71432,0.71409,0.71385,0.71361,0.71337,0.71314,0.7129,0.71266,0.71242,0.71219,0.71195,0.71171,0.71147,0.71124,0.711,0.71076,0.71052,0.71029,0.71005,0.70981,0.70957,0.70934,0.7091,0.70886,0.70862,0.70839,0.70815,0.70791,0.70767,0.70744,0.7072,0.70696,0.70673,0.70649,0.70625,0.70601,0.70578,0.70554,0.7053,0.70506,0.70483,0.70459,0.70435,0.70412,0.70388,0.70364,0.7034,0.70317,0.70293,0.70269,0.70246,0.70222,0.70198,0.70175,0.70151,0.70127,0.70103,0.7008,0.70056,0.70032,0.70009,0.69985,0.69961,0.69938, +0.69914,0.6989,0.69867,0.69843,0.69819,0.69795,0.69772,0.69748,0.69724,0.69701,0.69677,0.69653,0.6963,0.69606,0.69582,0.69559,0.69535,0.69511,0.69488,0.69464,0.6944,0.69417,0.69393,0.6937,0.69346,0.69322,0.69299,0.69275,0.69251,0.69228,0.69204,0.6918,0.69157,0.69133,0.69109,0.69086,0.69062,0.69039,0.69015,0.68991,0.68968,0.68944,0.6892,0.68897,0.68873,0.6885,0.68826,0.68802,0.68779,0.68755,0.68731,0.68708,0.68684,0.68661,0.68637,0.68613,0.6859,0.68566,0.68543,0.68519,0.68495,0.68472,0.68448,0.68425,0.68401,0.68378,0.68354,0.6833,0.68307,0.68283,0.6826,0.68236,0.68213,0.68189,0.68165,0.68142,0.68118,0.68095,0.68071,0.68048,0.68024,0.68001,0.67977,0.67953,0.6793,0.67906,0.67883,0.67859,0.67836,0.67812,0.67789,0.67765,0.67742,0.67718,0.67695,0.67671,0.67648,0.67624,0.67601,0.67577, +0.67553,0.6753,0.67506,0.67483,0.67459,0.67436,0.67412,0.67389,0.67365,0.67342,0.67319,0.67295,0.67272,0.67248,0.67225,0.67201,0.67178,0.67154,0.67131,0.67107,0.67084,0.6706,0.67037,0.67013,0.6699,0.66966,0.66943,0.6692,0.66896,0.66873,0.66849,0.66826,0.66802,0.66779,0.66755,0.66732,0.66709,0.66685,0.66662,0.66638,0.66615,0.66592,0.66568,0.66545,0.66521,0.66498,0.66474,0.66451,0.66428,0.66404,0.66381,0.66357,0.66334,0.66311,0.66287,0.66264,0.66241,0.66217,0.66194,0.6617,0.66147,0.66124,0.661,0.66077,0.66054,0.6603,0.66007,0.65984,0.6596,0.65937,0.65914,0.6589,0.65867,0.65843,0.6582,0.65797,0.65774,0.6575,0.65727,0.65704,0.6568,0.65657,0.65634,0.6561,0.65587,0.65564,0.6554,0.65517,0.65494,0.6547,0.65447,0.65424,0.65401,0.65377,0.65354,0.65331,0.65308,0.65284,0.65261,0.65238, +0.65214,0.65191,0.65168,0.65145,0.65121,0.65098,0.65075,0.65052,0.65028,0.65005,0.64982,0.64959,0.64936,0.64912,0.64889,0.64866,0.64843,0.64819,0.64796,0.64773,0.6475,0.64727,0.64703,0.6468,0.64657,0.64634,0.64611,0.64587,0.64564,0.64541,0.64518,0.64495,0.64472,0.64448,0.64425,0.64402,0.64379,0.64356,0.64333,0.64309,0.64286,0.64263,0.6424,0.64217,0.64194,0.64171,0.64148,0.64124,0.64101,0.64078,0.64055,0.64032,0.64009,0.63986,0.63963,0.6394,0.63916,0.63893,0.6387,0.63847,0.63824,0.63801,0.63778,0.63755,0.63732,0.63709,0.63686,0.63663,0.6364,0.63616,0.63593,0.6357,0.63547,0.63524,0.63501,0.63478,0.63455,0.63432,0.63409,0.63386,0.63363,0.6334,0.63317,0.63294,0.63271,0.63248,0.63225,0.63202,0.63179,0.63156,0.63133,0.6311,0.63087,0.63064,0.63041,0.63018,0.62995,0.62972,0.62949,0.62926, +0.62903,0.6288,0.62857,0.62835,0.62812,0.62789,0.62766,0.62743,0.6272,0.62697,0.62674,0.62651,0.62628,0.62605,0.62582,0.62559,0.62537,0.62514,0.62491,0.62468,0.62445,0.62422,0.62399,0.62376,0.62354,0.62331,0.62308,0.62285,0.62262,0.62239,0.62216,0.62194,0.62171,0.62148,0.62125,0.62102,0.62079,0.62057,0.62034,0.62011,0.61988,0.61965,0.61942,0.6192,0.61897,0.61874,0.61851,0.61828,0.61806,0.61783,0.6176,0.61737,0.61715,0.61692,0.61669,0.61646,0.61624,0.61601,0.61578,0.61555,0.61533,0.6151,0.61487,0.61464,0.61442,0.61419,0.61396,0.61373,0.61351,0.61328,0.61305,0.61283,0.6126,0.61237,0.61215,0.61192,0.61169,0.61147,0.61124,0.61101,0.61079,0.61056,0.61033,0.61011,0.60988,0.60965,0.60943,0.6092,0.60897,0.60875,0.60852,0.60829,0.60807,0.60784,0.60762,0.60739,0.60716,0.60694,0.60671,0.60649, +0.60626,0.60603,0.60581,0.60558,0.60536,0.60513,0.6049,0.60468,0.60445,0.60423,0.604,0.60378,0.60355,0.60333,0.6031,0.60288,0.60265,0.60243,0.6022,0.60197,0.60175,0.60152,0.6013,0.60107,0.60085,0.60062,0.6004,0.60017,0.59995,0.59973,0.5995,0.59928,0.59905,0.59883,0.5986,0.59838,0.59815,0.59793,0.5977,0.59748,0.59726,0.59703,0.59681,0.59658,0.59636,0.59613,0.59591,0.59569,0.59546,0.59524,0.59501,0.59479,0.59457,0.59434,0.59412,0.5939,0.59367,0.59345,0.59322,0.593,0.59278,0.59255,0.59233,0.59211,0.59188,0.59166,0.59144,0.59121,0.59099,0.59077,0.59054,0.59032,0.5901,0.58988,0.58965,0.58943,0.58921,0.58898,0.58876,0.58854,0.58832,0.58809,0.58787,0.58765,0.58742,0.5872,0.58698,0.58676,0.58654,0.58631,0.58609,0.58587,0.58565,0.58542,0.5852,0.58498,0.58476,0.58454,0.58431,0.58409, +0.58387,0.58365,0.58343,0.58321,0.58298,0.58276,0.58254,0.58232,0.5821,0.58188,0.58165,0.58143,0.58121,0.58099,0.58077,0.58055,0.58033,0.58011,0.57988,0.57966,0.57944,0.57922,0.579,0.57878,0.57856,0.57834,0.57812,0.5779,0.57768,0.57746,0.57723,0.57701,0.57679,0.57657,0.57635,0.57613,0.57591,0.57569,0.57547,0.57525,0.57503,0.57481,0.57459,0.57437,0.57415,0.57393,0.57371,0.57349,0.57327,0.57305,0.57283,0.57261,0.57239,0.57217,0.57195,0.57174,0.57152,0.5713,0.57108,0.57086,0.57064,0.57042,0.5702,0.56998,0.56976,0.56954,0.56932,0.56911,0.56889,0.56867,0.56845,0.56823,0.56801,0.56779,0.56757,0.56736,0.56714,0.56692,0.5667,0.56648,0.56626,0.56605,0.56583,0.56561,0.56539,0.56517,0.56495,0.56474,0.56452,0.5643,0.56408,0.56387,0.56365,0.56343,0.56321,0.56299,0.56278,0.56256,0.56234,0.56212, +0.56191,0.56169,0.56147,0.56126,0.56104,0.56082,0.5606,0.56039,0.56017,0.55995,0.55974,0.55952,0.5593,0.55909,0.55887,0.55865,0.55843,0.55822,0.558,0.55779,0.55757,0.55735,0.55714,0.55692,0.5567,0.55649,0.55627,0.55605,0.55584,0.55562,0.55541,0.55519,0.55497,0.55476,0.55454,0.55433,0.55411,0.5539,0.55368,0.55346,0.55325,0.55303,0.55282,0.5526,0.55239,0.55217,0.55196,0.55174,0.55153,0.55131,0.5511,0.55088,0.55067,0.55045,0.55024,0.55002,0.54981,0.54959,0.54938,0.54916,0.54895,0.54873,0.54852,0.5483,0.54809,0.54788,0.54766,0.54745,0.54723,0.54702,0.54681,0.54659,0.54638,0.54616,0.54595,0.54574,0.54552,0.54531,0.54509,0.54488,0.54467,0.54445,0.54424,0.54403,0.54381,0.5436,0.54339,0.54317,0.54296,0.54275,0.54253,0.54232,0.54211,0.54189,0.54168,0.54147,0.54126,0.54104,0.54083,0.54062, +0.5404,0.54019,0.53998,0.53977,0.53955,0.53934,0.53913,0.53892,0.53871,0.53849,0.53828,0.53807,0.53786,0.53764,0.53743,0.53722,0.53701,0.5368,0.53659,0.53637,0.53616,0.53595,0.53574,0.53553,0.53532,0.5351,0.53489,0.53468,0.53447,0.53426,0.53405,0.53384,0.53363,0.53341,0.5332,0.53299,0.53278,0.53257,0.53236,0.53215,0.53194,0.53173,0.53152,0.53131,0.5311,0.53089,0.53068,0.53047,0.53026,0.53005,0.52983,0.52962,0.52941,0.5292,0.52899,0.52878,0.52858,0.52837,0.52816,0.52795,0.52774,0.52753,0.52732,0.52711,0.5269,0.52669,0.52648,0.52627,0.52606,0.52585,0.52564,0.52543,0.52522,0.52501,0.52481,0.5246,0.52439,0.52418,0.52397,0.52376,0.52355,0.52334,0.52314,0.52293,0.52272,0.52251,0.5223,0.52209,0.52189,0.52168,0.52147,0.52126,0.52105,0.52085,0.52064,0.52043,0.52022,0.52001,0.51981,0.5196, +0.51939,0.51918,0.51898,0.51877,0.51856,0.51835,0.51815,0.51794,0.51773,0.51752,0.51732,0.51711,0.5169,0.5167,0.51649,0.51628,0.51608,0.51587,0.51566,0.51546,0.51525,0.51504,0.51484,0.51463,0.51442,0.51422,0.51401,0.5138,0.5136,0.51339,0.51319,0.51298,0.51277,0.51257,0.51236,0.51216,0.51195,0.51174,0.51154,0.51133,0.51113,0.51092,0.51072,0.51051,0.51031,0.5101,0.5099,0.50969,0.50949,0.50928,0.50907,0.50887,0.50866,0.50846,0.50826,0.50805,0.50785,0.50764,0.50744,0.50723,0.50703,0.50682,0.50662,0.50641,0.50621,0.50601,0.5058,0.5056,0.50539,0.50519,0.50498,0.50478,0.50458,0.50437,0.50417,0.50397,0.50376,0.50356,0.50335,0.50315,0.50295,0.50274,0.50254,0.50234,0.50213,0.50193,0.50173,0.50153,0.50132,0.50112,0.50092,0.50071,0.50051,0.50031,0.5001,0.4999,0.4997,0.4995,0.49929,0.49909, +0.49889,0.49869,0.49848,0.49828,0.49808,0.49788,0.49768,0.49747,0.49727,0.49707,0.49687,0.49667,0.49646,0.49626,0.49606,0.49586,0.49566,0.49546,0.49526,0.49505,0.49485,0.49465,0.49445,0.49425,0.49405,0.49385,0.49365,0.49344,0.49324,0.49304,0.49284,0.49264,0.49244,0.49224,0.49204,0.49184,0.49164,0.49144,0.49124,0.49104,0.49084,0.49064,0.49044,0.49024,0.49004,0.48984,0.48964,0.48944,0.48924,0.48904,0.48884,0.48864,0.48844,0.48824,0.48804,0.48784,0.48764,0.48744,0.48724,0.48704,0.48684,0.48664,0.48644,0.48624,0.48605,0.48585,0.48565,0.48545,0.48525,0.48505,0.48485,0.48465,0.48446,0.48426,0.48406,0.48386,0.48366,0.48346,0.48327,0.48307,0.48287,0.48267,0.48247,0.48228,0.48208,0.48188,0.48168,0.48148,0.48129,0.48109,0.48089,0.48069,0.4805,0.4803,0.4801,0.4799,0.47971,0.47951,0.47931,0.47912, +0.47892,0.47872,0.47852,0.47833,0.47813,0.47793,0.47774,0.47754,0.47734,0.47715,0.47695,0.47675,0.47656,0.47636,0.47617,0.47597,0.47577,0.47558,0.47538,0.47519,0.47499,0.47479,0.4746,0.4744,0.47421,0.47401,0.47381,0.47362,0.47342,0.47323,0.47303,0.47284,0.47264,0.47245,0.47225,0.47206,0.47186,0.47167,0.47147,0.47128,0.47108,0.47089,0.47069,0.4705,0.4703,0.47011,0.46991,0.46972,0.46953,0.46933,0.46914,0.46894,0.46875,0.46855,0.46836,0.46817,0.46797,0.46778,0.46758,0.46739,0.4672,0.467,0.46681,0.46662,0.46642,0.46623,0.46604,0.46584,0.46565,0.46546,0.46526,0.46507,0.46488,0.46468,0.46449,0.4643,0.4641,0.46391,0.46372,0.46353,0.46333,0.46314,0.46295,0.46276,0.46256,0.46237,0.46218,0.46199,0.46179,0.4616,0.46141,0.46122,0.46103,0.46083,0.46064,0.46045,0.46026,0.46007,0.45988,0.45968, +0.45949,0.4593,0.45911,0.45892,0.45873,0.45854,0.45834,0.45815,0.45796,0.45777,0.45758,0.45739,0.4572,0.45701,0.45682,0.45663,0.45643,0.45624,0.45605,0.45586,0.45567,0.45548,0.45529,0.4551,0.45491,0.45472,0.45453,0.45434,0.45415,0.45396,0.45377,0.45358,0.45339,0.4532,0.45301,0.45282,0.45263,0.45244,0.45225,0.45207,0.45188,0.45169,0.4515,0.45131,0.45112,0.45093,0.45074,0.45055,0.45036,0.45017,0.44999,0.4498,0.44961,0.44942,0.44923,0.44904,0.44885,0.44867,0.44848,0.44829,0.4481,0.44791,0.44773,0.44754,0.44735,0.44716,0.44697,0.44679,0.4466,0.44641,0.44622,0.44604,0.44585,0.44566,0.44547,0.44529,0.4451,0.44491,0.44472,0.44454,0.44435,0.44416,0.44398,0.44379,0.4436,0.44342,0.44323,0.44304,0.44286,0.44267,0.44248,0.4423,0.44211,0.44192,0.44174,0.44155,0.44136,0.44118,0.44099,0.44081, +0.44062,0.44043,0.44025,0.44006,0.43988,0.43969,0.43951,0.43932,0.43913,0.43895,0.43876,0.43858,0.43839,0.43821,0.43802,0.43784,0.43765,0.43747,0.43728,0.4371,0.43691,0.43673,0.43654,0.43636,0.43617,0.43599,0.4358,0.43562,0.43544,0.43525,0.43507,0.43488,0.4347,0.43452,0.43433,0.43415,0.43396,0.43378,0.4336,0.43341,0.43323,0.43304,0.43286,0.43268,0.43249,0.43231,0.43213,0.43194,0.43176,0.43158,0.43139,0.43121,0.43103,0.43085,0.43066,0.43048,0.4303,0.43011,0.42993,0.42975,0.42957,0.42938,0.4292,0.42902,0.42884,0.42865,0.42847,0.42829,0.42811,0.42793,0.42774,0.42756,0.42738,0.4272,0.42702,0.42683,0.42665,0.42647,0.42629,0.42611,0.42593,0.42574,0.42556,0.42538,0.4252,0.42502,0.42484,0.42466,0.42448,0.4243,0.42411,0.42393,0.42375,0.42357,0.42339,0.42321,0.42303,0.42285,0.42267,0.42249}; \ No newline at end of file diff --git a/modules/calib3d/src/usac/homography_solver.cpp b/modules/calib3d/src/usac/homography_solver.cpp new file mode 100644 index 0000000..3579618 --- /dev/null +++ b/modules/calib3d/src/usac/homography_solver.cpp @@ -0,0 +1,445 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#include "../precomp.hpp" +#include "../usac.hpp" +#ifdef HAVE_EIGEN +#include +#endif + +namespace cv { namespace usac { +class HomographyMinimalSolver4ptsGEMImpl : public HomographyMinimalSolver4ptsGEM { +private: + const Mat * points_mat; + const float * const points; +public: + explicit HomographyMinimalSolver4ptsGEMImpl (const Mat &points_) : + points_mat(&points_), points ((float*) points_.data) {} + + int estimate (const std::vector& sample, std::vector &models) const override { + // OpenCV RHO: + const int smpl0 = 4*sample[0], smpl1 = 4*sample[1], smpl2 = 4*sample[2], smpl3 = 4*sample[3]; + const auto x0 = points[smpl0], y0 = points[smpl0+1], X0 = points[smpl0+2], Y0 = points[smpl0+3]; + const auto x1 = points[smpl1], y1 = points[smpl1+1], X1 = points[smpl1+2], Y1 = points[smpl1+3]; + const auto x2 = points[smpl2], y2 = points[smpl2+1], X2 = points[smpl2+2], Y2 = points[smpl2+3]; + const auto x3 = points[smpl3], y3 = points[smpl3+1], X3 = points[smpl3+2], Y3 = points[smpl3+3]; + const double x0X0 = x0*X0, x1X1 = x1*X1, x2X2 = x2*X2, x3X3 = x3*X3; + const double x0Y0 = x0*Y0, x1Y1 = x1*Y1, x2Y2 = x2*Y2, x3Y3 = x3*Y3; + const double y0X0 = y0*X0, y1X1 = y1*X1, y2X2 = y2*X2, y3X3 = y3*X3; + const double y0Y0 = y0*Y0, y1Y1 = y1*Y1, y2Y2 = y2*Y2, y3Y3 = y3*Y3; + + double minor[2][4] = {{x0-x2, x1-x2, x2, x3-x2}, + {y0-y2, y1-y2, y2, y3-y2}}; + + double major[3][8] = {{x2X2-x0X0, x2X2-x1X1, -x2X2, x2X2-x3X3, x2Y2-x0Y0, x2Y2-x1Y1, -x2Y2, x2Y2-x3Y3}, + {y2X2-y0X0, y2X2-y1X1, -y2X2, y2X2-y3X3, y2Y2-y0Y0, y2Y2-y1Y1, -y2Y2, y2Y2-y3Y3}, + {X0-X2 , X1-X2 , X2 , X3-X2 , Y0-Y2 , Y1-Y2 , Y2 , Y3-Y2 }}; + /** + * int i; + * for(i=0;i<8;i++) major[2][i]=-major[2][i]; + * Eliminate column 0 of rows 1 and 3 + * R(1)=(x0-x2)*R(1)-(x1-x2)*R(0), y1'=(y1-y2)(x0-x2)-(x1-x2)(y0-y2) + * R(3)=(x0-x2)*R(3)-(x3-x2)*R(0), y3'=(y3-y2)(x0-x2)-(x3-x2)(y0-y2) + */ + + double scalar1=minor[0][0], scalar2=minor[0][1]; + minor[1][1]=minor[1][1]*scalar1-minor[1][0]*scalar2; + + major[0][1]=major[0][1]*scalar1-major[0][0]*scalar2; + major[1][1]=major[1][1]*scalar1-major[1][0]*scalar2; + major[2][1]=major[2][1]*scalar1-major[2][0]*scalar2; + + major[0][5]=major[0][5]*scalar1-major[0][4]*scalar2; + major[1][5]=major[1][5]*scalar1-major[1][4]*scalar2; + major[2][5]=major[2][5]*scalar1-major[2][4]*scalar2; + + scalar2=minor[0][3]; + minor[1][3]=minor[1][3]*scalar1-minor[1][0]*scalar2; + + major[0][3]=major[0][3]*scalar1-major[0][0]*scalar2; + major[1][3]=major[1][3]*scalar1-major[1][0]*scalar2; + major[2][3]=major[2][3]*scalar1-major[2][0]*scalar2; + + major[0][7]=major[0][7]*scalar1-major[0][4]*scalar2; + major[1][7]=major[1][7]*scalar1-major[1][4]*scalar2; + major[2][7]=major[2][7]*scalar1-major[2][4]*scalar2; + + /** + * Eliminate column 1 of rows 0 and 3 + * R(3)=y1'*R(3)-y3'*R(1) + * R(0)=y1'*R(0)-(y0-y2)*R(1) + */ + + scalar1=minor[1][1];scalar2=minor[1][3]; + major[0][3]=major[0][3]*scalar1-major[0][1]*scalar2; + major[1][3]=major[1][3]*scalar1-major[1][1]*scalar2; + major[2][3]=major[2][3]*scalar1-major[2][1]*scalar2; + + major[0][7]=major[0][7]*scalar1-major[0][5]*scalar2; + major[1][7]=major[1][7]*scalar1-major[1][5]*scalar2; + major[2][7]=major[2][7]*scalar1-major[2][5]*scalar2; + + scalar2=minor[1][0]; + minor[0][0]=minor[0][0]*scalar1-minor[0][1]*scalar2; + + major[0][0]=major[0][0]*scalar1-major[0][1]*scalar2; + major[1][0]=major[1][0]*scalar1-major[1][1]*scalar2; + major[2][0]=major[2][0]*scalar1-major[2][1]*scalar2; + + major[0][4]=major[0][4]*scalar1-major[0][5]*scalar2; + major[1][4]=major[1][4]*scalar1-major[1][5]*scalar2; + major[2][4]=major[2][4]*scalar1-major[2][5]*scalar2; + + /** + * Eliminate columns 0 and 1 of row 2 + * R(0)/=x0' + * R(1)/=y1' + * R(2)-= (x2*R(0) + y2*R(1)) + */ + + scalar1=1.0f/minor[0][0]; + major[0][0]*=scalar1; + major[1][0]*=scalar1; + major[2][0]*=scalar1; + major[0][4]*=scalar1; + major[1][4]*=scalar1; + major[2][4]*=scalar1; + + scalar1=1.0f/minor[1][1]; + major[0][1]*=scalar1; + major[1][1]*=scalar1; + major[2][1]*=scalar1; + major[0][5]*=scalar1; + major[1][5]*=scalar1; + major[2][5]*=scalar1; + + scalar1=minor[0][2];scalar2=minor[1][2]; + major[0][2]-=major[0][0]*scalar1+major[0][1]*scalar2; + major[1][2]-=major[1][0]*scalar1+major[1][1]*scalar2; + major[2][2]-=major[2][0]*scalar1+major[2][1]*scalar2; + + major[0][6]-=major[0][4]*scalar1+major[0][5]*scalar2; + major[1][6]-=major[1][4]*scalar1+major[1][5]*scalar2; + major[2][6]-=major[2][4]*scalar1+major[2][5]*scalar2; + + /* Only major matters now. R(3) and R(7) correspond to the hollowed-out rows. */ + scalar1=major[0][7]; + major[1][7]/=scalar1; + major[2][7]/=scalar1; + const double m17 = major[1][7], m27 = major[2][7]; + scalar1=major[0][0];major[1][0]-=scalar1*m17;major[2][0]-=scalar1*m27; + scalar1=major[0][1];major[1][1]-=scalar1*m17;major[2][1]-=scalar1*m27; + scalar1=major[0][2];major[1][2]-=scalar1*m17;major[2][2]-=scalar1*m27; + scalar1=major[0][3];major[1][3]-=scalar1*m17;major[2][3]-=scalar1*m27; + scalar1=major[0][4];major[1][4]-=scalar1*m17;major[2][4]-=scalar1*m27; + scalar1=major[0][5];major[1][5]-=scalar1*m17;major[2][5]-=scalar1*m27; + scalar1=major[0][6];major[1][6]-=scalar1*m17;major[2][6]-=scalar1*m27; + + /* One column left (Two in fact, but the last one is the homography) */ + major[2][3]/=major[1][3]; + const double m23 = major[2][3]; + + major[2][0]-=major[1][0]*m23; + major[2][1]-=major[1][1]*m23; + major[2][2]-=major[1][2]*m23; + major[2][4]-=major[1][4]*m23; + major[2][5]-=major[1][5]*m23; + major[2][6]-=major[1][6]*m23; + major[2][7]-=major[1][7]*m23; + + // check if homography does not contain NaN values + for (int i = 0; i < 8; i++) + if (std::isnan(major[2][i])) return 0; + + /* Homography is done. */ + models = std::vector(1, Mat_(3,3)); + auto * H_ = (double *) models[0].data; + H_[0]=major[2][0]; + H_[1]=major[2][1]; + H_[2]=major[2][2]; + + H_[3]=major[2][4]; + H_[4]=major[2][5]; + H_[5]=major[2][6]; + + H_[6]=major[2][7]; + H_[7]=major[2][3]; + H_[8]=1.0; + + return 1; + } + + int getMaxNumberOfSolutions () const override { return 1; } + int getSampleSize() const override { return 4; } + Ptr clone () const override { + return makePtr(*points_mat); + } +}; +Ptr HomographyMinimalSolver4ptsGEM::create(const Mat &points_) { + return makePtr(points_); +} + +class HomographyNonMinimalSolverImpl : public HomographyNonMinimalSolver { +private: + const Mat * points_mat; + const Ptr normTr; +public: + explicit HomographyNonMinimalSolverImpl (const Mat &points_) : + points_mat(&points_), normTr (NormTransform::create(points_)) {} + + /* + * Find Homography matrix using (weighted) non-minimal estimation. + * Use Principal Component Analysis. Use normalized points. + */ + int estimate (const std::vector &sample, int sample_size, std::vector &models, + const std::vector &weights) const override { + if (sample_size < getMinimumRequiredSampleSize()) + return 0; + + Matx33d T1, T2; + Mat norm_points_; + normTr->getNormTransformation(norm_points_, sample, sample_size, T1, T2); + + /* + * @norm_points is matrix 4 x inlier_size + * @weights is vector of inliers_size + * weights[i] is weight of i-th inlier + */ + const auto * const norm_points = (float *) norm_points_.data; + + double a1[9] = {0, 0, -1, 0, 0, 0, 0, 0, 0}, + a2[9] = {0, 0, 0, 0, 0, -1, 0, 0, 0}, + AtA[81] = {0}; + + if (weights.empty()) { + for (int i = 0; i < sample_size; i++) { + const int smpl = 4*i; + const double x1 = norm_points[smpl ], y1 = norm_points[smpl+1], + x2 = norm_points[smpl+2], y2 = norm_points[smpl+3]; + + a1[0] = -x1; + a1[1] = -y1; + a1[6] = x2*x1; + a1[7] = x2*y1; + a1[8] = x2; + + a2[3] = -x1; + a2[4] = -y1; + a2[6] = y2*x1; + a2[7] = y2*y1; + a2[8] = y2; + + for (int j = 0; j < 9; j++) + for (int z = j; z < 9; z++) + AtA[j*9+z] += a1[j]*a1[z] + a2[j]*a2[z]; + } + } else { + for (int i = 0; i < sample_size; i++) { + const int smpl = 4*i; + const double weight = weights[i]; + const double x1 = norm_points[smpl ], y1 = norm_points[smpl+1], + x2 = norm_points[smpl+2], y2 = norm_points[smpl+3]; + const double minus_weight_times_x1 = -weight * x1, + minus_weight_times_y1 = -weight * y1, + weight_times_x2 = weight * x2, + weight_times_y2 = weight * y2; + + a1[0] = minus_weight_times_x1; + a1[1] = minus_weight_times_y1; + a1[2] = -weight; + a1[6] = weight_times_x2 * x1; + a1[7] = weight_times_x2 * y1; + a1[8] = weight_times_x2; + + a2[3] = minus_weight_times_x1; + a2[4] = minus_weight_times_y1; + a2[5] = -weight; + a2[6] = weight_times_y2 * x1; + a2[7] = weight_times_y2 * y1; + a2[8] = weight_times_y2; + + for (int j = 0; j < 9; j++) + for (int z = j; z < 9; z++) + AtA[j*9+z] += a1[j]*a1[z] + a2[j]*a2[z]; + } + } + + // copy symmetric part of covariance matrix + for (int j = 1; j < 9; j++) + for (int z = 0; z < j; z++) + AtA[j*9+z] = AtA[z*9+j]; + +#ifdef HAVE_EIGEN + Mat H = Mat_(3,3); + Eigen::HouseholderQR> qr((Eigen::Matrix (AtA))); + const Eigen::Matrix &Q = qr.householderQ(); + // extract the last nullspace + Eigen::Map>((double *)H.data) = Q.col(8); +#else + Matx Vt; + Vec D; + if (! eigen(Matx(AtA), D, Vt)) return 0; + Mat H = Mat(Vt.row(8).reshape<3,3>()); +#endif + + models = std::vector{ T2.inv() * H * T1 }; + return 1; + } + + int getMinimumRequiredSampleSize() const override { return 4; } + int getMaxNumberOfSolutions () const override { return 1; } + Ptr clone () const override { + return makePtr(*points_mat); + } +}; +Ptr HomographyNonMinimalSolver::create(const Mat &points_) { + return makePtr(points_); +} + +class AffineMinimalSolverImpl : public AffineMinimalSolver { +private: + const Mat * points_mat; + const float * const points; +public: + explicit AffineMinimalSolverImpl (const Mat &points_) : + points_mat(&points_), points((float *) points_.data) {} + /* + Affine transformation + x1 y1 1 0 0 0 a u1 + 0 0 0 x1 y1 1 b v1 + x2 y2 1 0 0 0 c u2 + 0 0 0 x2 y2 1 * d = v2 + x3 y3 1 0 0 0 e u3 + 0 0 0 x3 y3 1 f v3 + */ + int estimate (const std::vector &sample, std::vector &models) const override { + const int smpl1 = 4*sample[0], smpl2 = 4*sample[1], smpl3 = 4*sample[2]; + const auto + x1 = points[smpl1], y1 = points[smpl1+1], u1 = points[smpl1+2], v1 = points[smpl1+3], + x2 = points[smpl2], y2 = points[smpl2+1], u2 = points[smpl2+2], v2 = points[smpl2+3], + x3 = points[smpl3], y3 = points[smpl3+1], u3 = points[smpl3+2], v3 = points[smpl3+3]; + + // covers degeneracy test when all 3 points are collinear. + // In this case denominator will be 0 + double denominator = x1*y2 - x2*y1 - x1*y3 + x3*y1 + x2*y3 - x3*y2; + if (fabs(denominator) < FLT_EPSILON) // check if denominator is zero + return 0; + denominator = 1. / denominator; + + double a = (u1*y2 - u2*y1 - u1*y3 + u3*y1 + u2*y3 - u3*y2) * denominator; + double b = -(u1*x2 - u2*x1 - u1*x3 + u3*x1 + u2*x3 - u3*x2) * denominator; + double c = u1 - a * x1 - b * y1; // ax1 + by1 + c = u1 + double d = (v1*y2 - v2*y1 - v1*y3 + v3*y1 + v2*y3 - v3*y2) * denominator; + double e = -(v1*x2 - v2*x1 - v1*x3 + v3*x1 + v2*x3 - v3*x2) * denominator; + double f = v1 - d * x1 - e * y1; // dx1 + ey1 + f = v1 + + models[0] = Mat(Matx33d(a, b, c, d, e, f, 0, 0, 1)); + return 1; + } + int getSampleSize() const override { return 3; } + int getMaxNumberOfSolutions () const override { return 1; } + Ptr clone () const override { + return makePtr(*points_mat); + } +}; +Ptr AffineMinimalSolver::create(const Mat &points_) { + return makePtr(points_); +} + +class AffineNonMinimalSolverImpl : public AffineNonMinimalSolver { +private: + const Mat * points_mat; + const float * const points; + // const NormTransform norm_transform; +public: + explicit AffineNonMinimalSolverImpl (const Mat &points_) : + points_mat(&points_), points((float*) points_.data) + /*, norm_transform(points_)*/ {} + + int estimate (const std::vector &sample, int sample_size, std::vector &models, + const std::vector &weights) const override { + // surprisingly normalization of points does not improve the output model + // Mat norm_points_, T1, T2; + // norm_transform.getNormTransformation(norm_points_, sample, sample_size, T1, T2); + // const auto * const n_pts = (double *) norm_points_.data; + + if (sample_size < getMinimumRequiredSampleSize()) + return 0; + // do Least Squares + // Ax = b -> A^T Ax = A^T b + // x = (A^T A)^-1 A^T b + double AtA[36] = {0}, Ab[6] = {0}; + double r1[6] = {0, 0, 1, 0, 0, 0}; // row 1 of A + double r2[6] = {0, 0, 0, 0, 0, 1}; // row 2 of A + + if (weights.empty()) + for (int p = 0; p < sample_size; p++) { + // if (weights != nullptr) weight = weights[sample[p]]; + + const int smpl = 4*sample[p]; + const double x1=points[smpl], y1=points[smpl+1], x2=points[smpl+2], y2=points[smpl+3]; + // const double x1=n_pts[smpl], y1=n_pts[smpl+1], x2=n_pts[smpl+2], y2=n_pts[smpl+3]; + + r1[0] = x1; + r1[1] = y1; + + r2[3] = x1; + r2[4] = y1; + + for (int j = 0; j < 6; j++) { + for (int z = j; z < 6; z++) + AtA[j * 6 + z] += r1[j] * r1[z] + r2[j] * r2[z]; + Ab[j] += r1[j]*x2 + r2[j]*y2; + } + } + else + for (int p = 0; p < sample_size; p++) { + const int smpl = 4*sample[p]; + const double weight = weights[p]; + const double weight_times_x1 = weight * points[smpl ], + weight_times_y1 = weight * points[smpl+1], + weight_times_x2 = weight * points[smpl+2], + weight_times_y2 = weight * points[smpl+3]; + + r1[0] = weight_times_x1; + r1[1] = weight_times_y1; + r1[2] = weight; + + r2[3] = weight_times_x1; + r2[4] = weight_times_y1; + r2[5] = weight; + + for (int j = 0; j < 6; j++) { + for (int z = j; z < 6; z++) + AtA[j * 6 + z] += r1[j] * r1[z] + r2[j] * r2[z]; + Ab[j] += r1[j]*weight_times_x2 + r2[j]*weight_times_y2; + } + } + + // copy symmetric part + for (int j = 1; j < 6; j++) + for (int z = 0; z < j; z++) + AtA[j*6+z] = AtA[z*6+j]; + + Vec6d aff; + if (!solve(Matx66d(AtA), Vec6d(Ab), aff)) + return 0; + models[0] = Mat(Matx33d(aff(0), aff(1), aff(2), + aff(3), aff(4), aff(5), + 0, 0, 1)); + + // models[0] = T2.inv() * models[0] * T1; + return 1; + } + + int getMinimumRequiredSampleSize() const override { return 3; } + int getMaxNumberOfSolutions () const override { return 1; } + Ptr clone () const override { + return makePtr(*points_mat); + } +}; +Ptr AffineNonMinimalSolver::create(const Mat &points_) { + return makePtr(points_); +} +}} \ No newline at end of file diff --git a/modules/calib3d/src/usac/local_optimization.cpp b/modules/calib3d/src/usac/local_optimization.cpp new file mode 100644 index 0000000..f680337 --- /dev/null +++ b/modules/calib3d/src/usac/local_optimization.cpp @@ -0,0 +1,676 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#include "../precomp.hpp" +#include "../usac.hpp" +#include "opencv2/imgproc/detail/gcgraph.hpp" +#include "gamma_values.hpp" + +namespace cv { namespace usac { +class GraphCutImpl : public GraphCut { +protected: + const Ptr neighborhood_graph; + const Ptr estimator; + const Ptr quality; + const Ptr lo_sampler; + const Ptr error; + + int gc_sample_size, lo_inner_iterations, points_size; + double spatial_coherence, sqr_trunc_thr, one_minus_lambda; + + std::vector labeling_inliers; + std::vector energies, weights; + std::vector used_edges; + std::vector gc_models; +public: + + // In lo_sampler_ the sample size should be set and be equal gc_sample_size_ + GraphCutImpl (const Ptr &estimator_, const Ptr &error_, const Ptr &quality_, + const Ptr &neighborhood_graph_, const Ptr &lo_sampler_, + double threshold_, double spatial_coherence_term, int gc_inner_iteration_number_) : + neighborhood_graph (neighborhood_graph_), estimator (estimator_), quality (quality_), + lo_sampler (lo_sampler_), error (error_) { + + points_size = quality_->getPointsSize(); + spatial_coherence = spatial_coherence_term; + sqr_trunc_thr = threshold_ * 2.25; // threshold is already squared + gc_sample_size = lo_sampler_->getSubsetSize(); + lo_inner_iterations = gc_inner_iteration_number_; + one_minus_lambda = 1.0 - spatial_coherence; + + energies = std::vector(points_size); + labeling_inliers = std::vector(points_size); + used_edges = std::vector(points_size*points_size); + gc_models = std::vector (estimator->getMaxNumSolutionsNonMinimal()); + } + + bool refineModel (const Mat &best_model, const Score &best_model_score, + Mat &new_model, Score &new_model_score) override { + if (best_model_score.inlier_number < gc_sample_size) + return false; + + // improve best model by non minimal estimation + new_model_score = Score(); // set score to inf (worst case) + best_model.copyTo(new_model); + + bool is_best_model_updated = true; + while (is_best_model_updated) { + is_best_model_updated = false; + + // Build graph problem. Apply graph cut to G + int labeling_inliers_size = labeling(new_model); + for (int iter = 0; iter < lo_inner_iterations; iter++) { + // sample to generate min (|I_7m|, |I|) + int num_of_estimated_models; + if (labeling_inliers_size > gc_sample_size) { + // generate random subset in range <0; |I|> + num_of_estimated_models = estimator->estimateModelNonMinimalSample + (lo_sampler->generateUniqueRandomSubset(labeling_inliers, + labeling_inliers_size), gc_sample_size, gc_models, weights); + } else { + if (iter > 0) + break; // break inliers are not updated + num_of_estimated_models = estimator->estimateModelNonMinimalSample + (labeling_inliers, labeling_inliers_size, gc_models, weights); + } + if (num_of_estimated_models == 0) + break; + + bool zero_inliers = false; + for (int model_idx = 0; model_idx < num_of_estimated_models; model_idx++) { + Score gc_temp_score = quality->getScore(gc_models[model_idx]); + if (gc_temp_score.inlier_number == 0){ + zero_inliers = true; break; + } + + if (best_model_score.isBetter(gc_temp_score)) + continue; + + // store the best model from estimated models + if (gc_temp_score.isBetter(new_model_score)) { + is_best_model_updated = true; + new_model_score = gc_temp_score; + gc_models[model_idx].copyTo(new_model); + } + } + + if (zero_inliers) + break; + } // end of inner GC local optimization + } // end of while loop + + return true; + } + +private: + // find inliers using graph cut algorithm. + int labeling (const Mat& model) { + const auto &errors = error->getErrors(model); + + detail::GCGraph graph; + + for (int pt = 0; pt < points_size; pt++) + graph.addVtx(); + + // The distance and energy for each point + double tmp_squared_distance, energy; + + // Estimate the vertex capacities + for (int pt = 0; pt < points_size; pt++) { + tmp_squared_distance = errors[pt]; + if (std::isnan(tmp_squared_distance)) { + energies[pt] = std::numeric_limits::max(); + continue; + } + energy = tmp_squared_distance / sqr_trunc_thr; // Truncated quadratic cost + + if (tmp_squared_distance <= sqr_trunc_thr) + graph.addTermWeights(pt, 0, one_minus_lambda * (1 - energy)); + else + graph.addTermWeights(pt, one_minus_lambda * energy, 0); + + if (energy > 1) energy = 1; + energies[pt] = energy; + } + + std::fill(used_edges.begin(), used_edges.end(), false); + + // Iterate through all points and set their edges + for (int point_idx = 0; point_idx < points_size; ++point_idx) { + energy = energies[point_idx]; + + // Iterate through all neighbors + for (int actual_neighbor_idx : neighborhood_graph->getNeighbors(point_idx)) { + if (actual_neighbor_idx == point_idx || + used_edges[actual_neighbor_idx*points_size + point_idx] || + used_edges[point_idx*points_size + actual_neighbor_idx]) + continue; + + used_edges[actual_neighbor_idx*points_size + point_idx] = true; + used_edges[point_idx*points_size + actual_neighbor_idx] = true; + + double a = (0.5 * (energy + energies[actual_neighbor_idx])) * spatial_coherence, + b = spatial_coherence, c = spatial_coherence, d = 0; + graph.addTermWeights(point_idx, d, a); + b -= a; + if (b + c >= 0) + // Non-submodular expansion term detected; smooth costs must be a metric for expansion + continue; + if (b < 0) { + graph.addTermWeights(point_idx, 0, b); + graph.addTermWeights(actual_neighbor_idx, 0, -b); + graph.addEdges(point_idx, actual_neighbor_idx, 0, b + c); + } else if (c < 0) { + graph.addTermWeights(point_idx, 0, -c); + graph.addTermWeights(actual_neighbor_idx, 0, c); + graph.addEdges(point_idx, actual_neighbor_idx, b + c, 0); + } else + graph.addEdges(point_idx, actual_neighbor_idx, b, c); + } + } + + graph.maxFlow(); + + int inlier_number = 0; + for (int pt = 0; pt < points_size; pt++) + if (! graph.inSourceSegment(pt)) // check for sink + labeling_inliers[inlier_number++] = pt; + return inlier_number; + } + Ptr clone(int state) const override { + return makePtr(estimator->clone(), error->clone(), quality->clone(), + neighborhood_graph,lo_sampler->clone(state), sqrt(sqr_trunc_thr / 2), + spatial_coherence, lo_inner_iterations); + } +}; +Ptr GraphCut::create(const Ptr &estimator_, const Ptr &error_, + const Ptr &quality_, const Ptr &neighborhood_graph_, + const Ptr &lo_sampler_, double threshold_, + double spatial_coherence_term, int gc_inner_iteration_number) { + return makePtr(estimator_, error_, quality_, neighborhood_graph_, lo_sampler_, + threshold_, spatial_coherence_term, gc_inner_iteration_number); +} + +/* +* http://cmp.felk.cvut.cz/~matas/papers/chum-dagm03.pdf +*/ +class InnerIterativeLocalOptimizationImpl : public InnerIterativeLocalOptimization { +private: + const Ptr estimator; + const Ptr quality; + const Ptr lo_sampler; + Ptr lo_iter_sampler; + + std::vector lo_models, lo_iter_models; + + std::vector inliers_of_best_model, virtual_inliers; + int lo_inner_max_iterations, lo_iter_max_iterations, lo_sample_size, lo_iter_sample_size; + + bool is_iterative; + + double threshold, new_threshold, threshold_step; + std::vector weights; +public: + + InnerIterativeLocalOptimizationImpl (const Ptr &estimator_, const Ptr &quality_, + const Ptr &lo_sampler_, int pts_size, + double threshold_, bool is_iterative_, int lo_iter_sample_size_, + int lo_inner_iterations_=10, int lo_iter_max_iterations_=5, + double threshold_multiplier_=4) : estimator (estimator_), quality (quality_), + lo_sampler (lo_sampler_) { + + lo_inner_max_iterations = lo_inner_iterations_; + lo_iter_max_iterations = lo_iter_max_iterations_; + + threshold = threshold_; + + lo_sample_size = lo_sampler->getSubsetSize(); + + is_iterative = is_iterative_; + if (is_iterative) { + lo_iter_sample_size = lo_iter_sample_size_; + lo_iter_sampler = UniformRandomGenerator::create(0/*state*/, pts_size, lo_iter_sample_size_); + lo_iter_models = std::vector(estimator->getMaxNumSolutionsNonMinimal()); + virtual_inliers = std::vector(pts_size); + new_threshold = threshold_multiplier_ * threshold; + // reduce multiplier threshold K·θ by this number in each iteration. + // In the last iteration there be original threshold θ. + threshold_step = (new_threshold - threshold) / lo_iter_max_iterations_; + } + + lo_models = std::vector(estimator->getMaxNumSolutionsNonMinimal()); + + // Allocate max memory to avoid reallocation + inliers_of_best_model = std::vector(pts_size); + } + + /* + * Implementation of Locally Optimized Ransac + * Inner + Iterative + */ + bool refineModel (const Mat &so_far_the_best_model, const Score &best_model_score, + Mat &new_model, Score &new_model_score) override { + if (best_model_score.inlier_number < lo_sample_size) + return false; + + so_far_the_best_model.copyTo(new_model); + new_model_score = best_model_score; + + // get inliers from so far the best model. + int num_inliers_of_best_model = quality->getInliers(so_far_the_best_model, + inliers_of_best_model); + + // Inner Local Optimization Ransac. + for (int iters = 0; iters < lo_inner_max_iterations; iters++) { + int num_estimated_models; + // Generate sample of lo_sample_size from inliers from the best model. + if (num_inliers_of_best_model > lo_sample_size) { + // if there are many inliers take limited number at random. + num_estimated_models = estimator->estimateModelNonMinimalSample + (lo_sampler->generateUniqueRandomSubset(inliers_of_best_model, + num_inliers_of_best_model), lo_sample_size, lo_models, weights); + if (num_estimated_models == 0) continue; + } else { + // if model was not updated in first iteration, so break. + if (iters > 0) break; + // if inliers are less than limited number of sample then take all for estimation + // if it fails -> end Lo. + num_estimated_models = estimator->estimateModelNonMinimalSample + (inliers_of_best_model, num_inliers_of_best_model, lo_models, weights); + if (num_estimated_models == 0) return false; + } + + //////// Choose the best lo_model from estimated lo_models. + for (int model_idx = 0; model_idx < num_estimated_models; model_idx++) { + Score temp_score = quality->getScore(lo_models[model_idx]); + if (temp_score.isBetter(new_model_score)) { + new_model_score = temp_score; + lo_models[model_idx].copyTo(new_model); + } + } + + if (is_iterative) { + double lo_threshold = new_threshold; + // get max virtual inliers. Note that they are nor real inliers, + // because we got them with bigger threshold. + int virtual_inliers_size = quality->getInliers + (new_model, virtual_inliers, lo_threshold); + + Mat lo_iter_model; + Score lo_iter_score = Score(); // set worst case + for (int iterations = 0; iterations < lo_iter_max_iterations; iterations++) { + lo_threshold -= threshold_step; + + if (virtual_inliers_size > lo_iter_sample_size) { + // if there are more inliers than limit for sample size then generate at random + // sample from LO model. + num_estimated_models = estimator->estimateModelNonMinimalSample + (lo_iter_sampler->generateUniqueRandomSubset (virtual_inliers, + virtual_inliers_size), lo_iter_sample_size, lo_iter_models, weights); + } else { + // break if failed, very low probability that it will not fail in next iterations + // estimate model with all virtual inliers + num_estimated_models = estimator->estimateModelNonMinimalSample + (virtual_inliers, virtual_inliers_size, lo_iter_models, weights); + } + if (num_estimated_models == 0) break; + + // Get score and update virtual inliers with current threshold + //////// Choose the best lo_iter_model from estimated lo_iter_models. + lo_iter_models[0].copyTo(lo_iter_model); + lo_iter_score = quality->getScore(lo_iter_model); + for (int model_idx = 1; model_idx < num_estimated_models; model_idx++) { + Score temp_score = quality->getScore(lo_iter_models[model_idx]); + if (temp_score.isBetter(lo_iter_score)) { + lo_iter_score = temp_score; + lo_iter_models[model_idx].copyTo(lo_iter_model); + } + } + + virtual_inliers_size = quality->getInliers(lo_iter_model, virtual_inliers, lo_threshold); + } + if (fabs (lo_threshold - threshold) < FLT_EPSILON) { + // Success, threshold does not differ + // last score correspond to user-defined threshold. Inliers are real. + if (lo_iter_score.isBetter(new_model_score)) { + new_model_score = lo_iter_score; + lo_iter_model.copyTo(new_model); + } + } + } + + if (num_inliers_of_best_model < new_model_score.inlier_number && iters != lo_inner_max_iterations-1) + num_inliers_of_best_model = quality->getInliers (new_model, inliers_of_best_model); + } + return true; + } + Ptr clone(int state) const override { + return makePtr(estimator->clone(), quality->clone(), + lo_sampler->clone(state),(int)inliers_of_best_model.size(), threshold, is_iterative, + lo_iter_sample_size, lo_inner_max_iterations, lo_iter_max_iterations, + new_threshold / threshold); + } +}; +Ptr InnerIterativeLocalOptimization::create +(const Ptr &estimator_, const Ptr &quality_, + const Ptr &lo_sampler_, int pts_size, + double threshold_, bool is_iterative_, int lo_iter_sample_size_, + int lo_inner_iterations_, int lo_iter_max_iterations_, + double threshold_multiplier_) { + return makePtr(estimator_, quality_, lo_sampler_, + pts_size, threshold_, is_iterative_, lo_iter_sample_size_, + lo_inner_iterations_, lo_iter_max_iterations_, threshold_multiplier_); +} + +class SigmaConsensusImpl : public SigmaConsensus { +private: + const Ptr estimator; + const Ptr quality; + const Ptr error; + const Ptr verifier; + // The degrees of freedom of the data from which the model is estimated. + // E.g., for models coming from point correspondences (x1,y1,x2,y2), it is 4. + const int degrees_of_freedom; + // A 0.99 quantile of the Chi^2-distribution to convert sigma values to residuals + const double k; + // Calculating (DoF - 1) / 2 which will be used for the estimation and, + // due to being constant, it is better to calculate it a priori. + double dof_minus_one_per_two; + const double C; + // The size of a minimal sample used for the estimation + const int sample_size; + // Calculating 2^(DoF - 1) which will be used for the estimation and, + // due to being constant, it is better to calculate it a priori. + double two_ad_dof; + // Calculating C * 2^(DoF - 1) which will be used for the estimation and, + // due to being constant, it is better to calculate it a priori. + double C_times_two_ad_dof; + // Calculating the gamma value of (DoF - 1) / 2 which will be used for the estimation and, + // due to being constant, it is better to calculate it a priori. + double gamma_value, squared_sigma_max_2, one_over_sigma; + // Calculating the upper incomplete gamma value of (DoF - 1) / 2 with k^2 / 2. + const double gamma_k; + // Calculating the lower incomplete gamma value of (DoF - 1) / 2 which will be used for the estimation and, + // due to being constant, it is better to calculate it a priori. + double gamma_difference; + const int points_size, number_of_irwls_iters; + const double maximum_threshold, max_sigma; + + std::vector residuals, sigma_weights, stored_gamma_values; + std::vector residuals_idxs; + // Models fit by weighted least-squares fitting + std::vector sigma_models; + // Points used in the weighted least-squares fitting + std::vector sigma_inliers; + // Weights used in the the weighted least-squares fitting + int max_lo_sample_size; + double scale_of_stored_gammas; + RNG rng; +public: + + SigmaConsensusImpl (const Ptr &estimator_, const Ptr &error_, + const Ptr &quality_, const Ptr &verifier_, + int max_lo_sample_size_, int number_of_irwls_iters_, int DoF, + double sigma_quantile, double upper_incomplete_of_sigma_quantile, double C_, + double maximum_thr) : estimator (estimator_), quality(quality_), + error (error_), verifier(verifier_), degrees_of_freedom(DoF), + k (sigma_quantile), C(C_), sample_size(estimator_->getMinimalSampleSize()), + gamma_k (upper_incomplete_of_sigma_quantile), points_size (quality_->getPointsSize()), + number_of_irwls_iters (number_of_irwls_iters_), + maximum_threshold(maximum_thr), max_sigma (maximum_thr) { + + dof_minus_one_per_two = (degrees_of_freedom - 1.0) / 2.0; + two_ad_dof = std::pow(2.0, dof_minus_one_per_two); + C_times_two_ad_dof = C * two_ad_dof; + gamma_value = tgamma(dof_minus_one_per_two); + gamma_difference = gamma_value - gamma_k; + // Calculate 2 * \sigma_{max}^2 a priori + squared_sigma_max_2 = max_sigma * max_sigma * 2.0; + // Divide C * 2^(DoF - 1) by \sigma_{max} a priori + one_over_sigma = C_times_two_ad_dof / max_sigma; + + residuals = std::vector(points_size); + residuals_idxs = std::vector(points_size); + sigma_inliers = std::vector(points_size); + max_lo_sample_size = max_lo_sample_size_; + sigma_weights = std::vector(points_size); + sigma_models = std::vector(estimator->getMaxNumSolutionsNonMinimal()); + + if (DoF == 4) { + scale_of_stored_gammas = scale_of_stored_gammas_n4; + stored_gamma_values = std::vector(stored_gamma_values_n4, + stored_gamma_values_n4+stored_gamma_number+1); + } else if (DoF == 5) { + scale_of_stored_gammas = scale_of_stored_gammas_n5; + stored_gamma_values = std::vector(stored_gamma_values_n5, + stored_gamma_values_n5+stored_gamma_number+1); + } else + CV_Error(cv::Error::StsNotImplemented, "Sigma values are not generated"); + } + + // https://github.com/danini/magsac + bool refineModel (const Mat &in_model, const Score &in_model_score, + Mat &new_model, Score &new_model_score) override { + int residual_cnt = 0; + + if (verifier->isModelGood(in_model)) { + if (verifier->hasErrors()) { + const std::vector &errors = verifier->getErrors(); + for (int point_idx = 0; point_idx < points_size; ++point_idx) { + // Calculate the residual of the current point + const auto residual = sqrtf(errors[point_idx]); + if (max_sigma > residual) { + // Store the residual of the current point and its index + residuals[residual_cnt] = residual; + residuals_idxs[residual_cnt++] = point_idx; + } + + // Interrupt if there is no chance of being better + if (residual_cnt + points_size - point_idx < in_model_score.inlier_number) + return false; + } + } else { + error->setModelParameters(in_model); + + for (int point_idx = 0; point_idx < points_size; ++point_idx) { + const double residual = sqrtf(error->getError(point_idx)); + if (max_sigma > residual) { + // Store the residual of the current point and its index + residuals[residual_cnt] = residual; + residuals_idxs[residual_cnt++] = point_idx; + } + + if (residual_cnt + points_size - point_idx < in_model_score.inlier_number) + return false; + } + } + } else return false; + + // Initialize the polished model with the initial one + Mat polished_model; + in_model.copyTo(polished_model); + // A flag to determine if the initial model has been updated + bool updated = false; + + // Do the iteratively re-weighted least squares fitting + for (int iterations = 0; iterations < number_of_irwls_iters; ++iterations) { + int sigma_inliers_cnt = 0; + // If the current iteration is not the first, the set of possibly inliers + // (i.e., points closer than the maximum threshold) have to be recalculated. + if (iterations > 0) { + error->setModelParameters(polished_model); + // Remove everything from the residual vector + residual_cnt = 0; + + // Collect the points which are closer than the maximum threshold + for (int point_idx = 0; point_idx < points_size; ++point_idx) { + // Calculate the residual of the current point + const double residual = error->getError(point_idx); + if (residual < max_sigma) { + // Store the residual of the current point and its index + residuals[residual_cnt] = residual; + residuals_idxs[residual_cnt++] = point_idx; + } + } + sigma_inliers_cnt = 0; + } + + // Calculate the weight of each point + for (int i = 0; i < residual_cnt; i++) { + const double residual = residuals[i]; + const int idx = residuals_idxs[i]; + // If the residual is ~0, the point fits perfectly and it is handled differently + if (residual > std::numeric_limits::epsilon()) { + // Calculate the squared residual + const double squared_residual = residual * residual; + // Get the position of the gamma value in the lookup table + int x = (int)round(scale_of_stored_gammas * squared_residual + / squared_sigma_max_2); + + // If the sought gamma value is not stored in the lookup, return the closest element + if (x >= stored_gamma_number || x < 0 /*overflow*/) // actual number of gamma values is 1 more, so >= + x = stored_gamma_number; + + sigma_inliers[sigma_inliers_cnt] = idx; // store index of point for LSQ + sigma_weights[sigma_inliers_cnt++] = one_over_sigma * (stored_gamma_values[x] - gamma_k); + } + } + + if (sigma_inliers_cnt > max_lo_sample_size) + for (int i = sigma_inliers_cnt-1; i > 0; i--) { + const int idx = rng.uniform(0, i+1); + std::swap(sigma_inliers[i], sigma_inliers[idx]); + std::swap(sigma_weights[i], sigma_weights[idx]); + } + int num_est_models = estimator->estimateModelNonMinimalSample + (sigma_inliers, std::min(max_lo_sample_size, sigma_inliers_cnt), + sigma_models, sigma_weights); + + // If there are fewer than the minimum point close to the model, terminate. + // Estimate the model parameters using weighted least-squares fitting + if (num_est_models == 0) { + // If the estimation failed and the iteration was never successfull, + // terminate with failure. + if (iterations == 0) + return false; + // Otherwise, if the iteration was successfull at least one, + // simply break it. + break; + } + + // Update the model parameters + polished_model = sigma_models[0]; + if (num_est_models > 1) { + // find best over other models + Score sigma_best_score = quality->getScore(polished_model); + for (int m = 1; m < num_est_models; m++) { + Score sc = quality->getScore(sigma_models[m]); + if (sc.isBetter(sigma_best_score)) { + polished_model = sigma_models[m]; + sigma_best_score = sc; + } + } + } + + // The model has been updated + updated = true; + } + + if (updated) { + new_model_score = quality->getScore(polished_model); + new_model = polished_model; + return true; + } + return false; + } + Ptr clone(int state) const override { + return makePtr(estimator->clone(), error->clone(), quality->clone(), + verifier->clone(state), max_lo_sample_size, number_of_irwls_iters, + degrees_of_freedom, k, gamma_k, C, maximum_threshold); + } +}; +Ptr +SigmaConsensus::create(const Ptr &estimator_, const Ptr &error_, + const Ptr &quality, const Ptr &verifier_, + int max_lo_sample_size, int number_of_irwls_iters_, int DoF, + double sigma_quantile, double upper_incomplete_of_sigma_quantile, double C_, + double maximum_thr) { + return makePtr(estimator_, error_, quality, verifier_, max_lo_sample_size, + number_of_irwls_iters_, DoF, sigma_quantile, upper_incomplete_of_sigma_quantile, + C_, maximum_thr); +} + +/////////////////////////////////////////// FINAL MODEL POLISHER //////////////////////// +class LeastSquaresPolishingImpl : public LeastSquaresPolishing { +private: + const Ptr estimator; + const Ptr quality; + Score score; + int lsq_iterations; + std::vector inliers; + std::vector models; + std::vector weights; +public: + + LeastSquaresPolishingImpl(const Ptr &estimator_, const Ptr &quality_, + int lsq_iterations_) : + estimator(estimator_), quality(quality_) { + lsq_iterations = lsq_iterations_; + // allocate memory for inliers array and models + inliers = std::vector(quality_->getPointsSize()); + models = std::vector(estimator->getMaxNumSolutionsNonMinimal()); + } + + bool polishSoFarTheBestModel(const Mat &model, const Score &best_model_score, + Mat &new_model, Score &out_score) override { + // get inliers from input model + int inlier_number = quality->getInliers(model, inliers); + if (inlier_number < estimator->getMinimalSampleSize()) + return false; + + out_score = Score(); // set the worst case + + // several all-inlier least-squares refines model better than only one but for + // big amount of points may be too time-consuming. + for (int lsq_iter = 0; lsq_iter < lsq_iterations; lsq_iter++) { + bool model_updated = false; + + // estimate non minimal models with all inliers + const int num_models = estimator->estimateModelNonMinimalSample(inliers, + inlier_number, models, weights); + for (int model_idx = 0; model_idx < num_models; model_idx++) { + score = quality->getScore(models[model_idx]); + + if (best_model_score.isBetter(score)) + continue; + if (score.isBetter(out_score)) { + models[model_idx].copyTo(new_model); + out_score = score; + model_updated = true; + } + } + + if (!model_updated) + // if model was not updated at the first iteration then return false + // otherwise if all-inliers LSQ has not updated model then no sense + // to do it again -> return true (model was updated before). + return lsq_iter > 0; + + // if number of inliers doesn't increase more than 5% then break + if (fabs(static_cast(out_score.inlier_number) - static_cast + (best_model_score.inlier_number)) / best_model_score.inlier_number < 0.05) + return true; + + if (lsq_iter != lsq_iterations - 1) + // if not the last LSQ normalization then get inliers for next normalization + inlier_number = quality->getInliers(new_model, inliers); + } + return true; + } +}; +Ptr LeastSquaresPolishing::create (const Ptr &estimator_, + const Ptr &quality_, int lsq_iterations_) { + return makePtr(estimator_, quality_, lsq_iterations_); +} +}} diff --git a/modules/calib3d/src/usac/pnp_solver.cpp b/modules/calib3d/src/usac/pnp_solver.cpp new file mode 100644 index 0000000..99f344c --- /dev/null +++ b/modules/calib3d/src/usac/pnp_solver.cpp @@ -0,0 +1,377 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#include "../precomp.hpp" +#include "../usac.hpp" +#include "../polynom_solver.h" +#if defined(HAVE_EIGEN) +#include +#include +#elif defined(HAVE_LAPACK) +#include "opencv_lapack.h" +#endif + +namespace cv { namespace usac { +class PnPMinimalSolver6PtsImpl : public PnPMinimalSolver6Pts { +private: + const Mat * points_mat; + const float * const points; +public: + // linear 6 points required (11 equations) + int getSampleSize() const override { return 6; } + int getMaxNumberOfSolutions () const override { return 1; } + + explicit PnPMinimalSolver6PtsImpl (const Mat &points_) : + points_mat(&points_), points ((float*)points_.data) {} + /* + DLT: + d x = P X, x = (u, v, 1), X = (X, Y, Z, 1), P = K[R t] + is 3x4 projection matrix with rows p1, p2, p3. d is depth + + u = p1^T X / p3^T X + v = p2^T X / p3^T X + + (p1^T - u p3^T) X = 0 + (p2^T - v p3^T) X = 0 + + (p11 - u p31) X + (p12 - u p32) Y + (p13 - u p33) Z + (p14 - u p34) = 0 + (p12 - v p31) X + (p22 - v p32) Y + (p23 - v p33) Z + (p24 - v p34) = 0 + + [X, Y, Z, 1, 0, 0, 0, 0, -u X, -u Y, -u Z, -u] [p11] [0] + [0, 0, 0, 0, X, Y, Z, 1, -v X, -v Y, -v Z, -v] [p12] [0] + . = [0] + . + . [p34] [0] + + minimum 11 equations, each point gives 2 equation, so at least 6 points are required. + + @points is array Nx5 + u1 v1 X1 Y1 Z1 + ... + uN vN XN YN ZN + @P is output projection matrix + + A1 = + [X1, Y1, Z1, 1, 0, 0, 0, 0, -u1 X1, -u1 Y1, -u1 Z1, -u1] [p11] [0] + [X2, Y2, Z2, 1, 0, 0, 0, 0, -u2 X2, -u2 Y2, -u2 Z2, -u2] [p12] [0] + [X3, Y3, Z3, 1, 0, 0, 0, 0, -u3 X3, -u3 Y3, -u3 Z3, -u3] [p13] [0] + [X4, Y4, Z4, 1, 0, 0, 0, 0, -u4 X4, -u4 Y4, -u4 Z4, -u4] [p14] [0] + [X5, Y5, Z5, 1, 0, 0, 0, 0, -u5 X5, -u5 Y5, -u5 Z5, -u5] [p21] [0] + [p22] + A2 = (without first 4 columns) + [0, 0, 0, 0, X1, Y1, Z1, 1, -v1 X1, -v1 Y1, -v1 Z1, -v1] [p23] = [0] + [0, 0, 0, 0, X2, Y2, Z2, 1, -v2 X2, -v2 Y2, -v2 Z2, -v2] [p24] [0] + [0, 0, 0, 0, X3, Y3, Z3, 1, -v3 X3, -v3 Y3, -v3 Z3, -v3] [p31] [0] + [0, 0, 0, 0, X4, Y4, Z4, 1, -v4 X4, -v4 Y4, -v4 Z4, -v4] [p32] [0] + [0, 0, 0, 0, X5, Y5, Z5, 1, -v5 X5, -v5 Y5, -v5 Z5, -v5] [p33] [0] + [0, 0, 0, 0, X6, Y6, Z6, 1, -v6 X6, -v6 Y6, -v6 Z6, -v6] [p34=1] [0] + + P = null A; dim null A = n - rank(A) = 12 - 11 = 1 + */ + + int estimate (const std::vector &sample, std::vector &models) const override { + std::vector A1 (5*12, 0), A2(7*8, 0); + + int cnt1 = 0, cnt2 = 0; + for (int i = 0; i < 6; i++) { + const int smpl = 5 * sample[i]; + const double u = points[smpl ], v = points[smpl + 1]; + const double X = points[smpl + 2], Y = points[smpl + 3], Z = points[smpl + 4]; + + if (i != 5) { + A1[cnt1++] = X; + A1[cnt1++] = Y; + A1[cnt1++] = Z; + A1[cnt1++] = 1; + cnt1 += 4; // skip zeros + A1[cnt1++] = -u * X; + A1[cnt1++] = -u * Y; + A1[cnt1++] = -u * Z; + A1[cnt1++] = -u; + } + + A2[cnt2++] = X; + A2[cnt2++] = Y; + A2[cnt2++] = Z; + A2[cnt2++] = 1; + A2[cnt2++] = -v * X; + A2[cnt2++] = -v * Y; + A2[cnt2++] = -v * Z; + A2[cnt2++] = -v; + } + Math::eliminateUpperTriangular(A1, 5, 12); + + int offset = 4*12; + // add last eliminated row of A1 + for (int i = 0; i < 8; i++) + A2[cnt2++] = A1[offset + i + 4/* skip 4 first cols*/]; + + Math::eliminateUpperTriangular(A2, 7, 8); + // fixed scale to 1. In general the projection matrix is up-to-scale. + // P = alpha * P^, alpha = 1 / P^_[3,4] + + Mat P = Mat_(3,4); + auto * p = (double *) P.data; + p[11] = 1; + + // start from the last row + for (int i = 6; i >= 0; i--) { + double acc = 0; + for (int j = i+1; j < 8; j++) + acc -= A2[i*8+j]*p[j+4]; + + p[i+4] = acc / A2[i*8+i]; + // due to numerical errors return 0 solutions + if (std::isnan(p[i+4])) + return 0; + } + + for (int i = 3; i >= 0; i--) { + double acc = 0; + for (int j = i+1; j < 12; j++) + acc -= A1[i*12+j]*p[j]; + + p[i] = acc / A1[i*12+i]; + if (std::isnan(p[i])) + return 0; + } + + models = std::vector{P}; + return 1; + } + Ptr clone () const override { + return makePtr(*points_mat); + } +}; +Ptr PnPMinimalSolver6Pts::create(const Mat &points_) { + return makePtr(points_); +} + +class PnPNonMinimalSolverImpl : public PnPNonMinimalSolver { +private: + const Mat * points_mat; + const float * const points; +public: + explicit PnPNonMinimalSolverImpl (const Mat &points_) : + points_mat(&points_), points ((float*)points_.data){} + + int estimate (const std::vector &sample, int sample_size, + std::vector &models, const std::vector &weights) const override { + if (sample_size < 6) + return 0; + + double AtA [144] = {0}; // 12x12 + double a1[12] = {0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0}, + a2[12] = {0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0}; + + if (weights.empty()) + for (int i = 0; i < sample_size; i++) { + const int smpl = 5 * sample[i]; + const double u = points[smpl], v = points[smpl + 1]; + const double X = points[smpl + 2], Y = points[smpl + 3], Z = points[smpl + 4]; + + a1[0 ] = -X; + a1[1 ] = -Y; + a1[2 ] = -Z; + a1[8 ] = u * X; + a1[9 ] = u * Y; + a1[10] = u * Z; + a1[11] = u; + + a2[4 ] = -X; + a2[5 ] = -Y; + a2[6 ] = -Z; + a2[8 ] = v * X; + a2[9 ] = v * Y; + a2[10] = v * Z; + a2[11] = v; + + // fill covarinace matrix + for (int j = 0; j < 12; j++) + for (int z = j; z < 12; z++) + AtA[j * 12 + z] += a1[j] * a1[z] + a2[j] * a2[z]; + } + else + for (int i = 0; i < sample_size; i++) { + const int smpl = 5 * sample[i]; + const double weight = weights[i], u = points[smpl], v = points[smpl + 1]; + const double weight_X = weight * points[smpl + 2], + weight_Y = weight * points[smpl + 3], + weight_Z = weight * points[smpl + 4]; + + a1[0 ] = -weight_X; + a1[1 ] = -weight_Y; + a1[2 ] = -weight_Z; + a1[3 ] = -weight; + a1[8 ] = u * weight_X; + a1[9 ] = u * weight_Y; + a1[10] = u * weight_Z; + a1[11] = u * weight; + + a2[4 ] = -weight_X; + a2[5 ] = -weight_Y; + a2[6 ] = -weight_Z; + a2[7 ] = -weight; + a2[8 ] = v * weight_X; + a2[9 ] = v * weight_Y; + a2[10] = v * weight_Z; + a2[11] = v * weight; + + // fill covarinace matrix + for (int j = 0; j < 12; j++) + for (int z = j; z < 12; z++) + AtA[j * 12 + z] += a1[j] * a1[z] + a2[j] * a2[z]; + } + + // copy symmetric part of covariance matrix + for (int j = 1; j < 12; j++) + for (int z = 0; z < j; z++) + AtA[j*12+z] = AtA[z*12+j]; + +#ifdef HAVE_EIGEN + models = std::vector{ Mat_(3,4) }; + Eigen::HouseholderQR> qr((Eigen::Matrix(AtA))); + const Eigen::Matrix &Q = qr.householderQ(); + // extract the last nullspace + Eigen::Map>((double *)models[0].data) = Q.col(11); +#else + Matx Vt; + Vec D; + if (! eigen(Matx(AtA), D, Vt)) return 0; + models = std::vector{ Mat(Vt.row(11).reshape<3,4>()) }; +#endif + return 1; + } + + int getMinimumRequiredSampleSize() const override { return 6; } + int getMaxNumberOfSolutions () const override { return 1; } + Ptr clone () const override { + return makePtr(*points_mat); + } +}; +Ptr PnPNonMinimalSolver::create(const Mat &points) { + return makePtr(points); +} + +class P3PSolverImpl : public P3PSolver { +private: + /* + * calibrated normalized points + * K^-1 [u v 1]^T / ||K^-1 [u v 1]^T|| + */ + const Mat * points_mat, * calib_norm_points_mat, * K_mat, &K; + const float * const calib_norm_points, * const points; + const double VAL_THR = 1e-4; +public: + /* + * @points_ is matrix N x 5 + * u v x y z. (u,v) is image point, (x y z) is world point + */ + P3PSolverImpl (const Mat &points_, const Mat &calib_norm_points_, const Mat &K_) : + points_mat(&points_), calib_norm_points_mat(&calib_norm_points_), K_mat (&K_), + K(K_), calib_norm_points((float*)calib_norm_points_.data), points((float*)points_.data) {} + + int estimate (const std::vector &sample, std::vector &models) const override { + /* + * The description of this solution can be found here: + * http://cmp.felk.cvut.cz/~pajdla/gvg/GVG-2016-Lecture.pdf + * pages: 51-59 + */ + const int idx1 = 5*sample[0], idx2 = 5*sample[1], idx3 = 5*sample[2]; + const Vec3d X1 (points[idx1+2], points[idx1+3], points[idx1+4]); + const Vec3d X2 (points[idx2+2], points[idx2+3], points[idx2+4]); + const Vec3d X3 (points[idx3+2], points[idx3+3], points[idx3+4]); + + // find distance between world points d_ij = ||Xi - Xj|| + const double d12 = norm(X1 - X2); + const double d23 = norm(X2 - X3); + const double d31 = norm(X3 - X1); + + if (d12 < VAL_THR || d23 < VAL_THR || d31 < VAL_THR) + return 0; + + const int c_idx1 = 3*sample[0], c_idx2 = 3*sample[1], c_idx3 = 3*sample[2]; + const Vec3d cx1 (calib_norm_points[c_idx1], calib_norm_points[c_idx1+1], calib_norm_points[c_idx1+2]); + const Vec3d cx2 (calib_norm_points[c_idx2], calib_norm_points[c_idx2+1], calib_norm_points[c_idx2+2]); + const Vec3d cx3 (calib_norm_points[c_idx3], calib_norm_points[c_idx3+1], calib_norm_points[c_idx3+2]); + + // find cosine angles, cos(x1,x2) = K^-1 x1.dot(K^-1 x2) / (||K^-1 x1|| * ||K^-1 x2||) + // calib_norm_points are already K^-1 x / ||K^-1 x||, so we perform only dot product + const double c12 = cx1(0)*cx2(0) + cx1(1)*cx2(1) + cx1(2)*cx2(2); + const double c23 = cx2(0)*cx3(0) + cx2(1)*cx3(1) + cx2(2)*cx3(2); + const double c31 = cx3(0)*cx1(0) + cx3(1)*cx1(1) + cx3(2)*cx1(2); + + Matx33d Z, Zw; + auto * z = Z.val, * zw = Zw.val; + + // find coefficients of polynomial a4 x^4 + ... + a0 = 0 + const double c12_p2 = c12*c12, c23_p2 = c23*c23, c31_p2 = c31*c31; + const double d12_p2 = d12*d12, d12_p4 = d12_p2*d12_p2; + const double d23_p2 = d23*d23, d23_p4 = d23_p2*d23_p2, d23_p6 = d23_p2*d23_p4, d23_p8 = d23_p4*d23_p4; + const double d31_p2 = d31*d31, d31_p4 = d31_p2*d31_p2; + const double a4 = -4*d23_p4*d12_p2*d31_p2*c23_p2+d23_p8-2*d23_p6*d12_p2-2*d23_p6*d31_p2+d23_p4*d12_p4+2*d23_p4*d12_p2*d31_p2+d23_p4*d31_p4; + const double a3 = 8*d23_p4*d12_p2*d31_p2*c12*c23_p2+4*d23_p6*d12_p2*c31*c23-4*d23_p4*d12_p4*c31*c23+4*d23_p4*d12_p2*d31_p2*c31*c23-4*d23_p8*c12+4*d23_p6*d12_p2*c12+8*d23_p6*d31_p2*c12-4*d23_p4*d12_p2*d31_p2*c12-4*d23_p4*d31_p4*c12; + const double a2 = -8*d23_p6*d12_p2*c31*c12*c23-8*d23_p4*d12_p2*d31_p2*c31*c12*c23+4*d23_p8*c12_p2-4*d23_p6*d12_p2*c31_p2-8*d23_p6*d31_p2*c12_p2+4*d23_p4*d12_p4*c31_p2+4*d23_p4*d12_p4*c23_p2-4*d23_p4*d12_p2*d31_p2*c23_p2+4*d23_p4*d31_p4*c12_p2+2*d23_p8-4*d23_p6*d31_p2-2*d23_p4*d12_p4+2*d23_p4*d31_p4; + const double a1 = 8*d23_p6*d12_p2*c31_p2*c12+4*d23_p6*d12_p2*c31*c23-4*d23_p4*d12_p4*c31*c23+4*d23_p4*d12_p2*d31_p2*c31*c23-4*d23_p8*c12-4*d23_p6*d12_p2*c12+8*d23_p6*d31_p2*c12+4*d23_p4*d12_p2*d31_p2*c12-4*d23_p4*d31_p4*c12; + const double a0 = -4*d23_p6*d12_p2*c31_p2+d23_p8-2*d23_p4*d12_p2*d31_p2+2*d23_p6*d12_p2+d23_p4*d31_p4+d23_p4*d12_p4-2*d23_p6*d31_p2; + + double roots[4] = {0}; + int num_roots = solve_deg4(a4, a3, a2, a1, a0, roots[0], roots[1], roots[2], roots[3]); + + models = std::vector(); models.reserve(num_roots); + for (double root : roots) { + if (root <= 0) continue; + + const double n12 = root, n12_p2 = n12 * n12; + const double n13 = (d12_p2*(d23_p2-d31_p2*n12_p2)+(d23_p2-d31_p2)*(d23_p2*(1+n12_p2-2*n12*c12)-d12_p2*n12_p2)) + / (2*d12_p2*(d23_p2*c31 - d31_p2*c23*n12) + 2*(d31_p2-d23_p2)*d12_p2*c23*n12); + const double n1 = d12 / sqrt(1 + n12_p2 - 2*n12*c12); // 1+n12^2-2n12c12 is always > 0 + const double n2 = n1 * n12; + const double n3 = n1 * n13; + + if (n1 <= 0 || n2 <= 0 || n3 <= 0) + continue; + // compute and check errors + if (fabs((sqrt(n1*n1 + n2*n2 - 2*n1*n2*c12) - d12) / d12) > VAL_THR || + fabs((sqrt(n2*n2 + n3*n3 - 2*n2*n3*c23) - d23) / d23) > VAL_THR || + fabs((sqrt(n3*n3 + n1*n1 - 2*n3*n1*c31) - d31) / d31) > VAL_THR) + continue; + + const Vec3d nX1 = n1 * cx1; + Vec3d Z2 = n2 * cx2 - nX1; Z2 /= norm(Z2); + Vec3d Z3 = n3 * cx3 - nX1; Z3 /= norm(Z3); + Vec3d Z1 = Z2.cross(Z3); Z1 /= norm(Z1); + const Vec3d Z3crZ1 = Z3.cross(Z1); + + z[0] = Z1(0); z[3] = Z1(1); z[6] = Z1(2); + z[1] = Z2(0); z[4] = Z2(1); z[7] = Z2(2); + z[2] = Z3crZ1(0); z[5] = Z3crZ1(1); z[8] = Z3crZ1(2); + + Vec3d Zw2 = (X2 - X1) / d12; + Vec3d Zw3 = (X3 - X1) / d31; + Vec3d Zw1 = Zw2.cross(Zw3); Zw1 /= norm(Zw1); + const Vec3d Z3crZ1w = Zw3.cross(Zw1); + + zw[0] = Zw1(0); zw[3] = Zw1(1); zw[6] = Zw1(2); + zw[1] = Zw2(0); zw[4] = Zw2(1); zw[7] = Zw2(2); + zw[2] = Z3crZ1w(0); zw[5] = Z3crZ1w(1); zw[8] = Z3crZ1w(2); + + const Matx33d R = Math::rotVec2RotMat(Math::rotMat2RotVec(Z * Zw.inv())); + + Mat P, KR = K * R; + hconcat(KR, -KR * (X1 - R.t() * nX1), P); + models.emplace_back(P); + } + return static_cast(models.size()); + } + int getSampleSize() const override { return 3; } + int getMaxNumberOfSolutions () const override { return 4; } + Ptr clone () const override { + return makePtr(*points_mat, *calib_norm_points_mat, *K_mat); + } +}; +Ptr P3PSolver::create(const Mat &points_, const Mat &calib_norm_pts, const Mat &K) { + return makePtr(points_, calib_norm_pts, K); +} +}} \ No newline at end of file diff --git a/modules/calib3d/src/usac/quality.cpp b/modules/calib3d/src/usac/quality.cpp new file mode 100644 index 0000000..8e438e7 --- /dev/null +++ b/modules/calib3d/src/usac/quality.cpp @@ -0,0 +1,581 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#include "../precomp.hpp" +#include "../usac.hpp" +#include "gamma_values.hpp" + +namespace cv { namespace usac { +int Quality::getInliers(const Ptr &error, const Mat &model, std::vector &inliers, double threshold) { + const auto &errors = error->getErrors(model); + int num_inliers = 0; + for (int point = 0; point < (int)inliers.size(); point++) + if (errors[point] < threshold) + inliers[num_inliers++] = point; + return num_inliers; +} +int Quality::getInliers(const Ptr &error, const Mat &model, std::vector &inliers_mask, double threshold) { + std::fill(inliers_mask.begin(), inliers_mask.end(), false); + const auto &errors = error->getErrors(model); + int num_inliers = 0; + for (int point = 0; point < (int)inliers_mask.size(); point++) + if (errors[point] < threshold) { + inliers_mask[point] = true; + num_inliers++; + } + return num_inliers; +} + +class RansacQualityImpl : public RansacQuality { +private: + const Ptr error; + const int points_size; + const double threshold; + double best_score; +public: + RansacQualityImpl (int points_size_, double threshold_, const Ptr &error_) + : error (error_), points_size(points_size_), threshold(threshold_) { + best_score = std::numeric_limits::max(); + } + + Score getScore (const Mat &model) const override { + error->setModelParameters(model); + int inlier_number = 0; + for (int point = 0; point < points_size; point++) { + if (error->getError(point) < threshold) + inlier_number++; + if (inlier_number + (points_size - point) < -best_score) + break; + } + // score is negative inlier number! If less then better + return Score(inlier_number, -static_cast(inlier_number)); + } + + void setBestScore(double best_score_) override { + if (best_score > best_score_) best_score = best_score_; + } + + int getInliers (const Mat &model, std::vector &inliers) const override + { return Quality::getInliers(error, model, inliers, threshold); } + int getInliers (const Mat &model, std::vector &inliers, double thr) const override + { return Quality::getInliers(error, model, inliers, thr); } + int getInliers (const Mat &model, std::vector &inliers_mask) const override + { return Quality::getInliers(error, model, inliers_mask, threshold); } + + int getPointsSize () const override { return points_size; } + Ptr clone () const override { + return makePtr(points_size, threshold, error->clone()); + } +}; + +Ptr RansacQuality::create(int points_size_, double threshold_, + const Ptr &error_) { + return makePtr(points_size_, threshold_, error_); +} + +class MsacQualityImpl : public MsacQuality { +protected: + const Ptr error; + const int points_size; + const double threshold; + double best_score; +public: + MsacQualityImpl (int points_size_, double threshold_, const Ptr &error_) + : error (error_), points_size (points_size_), threshold (threshold_) { + best_score = std::numeric_limits::max(); + } + + inline Score getScore (const Mat &model) const override { + error->setModelParameters(model); + double err, sum_errors = 0; + int inlier_number = 0; + for (int point = 0; point < points_size; point++) { + err = error->getError(point); + if (err < threshold) { + sum_errors += err; + inlier_number++; + } else + sum_errors += threshold; + if (sum_errors > best_score) + break; + } + return Score(inlier_number, sum_errors); + } + + void setBestScore(double best_score_) override { + if (best_score > best_score_) best_score = best_score_; + } + + int getInliers (const Mat &model, std::vector &inliers) const override + { return Quality::getInliers(error, model, inliers, threshold); } + int getInliers (const Mat &model, std::vector &inliers, double thr) const override + { return Quality::getInliers(error, model, inliers, thr); } + int getInliers (const Mat &model, std::vector &inliers_mask) const override + { return Quality::getInliers(error, model, inliers_mask, threshold); } + + int getPointsSize () const override { return points_size; } + Ptr clone () const override { + return makePtr(points_size, threshold, error->clone()); + } +}; +Ptr MsacQuality::create(int points_size_, double threshold_, + const Ptr &error_) { + return makePtr(points_size_, threshold_, error_); +} + +class MagsacQualityImpl : public MagsacQuality { +private: + const Ptr error; + const int points_size; + + // for example, maximum standard deviation of noise. + const double maximum_threshold, tentative_inlier_threshold; + // The degrees of freedom of the data from which the model is estimated. + // E.g., for models coming from point correspondences (x1,y1,x2,y2), it is 4. + const int degrees_of_freedom; + // A 0.99 quantile of the Chi^2-distribution to convert sigma values to residuals + const double k; + // A multiplier to convert residual values to sigmas + float threshold_to_sigma_multiplier; + // Calculating k^2 / 2 which will be used for the estimation and, + // due to being constant, it is better to calculate it a priori. + double squared_k_per_2; + // Calculating (DoF - 1) / 2 which will be used for the estimation and, + // due to being constant, it is better to calculate it a priori. + double dof_minus_one_per_two; + // Calculating (DoF + 1) / 2 which will be used for the estimation and, + // due to being constant, it is better to calculate it a priori. + double dof_plus_one_per_two; + const double C; + // Calculating 2^(DoF - 1) which will be used for the estimation and, + // due to being constant, it is better to calculate it a priori. + double two_ad_dof_minus_one; + // Calculating 2^(DoF + 1) which will be used for the estimation and, + // due to being constant, it is better to calculate it a priori. + double two_ad_dof_plus_one; + // Calculate the gamma value of k + const double gamma_value_of_k; + // Calculate the lower incomplete gamma value of k + const double lower_gamma_value_of_k; + double previous_best_loss; + // Convert the maximum threshold to a sigma value + float maximum_sigma; + // Calculate the squared maximum sigma + float maximum_sigma_2; + // Calculate \sigma_{max}^2 / 2 + float maximum_sigma_2_per_2; + // Calculate 2 * \sigma_{max}^2 + float maximum_sigma_2_times_2; + // Calculate the loss implied by an outlier + double outlier_loss; + // Calculating 2^(DoF + 1) / \sigma_{max} which will be used for the estimation and, + // due to being constant, it is better to calculate it a priori. + double two_ad_dof_plus_one_per_maximum_sigma; + double scale_of_stored_incomplete_gammas; + std::vector stored_complete_gamma_values, stored_lower_incomplete_gamma_values; +public: + + MagsacQualityImpl (double maximum_thr, int points_size_, const Ptr &error_, + double tentative_inlier_threshold_, int DoF, double sigma_quantile, + double upper_incomplete_of_sigma_quantile, + double lower_incomplete_of_sigma_quantile, double C_) + : error (error_), points_size(points_size_), maximum_threshold(maximum_thr), + tentative_inlier_threshold(tentative_inlier_threshold_), degrees_of_freedom(DoF), + k(sigma_quantile), C(C_), gamma_value_of_k (upper_incomplete_of_sigma_quantile), + lower_gamma_value_of_k (lower_incomplete_of_sigma_quantile) { + previous_best_loss = std::numeric_limits::max(); + threshold_to_sigma_multiplier = 1.f / (float)k; + squared_k_per_2 = k * k / 2.0; + dof_minus_one_per_two = (degrees_of_freedom - 1.0) / 2.0; + dof_plus_one_per_two = (degrees_of_freedom + 1.0) / 2.0; + two_ad_dof_minus_one = std::pow(2.0, dof_minus_one_per_two); + two_ad_dof_plus_one = std::pow(2.0, dof_plus_one_per_two); + maximum_sigma = threshold_to_sigma_multiplier * (float)maximum_threshold; + maximum_sigma_2 = maximum_sigma * maximum_sigma; + maximum_sigma_2_per_2 = maximum_sigma_2 / 2.f; + maximum_sigma_2_times_2 = maximum_sigma_2 * 2.f; + // penalization for outlier + outlier_loss = 10 * maximum_sigma * two_ad_dof_minus_one * lower_gamma_value_of_k; + two_ad_dof_plus_one_per_maximum_sigma = two_ad_dof_plus_one / maximum_sigma; + + if (DoF == 4) { + scale_of_stored_incomplete_gammas = scale_of_stored_incomplete_gammas_n4; + stored_complete_gamma_values = std::vector(stored_complete_gamma_values_n4, + stored_complete_gamma_values_n4+stored_incomplete_gamma_number+1); + stored_lower_incomplete_gamma_values = std::vector + (stored_lower_incomplete_gamma_values_n4, + stored_lower_incomplete_gamma_values_n4+stored_incomplete_gamma_number+1); + } else if (DoF == 5) { + scale_of_stored_incomplete_gammas = scale_of_stored_incomplete_gammas_n5; + stored_complete_gamma_values = std::vector(stored_complete_gamma_values_n5, + stored_complete_gamma_values_n5+stored_incomplete_gamma_number+1); + stored_lower_incomplete_gamma_values = std::vector + (stored_lower_incomplete_gamma_values_n5, + stored_lower_incomplete_gamma_values_n5+stored_incomplete_gamma_number+1); + } else + CV_Error(cv::Error::StsNotImplemented, "Sigma values are not generated"); + } + + // https://github.com/danini/magsac + Score getScore (const Mat &model) const override { + error->setModelParameters(model); + double total_loss = 0.0; + int num_tentative_inliers = 0; + for (int point_idx = 0; point_idx < points_size; point_idx++) { + const float squared_residual = error->getError(point_idx); + if (squared_residual < tentative_inlier_threshold) + num_tentative_inliers++; + if (squared_residual < maximum_threshold) { // consider point as inlier + // Get the position of the gamma value in the lookup table + int x=(int)round(scale_of_stored_incomplete_gammas * squared_residual + / maximum_sigma_2_times_2); + // If the sought gamma value is not stored in the lookup, return the closest element + if (x >= stored_incomplete_gamma_number || x < 0 /*overflow*/) + x = stored_incomplete_gamma_number; + // Calculate the loss implied by the current point + total_loss += two_ad_dof_plus_one_per_maximum_sigma * (maximum_sigma_2_per_2 * + stored_lower_incomplete_gamma_values[x] + squared_residual * 0.25 * + (stored_complete_gamma_values[x] - gamma_value_of_k)); + } else total_loss += outlier_loss; // outlier + if (total_loss > previous_best_loss) + break; // break if total loss is alreay higher than the best one + } + return Score(num_tentative_inliers, total_loss); + } + + Score getScore (const std::vector &errors) const override { + double total_loss = 0.0; + int num_tentative_inliers = 0; + for (int point_idx = 0; point_idx < points_size; point_idx++) { + const float squared_residual = errors[point_idx]; + if (squared_residual < tentative_inlier_threshold) + num_tentative_inliers++; + if (squared_residual < maximum_threshold) { + int x=(int)round(scale_of_stored_incomplete_gammas * squared_residual + / maximum_sigma_2_times_2); + if (x >= stored_incomplete_gamma_number || x < 0 /*overflow*/) + x = stored_incomplete_gamma_number; + total_loss += two_ad_dof_plus_one_per_maximum_sigma * (maximum_sigma_2_per_2 * + stored_lower_incomplete_gamma_values[x] + squared_residual * 0.25 * + (stored_complete_gamma_values[x] - gamma_value_of_k)); + } else total_loss += outlier_loss; + if (total_loss > previous_best_loss) + break; + } + return Score(num_tentative_inliers, total_loss); + } + + void setBestScore (double best_loss) override { + if (previous_best_loss > best_loss) previous_best_loss = best_loss; + } + + int getInliers (const Mat &model, std::vector &inliers) const override + { return Quality::getInliers(error, model, inliers, tentative_inlier_threshold); } + int getInliers (const Mat &model, std::vector &inliers, double thr) const override + { return Quality::getInliers(error, model, inliers, thr); } + int getInliers (const Mat &model, std::vector &inliers_mask) const override + { return Quality::getInliers(error, model, inliers_mask, tentative_inlier_threshold); } + int getPointsSize () const override { return points_size; } + Ptr clone () const override { + return makePtr(maximum_sigma, points_size, error->clone(), + tentative_inlier_threshold, degrees_of_freedom, k, gamma_value_of_k, + lower_gamma_value_of_k, C); + } +}; +Ptr MagsacQuality::create(double maximum_thr, int points_size_, const Ptr &error_, + double tentative_inlier_threshold_, int DoF, double sigma_quantile, + double upper_incomplete_of_sigma_quantile, + double lower_incomplete_of_sigma_quantile, double C_) { + return makePtr(maximum_thr, points_size_, error_, + tentative_inlier_threshold_, DoF, sigma_quantile, upper_incomplete_of_sigma_quantile, + lower_incomplete_of_sigma_quantile, C_); +} + +class LMedsQualityImpl : public LMedsQuality { +private: + const Ptr error; + const int points_size; + const double threshold; +public: + LMedsQualityImpl (int points_size_, double threshold_, const Ptr &error_) : + error (error_), points_size (points_size_), threshold (threshold_) {} + + // Finds median of errors. + Score getScore (const Mat &model) const override { + std::vector errors = error->getErrors(model); + int inlier_number = 0; + for (int point = 0; point < points_size; point++) + if (errors[point] < threshold) + inlier_number++; + // score is median of errors + return Score(inlier_number, Utils::findMedian (errors)); + } + + void setBestScore (double /*best_score*/) override {} + + int getPointsSize () const override { return points_size; } + int getInliers (const Mat &model, std::vector &inliers) const override + { return Quality::getInliers(error, model, inliers, threshold); } + int getInliers (const Mat &model, std::vector &inliers, double thr) const override + { return Quality::getInliers(error, model, inliers, thr); } + int getInliers (const Mat &model, std::vector &inliers_mask) const override + { return Quality::getInliers(error, model, inliers_mask, threshold); } + + Ptr clone () const override { + return makePtr(points_size, threshold, error->clone()); + } +}; +Ptr LMedsQuality::create(int points_size_, double threshold_, const Ptr &error_) { + return makePtr(points_size_, threshold_, error_); +} + +class ModelVerifierImpl : public ModelVerifier { +private: + std::vector errors; +public: + inline bool isModelGood(const Mat &/*model*/) override { return true; } + inline bool getScore(Score &/*score*/) const override { return false; } + void update (int /*highest_inlier_number*/) override {} + const std::vector &getErrors() const override { return errors; } + bool hasErrors () const override { return false; } + Ptr clone (int /*state*/) const override { return makePtr();} +}; +Ptr ModelVerifier::create() { + return makePtr(); +} + +///////////////////////////////////// SPRT VERIFIER ////////////////////////////////////////// +class SPRTImpl : public SPRT { +private: + RNG rng; + const Ptr err; + const int points_size; + int highest_inlier_number, current_sprt_idx; // i + // time t_M needed to instantiate a model hypothesis given a sample + // Let m_S be the number of models that are verified per sample + const double inlier_threshold, t_M, m_S; + + double lowest_sum_errors, current_epsilon, current_delta, current_A, + delta_to_epsilon, complement_delta_to_complement_epsilon; + + std::vector sprt_histories; + std::vector points_random_pool; + std::vector errors; + + Score score; + const ScoreMethod score_type; + bool last_model_is_good, can_compute_score, has_errors; +public: + SPRTImpl (int state, const Ptr &err_, int points_size_, + double inlier_threshold_, double prob_pt_of_good_model, double prob_pt_of_bad_model, + double time_sample, double avg_num_models, ScoreMethod score_type_) : rng(state), err(err_), + points_size(points_size_), inlier_threshold (inlier_threshold_), + t_M (time_sample), m_S (avg_num_models), score_type (score_type_) { + + // Generate array of random points for randomized evaluation + points_random_pool = std::vector (points_size_); + // fill values from 0 to points_size-1 + for (int i = 0; i < points_size; i++) + points_random_pool[i] = i; + randShuffle(points_random_pool, 1, &rng); + + // reserve (approximately) some space for sprt vector. + sprt_histories.reserve(20); + + createTest(prob_pt_of_good_model, prob_pt_of_bad_model); + + highest_inlier_number = 0; + lowest_sum_errors = std::numeric_limits::max(); + last_model_is_good = false; + can_compute_score = score_type_ == ScoreMethod::SCORE_METHOD_MSAC + || score_type_ == ScoreMethod::SCORE_METHOD_RANSAC + || score_type_ == ScoreMethod::SCORE_METHOD_LMEDS; + // for MSAC and RANSAC errors not needed + if (score_type_ != ScoreMethod::SCORE_METHOD_MSAC && score_type_ != ScoreMethod::SCORE_METHOD_RANSAC) + errors = std::vector(points_size_); + // however return errors only if we can't compute score + has_errors = !can_compute_score; + } + + /* + * p(x(r)|Hb) p(x(j)|Hb) + * lambda(j) = Product (----------) = lambda(j-1) * ---------- + * p(x(r)|Hg) p(x(j)|Hg) + * Set j = 1 + * 1. Check whether j-th data point is consistent with the + * model + * 2. Compute the likelihood ratio λj eq. (1) + * 3. If λj > A, decide the model is ’bad’ (model ”re-jected”), + * else increment j or continue testing + * 4. If j = N the number of correspondences decide model ”accepted” + * + * Verifies model and returns model score. + + * Returns true if model is good, false - otherwise. + * @model: model to verify + * @current_hypothesis: current RANSAC iteration + * Return: true if model is good, false - otherwise. + */ + inline bool isModelGood (const Mat &model) override { + // update error object with current model + err->setModelParameters(model); + + double lambda = 1, sum_errors = 0; + last_model_is_good = true; + int random_pool_idx = rng.uniform(0, points_size), tested_point, tested_inliers = 0; + for (tested_point = 0; tested_point < points_size; tested_point++) { + if (random_pool_idx >= points_size) + random_pool_idx = 0; + const double error = err->getError (points_random_pool[random_pool_idx++]); + if (error < inlier_threshold) { + tested_inliers++; + lambda *= delta_to_epsilon; + } else { + lambda *= complement_delta_to_complement_epsilon; + // since delta is always higher than epsilon, then lambda can increase only + // when point is not consistent with model + if (lambda > current_A) + break; + } + if (score_type == ScoreMethod::SCORE_METHOD_MSAC) { + sum_errors += error < inlier_threshold ? error : inlier_threshold; + if (sum_errors > lowest_sum_errors) + break; + } else if (score_type == ScoreMethod::SCORE_METHOD_RANSAC) { + if (tested_inliers + points_size - tested_point < highest_inlier_number) + break; + } else errors[points_random_pool[random_pool_idx-1]] = (float)error; + } + last_model_is_good = tested_point == points_size; + + // increase number of samples processed by current test + sprt_histories[current_sprt_idx].tested_samples++; + if (last_model_is_good) { + score.inlier_number = tested_inliers; + if (score_type == ScoreMethod::SCORE_METHOD_MSAC) { + score.score = sum_errors; + lowest_sum_errors = sum_errors; + } else if (score_type == ScoreMethod::SCORE_METHOD_RANSAC) + score.score = -static_cast(tested_inliers); + else if (score_type == ScoreMethod::SCORE_METHOD_LMEDS) + score.score = Utils::findMedian(errors); + + const double new_epsilon = static_cast(tested_inliers) / points_size; + if (new_epsilon > current_epsilon) { + highest_inlier_number = tested_inliers; // update max inlier number + /* + * Model accepted and the largest support so far: + * design (i+1)-th test (εi + 1= εˆ, δi+1 = δ, i := i + 1). + * Store the current model parameters θ + */ + createTest(new_epsilon, current_delta); + } + } else { + /* + * Since almost all tested models are ‘bad’, the probability + * δ can be estimated as the average fraction of consistent data points + * in rejected models. + */ + // add 1 to tested_point, because loop over tested_point starts from 0 + const double delta_estimated = static_cast (tested_inliers) / (tested_point+1); + if (delta_estimated > 0 && fabs(current_delta - delta_estimated) + / current_delta > 0.05) + /* + * Model rejected: re-estimate δ. If the estimate δ_ differs + * from δi by more than 5% design (i+1)-th test (εi+1 = εi, + * δi+1 = δˆ, i := i + 1) + */ + createTest(current_epsilon, delta_estimated); + } + return last_model_is_good; + } + + inline bool getScore (Score &score_) const override { + if (!last_model_is_good || !can_compute_score) + return false; + score_ = score; + return true; + } + bool hasErrors () const override { return has_errors; } + const std::vector &getErrors () const override { return errors; } + const std::vector &getSPRTvector () const override { return sprt_histories; } + void update (int highest_inlier_number_) override { + const double new_epsilon = static_cast(highest_inlier_number_) / points_size; + if (new_epsilon > current_epsilon) { + highest_inlier_number = highest_inlier_number_; + if (sprt_histories[current_sprt_idx].tested_samples == 0) + sprt_histories[current_sprt_idx].tested_samples = 1; + // save sprt test and create new one + createTest(new_epsilon, current_delta); + } + } + Ptr clone (int state) const override { + return makePtr(state, err->clone(), points_size, inlier_threshold, + sprt_histories[current_sprt_idx].epsilon, + sprt_histories[current_sprt_idx].delta, t_M, m_S, score_type); + } +private: + + // Saves sprt test to sprt history and update current epsilon, delta and threshold. + void createTest (double epsilon, double delta) { + // if epsilon is closed to 1 then set them to 0.99 to avoid numerical problems + if (epsilon > 0.999999) epsilon = 0.999; + // delta can't be higher than epsilon, because ratio delta / epsilon will be greater than 1 + if (epsilon < delta) delta = epsilon-0.0001; + // avoid delta going too high as it is very unlikely + // e.g., 30% of points are consistent with bad model is not very real + if (delta > 0.3) delta = 0.3; + + SPRT_history new_sprt_history; + new_sprt_history.epsilon = epsilon; + new_sprt_history.delta = delta; + new_sprt_history.A = estimateThresholdA (epsilon, delta); + + sprt_histories.emplace_back(new_sprt_history); + + current_A = new_sprt_history.A; + current_delta = delta; + current_epsilon = epsilon; + + delta_to_epsilon = delta / epsilon; + complement_delta_to_complement_epsilon = (1 - delta) / (1 - epsilon); + current_sprt_idx = static_cast(sprt_histories.size()) - 1; + } + + /* + * A(0) = K1/K2 + 1 + * A(n+1) = K1/K2 + 1 + log (A(n)) + * K1 = t_M / P_g + * K2 = m_S/(P_g*C) + * t_M is time needed to instantiate a model hypotheses given a sample + * P_g = epsilon ^ m, m is the number of data point in the Ransac sample. + * m_S is the number of models that are verified per sample. + * p (0|Hb) p (1|Hb) + * C = p(0|Hb) log (---------) + p(1|Hb) log (---------) + * p (0|Hg) p (1|Hg) + */ + double estimateThresholdA (double epsilon, double delta) { + const double C = (1 - delta) * log ((1 - delta) / (1 - epsilon)) + + delta * (log(delta / epsilon)); + // K = K1/K2 + 1 = (t_M / P_g) / (m_S / (C * P_g)) + 1 = (t_M * C)/m_S + 1 + const double K = t_M * C / m_S + 1; + double An, An_1 = K; + // compute A using a recursive relation + // A* = lim(n->inf)(An), the series typically converges within 4 iterations + for (int i = 0; i < 10; i++) { + An = K + log(An_1); + if (fabs(An - An_1) < FLT_EPSILON) + break; + An_1 = An; + } + return An; + } +}; +Ptr SPRT::create (int state, const Ptr &err_, int points_size_, + double inlier_threshold_, double prob_pt_of_good_model, double prob_pt_of_bad_model, + double time_sample, double avg_num_models, ScoreMethod score_type_) { + return makePtr(state, err_, points_size_, inlier_threshold_, + prob_pt_of_good_model, prob_pt_of_bad_model, time_sample, avg_num_models, score_type_); +} +}} \ No newline at end of file diff --git a/modules/calib3d/src/usac/ransac_solvers.cpp b/modules/calib3d/src/usac/ransac_solvers.cpp new file mode 100644 index 0000000..0ef9907 --- /dev/null +++ b/modules/calib3d/src/usac/ransac_solvers.cpp @@ -0,0 +1,977 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#include "../precomp.hpp" +#include "../usac.hpp" +#include + +namespace cv { namespace usac { +int mergePoints (InputArray pts1_, InputArray pts2_, Mat &pts, bool ispnp); +void setParameters (int flag, Ptr ¶ms, EstimationMethod estimator, double thr, + int max_iters, double conf, bool mask_needed); + +class RansacOutputImpl : public RansacOutput { +private: + Mat model; + // vector of number_inliers size + std::vector inliers; + // vector of points size, true if inlier, false-outlier + std::vector inliers_mask; + // vector of points size, value of i-th index corresponds to error of i-th point if i is inlier. + std::vector errors; + // the best found score of RANSAC + double score; + + int seconds, milliseconds, microseconds; + int time_mcs, number_inliers, number_estimated_models, number_good_models; + int number_iterations; // number of iterations of main RANSAC +public: + RansacOutputImpl (const Mat &model_, const std::vector &inliers_mask_, + int time_mcs_, double score_, int number_inliers_, int number_iterations_, + int number_estimated_models_, int number_good_models_) { + + model_.copyTo(model); + inliers_mask = inliers_mask_; + time_mcs = time_mcs_; + score = score_; + number_inliers = number_inliers_; + number_iterations = number_iterations_; + number_estimated_models = number_estimated_models_; + number_good_models = number_good_models_; + microseconds = time_mcs % 1000; + milliseconds = ((time_mcs - microseconds)/1000) % 1000; + seconds = ((time_mcs - 1000*milliseconds - microseconds)/(1000*1000)) % 60; + } + + /* + * Return inliers' indices. + * size of vector = number of inliers + */ + const std::vector &getInliers() override { + if (inliers.empty()) { + inliers.reserve(inliers_mask.size()); + int pt_cnt = 0; + for (bool is_inlier : inliers_mask) { + if (is_inlier) + inliers.emplace_back(pt_cnt); + pt_cnt++; + } + } + return inliers; + } + + // Return inliers mask. Vector of points size. 1-inlier, 0-outlier. + const std::vector &getInliersMask() const override { return inliers_mask; } + + int getTimeMicroSeconds() const override {return time_mcs; } + int getTimeMicroSeconds1() const override {return microseconds; } + int getTimeMilliSeconds2() const override {return milliseconds; } + int getTimeSeconds3() const override {return seconds; } + int getNumberOfInliers() const override { return number_inliers; } + int getNumberOfMainIterations() const override { return number_iterations; } + int getNumberOfGoodModels () const override { return number_good_models; } + int getNumberOfEstimatedModels () const override { return number_estimated_models; } + const Mat &getModel() const override { return model; } +}; + +Ptr RansacOutput::create(const Mat &model_, const std::vector &inliers_mask_, + int time_mcs_, double score_, int number_inliers_, int number_iterations_, + int number_estimated_models_, int number_good_models_) { + return makePtr(model_, inliers_mask_, time_mcs_, score_, number_inliers_, + number_iterations_, number_estimated_models_, number_good_models_); +} + +class Ransac { +protected: + const Ptr params; + const Ptr _estimator; + const Ptr _quality; + const Ptr _sampler; + const Ptr _termination_criteria; + const Ptr _model_verifier; + const Ptr _degeneracy; + const Ptr _local_optimization; + const Ptr model_polisher; + + const int points_size, state; + const bool parallel; +public: + + Ransac (const Ptr ¶ms_, int points_size_, const Ptr &estimator_, const Ptr &quality_, + const Ptr &sampler_, const Ptr &termination_criteria_, + const Ptr &model_verifier_, const Ptr °eneracy_, + const Ptr &local_optimization_, const Ptr &model_polisher_, + bool parallel_=false, int state_ = 0) : + + params (params_), _estimator (estimator_), _quality (quality_), _sampler (sampler_), + _termination_criteria (termination_criteria_), _model_verifier (model_verifier_), + _degeneracy (degeneracy_), _local_optimization (local_optimization_), + model_polisher (model_polisher_), points_size (points_size_), state(state_), + parallel(parallel_) {} + + bool run(Ptr &ransac_output) { + if (points_size < params->getSampleSize()) + return false; + + const auto begin_time = std::chrono::steady_clock::now(); + + // check if LO + const bool LO = params->getLO() != LocalOptimMethod::LOCAL_OPTIM_NULL; + const bool is_magsac = params->getLO() == LocalOptimMethod::LOCAL_OPTIM_SIGMA; + const int repeat_magsac = 10; + Score best_score; + Mat best_model; + int final_iters; + + if (! parallel) { + Mat non_degenerate_model, lo_model; + Score current_score, lo_score, non_denegenerate_model_score; + + // reallocate memory for models + std::vector models(_estimator->getMaxNumSolutions()); + + // allocate memory for sample + std::vector sample(_estimator->getMinimalSampleSize()); + int iters = 0, max_iters = params->getMaxIters(); + for (; iters < max_iters; iters++) { + _sampler->generateSample(sample); + const int number_of_models = _estimator->estimateModels(sample, models); + + for (int i = 0; i < number_of_models; i++) { + if (is_magsac && iters % repeat_magsac == 0) { + if (!_local_optimization->refineModel + (models[i], best_score, models[i], current_score)) + continue; + } else if (_model_verifier->isModelGood(models[i])) { + if (!_model_verifier->getScore(current_score)) { + if (_model_verifier->hasErrors()) + current_score = _quality->getScore(_model_verifier->getErrors()); + else current_score = _quality->getScore(models[i]); + } + } else continue; + + if (current_score.isBetter(best_score)) { + if (_degeneracy->recoverIfDegenerate(sample, models[i], + non_degenerate_model, non_denegenerate_model_score)) { + // check if best non degenerate model is better than so far the best model + if (non_denegenerate_model_score.isBetter(best_score)) { + best_score = non_denegenerate_model_score; + non_degenerate_model.copyTo(best_model); + } else + // non degenerate models are worse then so far the best model. + continue; + } else { + // copy current score to best score + best_score = current_score; + // remember best model + models[i].copyTo(best_model); + } + + // update quality to save evaluation time of a model + // with no chance of being better than so-far-the-best + _quality->setBestScore(best_score.score); + + // update upper bound of iterations + max_iters = _termination_criteria->update + (best_model, best_score.inlier_number); + if (iters > max_iters) + break; + + if (LO) {//} && iters >= max_iters_before_LO) { + // do magsac if it wasn't already run + if (is_magsac && iters % repeat_magsac == 0) continue; // magsac has already run + // update model by Local optimization + if (_local_optimization->refineModel + (best_model, best_score, lo_model, lo_score)) + if (lo_score.isBetter(best_score)) { + best_score = lo_score; + lo_model.copyTo(best_model); + // update quality and verifier and termination again + _quality->setBestScore(best_score.score); + _model_verifier->update(best_score.inlier_number); + max_iters = _termination_criteria->update + (best_model, best_score.inlier_number); + if (iters > max_iters) + break; + } + } + } // end of if so far the best score + } // end loop of number of models + } // end main while loop + + final_iters = iters; + } else { + const int MAX_THREADS = getNumThreads(); + const bool is_prosac = params->getSampler() == SamplingMethod::SAMPLING_PROSAC; + + std::atomic_bool success(false); + std::atomic_int num_hypothesis_tested(0); + std::atomic_int thread_cnt(0); + std::vector best_scores(MAX_THREADS); + std::vector best_models(MAX_THREADS); + + Mutex mutex; // only for prosac + + /////////////////////////////////////////////////////////////////////////////////////////////////////// + parallel_for_(Range(0, MAX_THREADS), [&](const Range & /*range*/) { + if (!success) { // cover all if not success to avoid thread creating new variables + const int thread_rng_id = thread_cnt++; + int thread_state = state + 10*thread_rng_id; + + Ptr estimator = _estimator->clone(); + Ptr degeneracy = _degeneracy->clone(thread_state++); + Ptr quality = _quality->clone(); + Ptr model_verifier = _model_verifier->clone(thread_state++); // update verifier + Ptr local_optimization = _local_optimization->clone(thread_state++); + Ptr termination_criteria = _termination_criteria->clone(); + Ptr sampler; + if (!is_prosac) + sampler = _sampler->clone(thread_state); + + Mat best_model_thread, non_degenerate_model, lo_model; + Score best_score_thread, current_score, non_denegenerate_model_score, lo_score, + best_score_all_threads; + std::vector sample(estimator->getMinimalSampleSize()); + std::vector models(estimator->getMaxNumSolutions()); + int iters, max_iters = params->getMaxIters(); + auto update_best = [&] (const Score &new_score, const Mat &new_model) { + // copy new score to best score + best_score_thread = new_score; + best_scores[thread_rng_id] = best_score_thread; + // remember best model + new_model.copyTo(best_model_thread); + best_model_thread.copyTo(best_models[thread_rng_id]); + best_score_all_threads = best_score_thread; + }; + + for (iters = 0; iters < max_iters && !success; iters++) { + success = num_hypothesis_tested++ > max_iters; + + if (iters % 10) { + // Synchronize threads. just to speed verification of model. + int best_thread_idx = thread_rng_id; + bool updated = false; + for (int t = 0; t < MAX_THREADS; t++) { + if (best_scores[t].isBetter(best_score_all_threads)) { + best_score_all_threads = best_scores[t]; + updated = true; + best_thread_idx = t; + } + } + if (updated && best_thread_idx != thread_rng_id) { + quality->setBestScore(best_score_all_threads.score); + model_verifier->update(best_score_all_threads.inlier_number); + } + } + + if (is_prosac) { + // use global sampler + mutex.lock(); + _sampler->generateSample(sample); + mutex.unlock(); + } else sampler->generateSample(sample); // use local sampler + + const int number_of_models = estimator->estimateModels(sample, models); + for (int i = 0; i < number_of_models; i++) { + if (is_magsac && iters % repeat_magsac == 0) { + if (!local_optimization->refineModel + (models[i], best_score_thread, models[i], current_score)) + continue; + } else if (model_verifier->isModelGood(models[i])) { + if (!model_verifier->getScore(current_score)) { + if (model_verifier->hasErrors()) + current_score = quality->getScore(model_verifier->getErrors()); + else current_score = quality->getScore(models[i]); + } + } else continue; + + if (current_score.isBetter(best_score_all_threads)) { + if (degeneracy->recoverIfDegenerate(sample, models[i], + non_degenerate_model, non_denegenerate_model_score)) { + // check if best non degenerate model is better than so far the best model + if (non_denegenerate_model_score.isBetter(best_score_thread)) + update_best(non_denegenerate_model_score, non_degenerate_model); + else + // non degenerate models are worse then so far the best model. + continue; + } else + update_best(current_score, models[i]); + + // update upper bound of iterations + max_iters = termination_criteria->update + (best_model_thread, best_score_thread.inlier_number); + if (num_hypothesis_tested > max_iters) { + success = true; break; + } + + if (LO) { + // do magsac if it wasn't already run + if (is_magsac && iters % repeat_magsac == 0) continue; + // update model by Local optimizaion + if (local_optimization->refineModel + (best_model_thread, best_score_thread, lo_model, lo_score)) + if (lo_score.isBetter(best_score_thread)) { + update_best(lo_score, lo_model); + // update termination again + max_iters = termination_criteria->update + (best_model_thread, best_score_thread.inlier_number); + if (num_hypothesis_tested > max_iters) { + success = true; + break; + } + } + } + } // end of if so far the best score + } // end loop of number of models + } // end of loop over iters + }}); // end parallel + /////////////////////////////////////////////////////////////////////////////////////////////////////// + // find best model from all threads' models + best_score = best_scores[0]; + int best_thread_idx = 0; + for (int i = 1; i < MAX_THREADS; i++) { + if (best_scores[i].isBetter(best_score)) { + best_score = best_scores[i]; + best_thread_idx = i; + } + } + best_model = best_models[best_thread_idx]; + final_iters = num_hypothesis_tested; + } + + if (best_model.empty()) + return false; + + // polish final model + if (params->getFinalPolisher() != PolishingMethod::NonePolisher) { + Mat polished_model; + Score polisher_score; + if (model_polisher->polishSoFarTheBestModel(best_model, best_score, + polished_model, polisher_score)) + if (polisher_score.isBetter(best_score)) { + best_score = polisher_score; + polished_model.copyTo(best_model); + } + } + + // ================= here is ending ransac main implementation =========================== + std::vector inliers_mask; + if (params->isMaskRequired()) { + inliers_mask = std::vector(points_size); + // get final inliers from the best model + _quality->getInliers(best_model, inliers_mask); + } + // Store results + ransac_output = RansacOutput::create(best_model, inliers_mask, + static_cast(std::chrono::duration_cast + (std::chrono::steady_clock::now() - begin_time).count()), best_score.score, + best_score.inlier_number, final_iters, -1, -1); + return true; + } +}; + +/* + * pts1, pts2 are matrices either N x a, N x b or a x N or b x N, where N > a and N > b + * pts1 are image points, if pnp pts2 are object points otherwise - image points as well. + * output is matrix of size N x (a + b) + * return points_size = N + */ +int mergePoints (InputArray pts1_, InputArray pts2_, Mat &pts, bool ispnp) { + Mat pts1 = pts1_.getMat(), pts2 = pts2_.getMat(); + auto convertPoints = [] (Mat &points, int pt_dim) { + points.convertTo(points, CV_32F); // convert points to have float precision + if (points.channels() > 1) + points = points.reshape(1, (int)points.total()); // convert point to have 1 channel + if (points.rows < points.cols) + transpose(points, points); // transpose so points will be in rows + CV_CheckGE(points.cols, pt_dim, "Invalid dimension of point"); + if (points.cols != pt_dim) // in case when image points are 3D convert them to 2D + points = points.colRange(0, pt_dim); + }; + + convertPoints(pts1, 2); // pts1 are always image points + convertPoints(pts2, ispnp ? 3 : 2); // for PnP points are 3D + + // points are of size [Nx2 Nx2] = Nx4 for H, F, E + // points are of size [Nx2 Nx3] = Nx5 for PnP + hconcat(pts1, pts2, pts); + return pts.rows; +} + +void saveMask (OutputArray mask, const std::vector &inliers_mask) { + if (mask.needed()) { + const int points_size = (int) inliers_mask.size(); + mask.create(1, points_size, CV_8U); + auto * maskptr = mask.getMat().ptr(); + for (int i = 0; i < points_size; i++) + maskptr[i] = (uchar) inliers_mask[i]; + } +} +void setParameters (Ptr ¶ms, EstimationMethod estimator, const UsacParams &usac_params, + bool mask_needed) { + params = Model::create(usac_params.threshold, estimator, usac_params.sampler, + usac_params.confidence, usac_params.maxIterations, usac_params.score); + params->setLocalOptimization(usac_params.loMethod); + params->setLOSampleSize(usac_params.loSampleSize); + params->setLOIterations(usac_params.loIterations); + params->setParallel(usac_params.isParallel); + params->setNeighborsType(usac_params.neighborsSearch); + params->setRandomGeneratorState(usac_params.randomGeneratorState); + params->maskRequired(mask_needed); +} + +void setParameters (int flag, Ptr ¶ms, EstimationMethod estimator, double thr, + int max_iters, double conf, bool mask_needed) { + switch (flag) { + case USAC_DEFAULT: + params = Model::create(thr, estimator, SamplingMethod::SAMPLING_UNIFORM, conf, max_iters, + ScoreMethod::SCORE_METHOD_MSAC); + params->setLocalOptimization(LocalOptimMethod ::LOCAL_OPTIM_INNER_AND_ITER_LO); + break; + case USAC_MAGSAC: + params = Model::create(thr, estimator, SamplingMethod::SAMPLING_UNIFORM, conf, max_iters, + ScoreMethod::SCORE_METHOD_MAGSAC); + params->setLocalOptimization(LocalOptimMethod ::LOCAL_OPTIM_SIGMA); + params->setLOSampleSize(100); + break; + case USAC_PARALLEL: + params = Model::create(thr, estimator, SamplingMethod::SAMPLING_UNIFORM, conf, max_iters, + ScoreMethod::SCORE_METHOD_MSAC); + params->setParallel(true); + params->setLocalOptimization(LocalOptimMethod ::LOCAL_OPTIM_INNER_LO); + break; + case USAC_ACCURATE: + params = Model::create(thr, estimator, SamplingMethod::SAMPLING_UNIFORM, conf, max_iters, + ScoreMethod::SCORE_METHOD_MSAC); + params->setLocalOptimization(LocalOptimMethod ::LOCAL_OPTIM_GC); + break; + case USAC_FAST: + params = Model::create(thr, estimator, SamplingMethod::SAMPLING_UNIFORM, conf, max_iters, + ScoreMethod::SCORE_METHOD_RANSAC); + params->setLocalOptimization(LocalOptimMethod ::LOCAL_OPTIM_INNER_AND_ITER_LO); + params->setLOIterations(7); + params->setLOIterativeIters(4); + break; + case USAC_PROSAC: + params = Model::create(thr, estimator, SamplingMethod::SAMPLING_PROSAC, conf, max_iters, + ScoreMethod::SCORE_METHOD_MSAC); + params->setLocalOptimization(LocalOptimMethod ::LOCAL_OPTIM_INNER_LO); + break; + case USAC_FM_8PTS: + params = Model::create(thr, EstimationMethod::Fundamental8,SamplingMethod::SAMPLING_UNIFORM, + conf, max_iters,ScoreMethod::SCORE_METHOD_MSAC); + params->setLocalOptimization(LocalOptimMethod ::LOCAL_OPTIM_INNER_LO); + break; + default: CV_Error(cv::Error::StsBadFlag, "Incorrect flag for USAC!"); + } + params->maskRequired(mask_needed); +} + +Mat findHomography (InputArray srcPoints, InputArray dstPoints, int method, double thr, + OutputArray mask, const int max_iters, const double confidence) { + Ptr params; + setParameters(method, params, EstimationMethod::Homography, thr, max_iters, confidence, mask.needed()); + Ptr ransac_output; + if (run(params, srcPoints, dstPoints, params->getRandomGeneratorState(), + ransac_output, noArray(), noArray(), noArray(), noArray())) { + saveMask(mask, ransac_output->getInliersMask()); + return ransac_output->getModel() / ransac_output->getModel().at(2,2); + } else return Mat(); +} + +Mat findFundamentalMat( InputArray points1, InputArray points2, int method, double thr, + double confidence, int max_iters, OutputArray mask ) { + Ptr params; + setParameters(method, params, EstimationMethod::Fundamental, thr, max_iters, confidence, mask.needed()); + Ptr ransac_output; + if (run(params, points1, points2, params->getRandomGeneratorState(), + ransac_output, noArray(), noArray(), noArray(), noArray())) { + saveMask(mask, ransac_output->getInliersMask()); + return ransac_output->getModel(); + } else return Mat(); +} + +Mat findEssentialMat (InputArray points1, InputArray points2, InputArray cameraMatrix1, + int method, double prob, double thr, OutputArray mask) { + Ptr params; + setParameters(method, params, EstimationMethod::Essential, thr, 1000, prob, mask.needed()); + Ptr ransac_output; + if (run(params, points1, points2, params->getRandomGeneratorState(), + ransac_output, cameraMatrix1, cameraMatrix1, noArray(), noArray())) { + saveMask(mask, ransac_output->getInliersMask()); + return ransac_output->getModel(); + } else return Mat(); +} + +bool solvePnPRansac( InputArray objectPoints, InputArray imagePoints, + InputArray cameraMatrix, InputArray distCoeffs, OutputArray rvec, OutputArray tvec, + bool /*useExtrinsicGuess*/, int max_iters, float thr, double conf, + OutputArray mask, int method) { + Ptr params; + setParameters(method, params, cameraMatrix.empty() ? EstimationMethod ::P6P : EstimationMethod ::P3P, + thr, max_iters, conf, mask.needed()); + Ptr ransac_output; + if (run(params, imagePoints, objectPoints, params->getRandomGeneratorState(), + ransac_output, cameraMatrix, noArray(), distCoeffs, noArray())) { + saveMask(mask, ransac_output->getInliersMask()); + const Mat &model = ransac_output->getModel(); + model.col(0).copyTo(rvec); + model.col(1).copyTo(tvec); + return true; + } else return false; +} + +Mat estimateAffine2D(InputArray from, InputArray to, OutputArray mask, int method, + double thr, int max_iters, double conf, int /*refineIters*/) { + Ptr params; + setParameters(method, params, EstimationMethod ::Affine, thr, max_iters, conf, mask.needed()); + Ptr ransac_output; + if (run(params, from, to, params->getRandomGeneratorState(), + ransac_output, noArray(), noArray(), noArray(), noArray())) { + saveMask(mask, ransac_output->getInliersMask()); + return ransac_output->getModel().rowRange(0,2); + } else return Mat(); +} + +class ModelImpl : public Model { +private: + // main parameters: + double threshold, confidence; + int sample_size, max_iterations; + + EstimationMethod estimator; + SamplingMethod sampler; + ScoreMethod score; + + // for neighborhood graph + int k_nearest_neighbors = 8;//, flann_search_params = 5, num_kd_trees = 1; // for FLANN + int cell_size = 25; // pixels, for grid neighbors searching + int radius = 20; // pixels, for radius-search neighborhood graph + NeighborSearchMethod neighborsType = NeighborSearchMethod::NEIGH_GRID; + + // Local Optimization parameters + LocalOptimMethod lo = LocalOptimMethod ::LOCAL_OPTIM_INNER_AND_ITER_LO; + int lo_sample_size=14, lo_inner_iterations=15, lo_iterative_iterations=5, + lo_thr_multiplier=3, lo_iter_sample_size = 30; + + // Graph cut parameters + const double spatial_coherence_term = 0.975; + + // apply polisher for final RANSAC model + PolishingMethod polisher = PolishingMethod ::LSQPolisher; + + // preemptive verification test + VerificationMethod verifier = VerificationMethod ::SprtVerifier; + const int max_hypothesis_test_before_verification = 10; + + // sprt parameters + // lower bound estimate is 1.1% of inliers + double sprt_eps = 0.011, sprt_delta = 0.01, avg_num_models, time_for_model_est; + + // estimator error + ErrorMetric est_error; + + // progressive napsac + double relax_coef = 0.1; + // for building neighborhood graphs + const std::vector grid_cell_number = {16, 8, 4, 2}; + + //for final least squares polisher + int final_lsq_iters = 2; + + bool need_mask = true, is_parallel = false; + int random_generator_state = 0; + + // magsac parameters: + int DoF = 4; + double sigma_quantile = 3.64, upper_incomplete_of_sigma_quantile = 0.00365, + lower_incomplete_of_sigma_quantile = 1.30122, C = 0.25, maximum_thr = 10.; +public: + ModelImpl (double threshold_, EstimationMethod estimator_, SamplingMethod sampler_, double confidence_=0.95, + int max_iterations_=5000, ScoreMethod score_ =ScoreMethod::SCORE_METHOD_MSAC) { + estimator = estimator_; + sampler = sampler_; + confidence = confidence_; + max_iterations = max_iterations_; + score = score_; + + switch (estimator_) { + // time for model estimation is basically a ratio of time need to estimate a model to + // time needed to verify if a point is consistent with this model + case (EstimationMethod::Affine): + avg_num_models = 1; time_for_model_est = 50; + sample_size = 3; est_error = ErrorMetric ::FORW_REPR_ERR; break; + case (EstimationMethod::Homography): + avg_num_models = 1; time_for_model_est = 90; + sample_size = 4; est_error = ErrorMetric ::FORW_REPR_ERR; break; + case (EstimationMethod::Fundamental): + avg_num_models = 2.38; time_for_model_est = 150; maximum_thr = 3; + sample_size = 7; est_error = ErrorMetric ::SAMPSON_ERR; break; + case (EstimationMethod::Fundamental8): + avg_num_models = 1; time_for_model_est = 100; maximum_thr = 3; + sample_size = 8; est_error = ErrorMetric ::SAMPSON_ERR; break; + case (EstimationMethod::Essential): + avg_num_models = 3.93; time_for_model_est = 2000; maximum_thr = 3; + sample_size = 5; est_error = ErrorMetric ::SGD_ERR; break; + case (EstimationMethod::P3P): + avg_num_models = 1.38; time_for_model_est = 800; + sample_size = 3; est_error = ErrorMetric ::RERPOJ; break; + case (EstimationMethod::P6P): + avg_num_models = 1; time_for_model_est = 300; + sample_size = 6; est_error = ErrorMetric ::RERPOJ; break; + default: CV_Assert(0 && "Estimator has not implemented yet!"); + } + + if (estimator_ == EstimationMethod::P3P || estimator_ == EstimationMethod::P6P) { + neighborsType = NeighborSearchMethod::NEIGH_FLANN_KNN; + k_nearest_neighbors = 2; + DoF = 5; + sigma_quantile = 3.88; + upper_incomplete_of_sigma_quantile = 0.00458; + lower_incomplete_of_sigma_quantile = 1.96032; + C = 0.13298; + } + threshold = threshold_; + } + void setVerifier (VerificationMethod verifier_) override { verifier = verifier_; } + void setPolisher (PolishingMethod polisher_) override { polisher = polisher_; } + void setParallel (bool is_parallel_) override { is_parallel = is_parallel_; } + void setError (ErrorMetric error_) override { est_error = error_; } + void setLocalOptimization (LocalOptimMethod lo_) override { lo = lo_; } + void setKNearestNeighhbors (int knn_) override { k_nearest_neighbors = knn_; } + void setNeighborsType (NeighborSearchMethod neighbors) override { neighborsType = neighbors; } + void setCellSize (int cell_size_) override { cell_size = cell_size_; } + void setLOIterations (int iters) override { lo_inner_iterations = iters; } + void setLOIterativeIters (int iters) override {lo_iterative_iterations = iters; } + void setLOSampleSize (int lo_sample_size_) override { lo_sample_size = lo_sample_size_; } + void maskRequired (bool need_mask_) override { need_mask = need_mask_; } + void setRandomGeneratorState (int state) override { random_generator_state = state; } + bool isMaskRequired () const override { return need_mask; } + NeighborSearchMethod getNeighborsSearch () const override { return neighborsType; } + int getKNN () const override { return k_nearest_neighbors; } + ErrorMetric getError () const override { return est_error; } + EstimationMethod getEstimator () const override { return estimator; } + int getSampleSize () const override { return sample_size; } + int getFinalLSQIterations () const override { return final_lsq_iters; } + int getDegreesOfFreedom () const override { return DoF; } + double getSigmaQuantile () const override { return sigma_quantile; } + double getUpperIncompleteOfSigmaQuantile () const override { + return upper_incomplete_of_sigma_quantile; + } + double getLowerIncompleteOfSigmaQuantile () const override { + return lower_incomplete_of_sigma_quantile; + } + double getC () const override { return C; } + double getMaximumThreshold () const override { return maximum_thr; } + double getGraphCutSpatialCoherenceTerm () const override { return spatial_coherence_term; } + int getLOSampleSize () const override { return lo_sample_size; } + int getMaxNumHypothesisToTestBeforeRejection() const override { + return max_hypothesis_test_before_verification; + } + PolishingMethod getFinalPolisher () const override { return polisher; } + int getLOThresholdMultiplier() const override { return lo_thr_multiplier; } + int getLOIterativeSampleSize() const override { return lo_iter_sample_size; } + int getLOIterativeMaxIters() const override { return lo_iterative_iterations; } + int getLOInnerMaxIters() const override { return lo_inner_iterations; } + LocalOptimMethod getLO () const override { return lo; } + ScoreMethod getScore () const override { return score; } + int getMaxIters () const override { return max_iterations; } + double getConfidence () const override { return confidence; } + double getThreshold () const override { return threshold; } + VerificationMethod getVerifier () const override { return verifier; } + SamplingMethod getSampler () const override { return sampler; } + int getRandomGeneratorState () const override { return random_generator_state; } + double getSPRTdelta () const override { return sprt_delta; } + double getSPRTepsilon () const override { return sprt_eps; } + double getSPRTavgNumModels () const override { return avg_num_models; } + int getCellSize () const override { return cell_size; } + int getGraphRadius() const override { return radius; } + double getTimeForModelEstimation () const override { return time_for_model_est; } + double getRelaxCoef () const override { return relax_coef; } + const std::vector &getGridCellNumber () const override { return grid_cell_number; } + bool isParallel () const override { return is_parallel; } + bool isFundamental () const override { + return estimator == EstimationMethod ::Fundamental || + estimator == EstimationMethod ::Fundamental8; + } + bool isHomography () const override { return estimator == EstimationMethod ::Homography; } + bool isEssential () const override { return estimator == EstimationMethod ::Essential; } + bool isPnP() const override { + return estimator == EstimationMethod ::P3P || estimator == EstimationMethod ::P6P; + } +}; + +Ptr Model::create(double threshold_, EstimationMethod estimator_, SamplingMethod sampler_, + double confidence_, int max_iterations_, ScoreMethod score_) { + return makePtr(threshold_, estimator_, sampler_, confidence_, + max_iterations_, score_); +} + +bool run (const Ptr ¶ms, InputArray points1, InputArray points2, int state, + Ptr &ransac_output, InputArray K1_, InputArray K2_, + InputArray dist_coeff1, InputArray dist_coeff2) { + Ptr error; + Ptr estimator; + Ptr graph; + Ptr degeneracy; + Ptr quality; + Ptr verifier; + Ptr sampler; + Ptr lo_sampler; + Ptr termination; + Ptr lo; + Ptr polisher; + Ptr min_solver; + Ptr non_min_solver; + + Mat points, K1, K2, calib_points, undist_points1, undist_points2; + int points_size; + double threshold = params->getThreshold(), max_thr = params->getMaximumThreshold(); + const int min_sample_size = params->getSampleSize(); + if (params->isPnP()) { + if (! K1_.empty()) { + K1 = K1_.getMat(); K1.convertTo(K1, CV_64F); + if (! dist_coeff1.empty()) { + // undistortPoints also calibrate points using K + undistortPoints(points1, undist_points1, K1_, dist_coeff1); + points_size = mergePoints(undist_points1, points2, points, true); + Utils::normalizeAndDecalibPointsPnP (K1, points, calib_points); + } else { + points_size = mergePoints(points1, points2, points, true); + Utils::calibrateAndNormalizePointsPnP(K1, points, calib_points); + } + } else + points_size = mergePoints(points1, points2, points, true); + } else { + if (params->isEssential()) { + CV_CheckEQ(!K1_.empty() && !K2_.empty(), true, "Intrinsic matrix must not be empty!"); + K1 = K1_.getMat(); K1.convertTo(K1, CV_64F); + K2 = K2_.getMat(); K2.convertTo(K2, CV_64F); + if (! dist_coeff1.empty() || ! dist_coeff2.empty()) { + // undistortPoints also calibrate points using K + cv::undistortPoints(points1, undist_points1, K1_, dist_coeff1); + cv::undistortPoints(points2, undist_points2, K2_, dist_coeff2); + points_size = mergePoints(undist_points1, undist_points2, calib_points, false); + } else { + points_size = mergePoints(points1, points2, points, false); + Utils::calibratePoints(K1, K2, points, calib_points); + } + threshold = Utils::getCalibratedThreshold(threshold, K1, K2); + max_thr = Utils::getCalibratedThreshold(max_thr, K1, K2); + } else + points_size = mergePoints(points1, points2, points, false); + } + + // Since error function output squared error distance, so make + // threshold squared as well + threshold *= threshold; + + if (params->getSampler() == SamplingMethod::SAMPLING_NAPSAC || params->getLO() == LocalOptimMethod::LOCAL_OPTIM_GC) { + if (params->getNeighborsSearch() == NeighborSearchMethod::NEIGH_GRID) { + graph = GridNeighborhoodGraph::create(points, points_size, + params->getCellSize(), params->getCellSize(), + params->getCellSize(), params->getCellSize()); + } else if (params->getNeighborsSearch() == NeighborSearchMethod::NEIGH_FLANN_KNN) { + graph = FlannNeighborhoodGraph::create(points, points_size,params->getKNN(), false, 5, 1); + } else if (params->getNeighborsSearch() == NeighborSearchMethod::NEIGH_FLANN_RADIUS) { + graph = RadiusSearchNeighborhoodGraph::create(points, points_size, + params->getGraphRadius(), 5, 1); + } else CV_Error(cv::Error::StsNotImplemented, "Graph type is not implemented!"); + } + + std::vector> layers; + if (params->getSampler() == SamplingMethod::SAMPLING_PROGRESSIVE_NAPSAC) { + CV_CheckEQ(params->isPnP(), false, "ProgressiveNAPSAC for PnP is not implemented!"); + const auto &cell_number_per_layer = params->getGridCellNumber(); + layers.reserve(cell_number_per_layer.size()); + const auto * const pts = (float *) points.data; + float img1_width = 0, img1_height = 0, img2_width = 0, img2_height = 0; + for (int i = 0; i < 4 * points_size; i += 4) { + if (pts[i ] > img1_width ) img1_width = pts[i ]; + if (pts[i + 1] > img1_height) img1_height = pts[i + 1]; + if (pts[i + 2] > img2_width ) img2_width = pts[i + 2]; + if (pts[i + 3] > img2_height) img2_height = pts[i + 3]; + } + // Create grid graphs (overlapping layes of given cell numbers) + for (int layer_idx = 0; layer_idx < (int)cell_number_per_layer.size(); layer_idx++) { + const int cell_number = cell_number_per_layer[layer_idx]; + if (layer_idx > 0) + if (cell_number_per_layer[layer_idx-1] <= cell_number) + CV_Error(cv::Error::StsError, "Progressive NAPSAC sampler: " + "Cell number in layers must be in decreasing order!"); + layers.emplace_back(GridNeighborhoodGraph::create(points, points_size, + (int)(img1_width / (float)cell_number), (int)(img1_height / (float)cell_number), + (int)(img2_width / (float)cell_number), (int)(img2_height / (float)cell_number))); + } + } + + // update points by calibrated for Essential matrix after graph is calculated + if (params->isEssential()) { + points = calib_points; + // if maximum calibrated threshold significanlty differs threshold then set upper bound + if (max_thr > 10*threshold) + max_thr = 10*threshold; + } + + switch (params->getError()) { + case ErrorMetric::SYMM_REPR_ERR: + error = ReprojectionErrorSymmetric::create(points); break; + case ErrorMetric::FORW_REPR_ERR: + if (params->getEstimator() == EstimationMethod::Affine) + error = ReprojectionErrorAffine::create(points); + else error = ReprojectionErrorForward::create(points); + break; + case ErrorMetric::SAMPSON_ERR: + error = SampsonError::create(points); break; + case ErrorMetric::SGD_ERR: + error = SymmetricGeometricDistance::create(points); break; + case ErrorMetric::RERPOJ: + error = ReprojectionErrorPmatrix::create(points); break; + default: CV_Error(cv::Error::StsNotImplemented , "Error metric is not implemented!"); + } + + switch (params->getScore()) { + case ScoreMethod::SCORE_METHOD_RANSAC : + quality = RansacQuality::create(points_size, threshold, error); break; + case ScoreMethod::SCORE_METHOD_MSAC : + quality = MsacQuality::create(points_size, threshold, error); break; + case ScoreMethod::SCORE_METHOD_MAGSAC : + quality = MagsacQuality::create(max_thr, points_size, error, + threshold, params->getDegreesOfFreedom(), params->getSigmaQuantile(), + params->getUpperIncompleteOfSigmaQuantile(), + params->getLowerIncompleteOfSigmaQuantile(), params->getC()); break; + case ScoreMethod::SCORE_METHOD_LMEDS : + quality = LMedsQuality::create(points_size, threshold, error); break; + default: CV_Error(cv::Error::StsNotImplemented, "Score is not imeplemeted!"); + } + + if (params->isHomography()) { + degeneracy = HomographyDegeneracy::create(points); + min_solver = HomographyMinimalSolver4ptsGEM::create(points); + non_min_solver = HomographyNonMinimalSolver::create(points); + estimator = HomographyEstimator::create(min_solver, non_min_solver, degeneracy); + } else if (params->isFundamental()) { + degeneracy = FundamentalDegeneracy::create(state++, quality, points, min_sample_size, 5. /*sqr homogr thr*/); + if(min_sample_size == 7) min_solver = FundamentalMinimalSolver7pts::create(points); + else min_solver = FundamentalMinimalSolver8pts::create(points); + non_min_solver = FundamentalNonMinimalSolver::create(points); + estimator = FundamentalEstimator::create(min_solver, non_min_solver, degeneracy); + } else if (params->isEssential()) { + degeneracy = EssentialDegeneracy::create(points, min_sample_size); + min_solver = EssentialMinimalSolverStewenius5pts::create(points); + non_min_solver = EssentialNonMinimalSolver::create(points); + estimator = EssentialEstimator::create(min_solver, non_min_solver, degeneracy); + } else if (params->isPnP()) { + degeneracy = makePtr(); + if (min_sample_size == 3) { + non_min_solver = DLSPnP::create(points, calib_points, K1); + min_solver = P3PSolver::create(points, calib_points, K1); + } else { + min_solver = PnPMinimalSolver6Pts::create(points); + non_min_solver = PnPNonMinimalSolver::create(points); + } + estimator = PnPEstimator::create(min_solver, non_min_solver); + } else if (params->getEstimator() == EstimationMethod::Affine) { + degeneracy = makePtr(); + min_solver = AffineMinimalSolver::create(points); + non_min_solver = AffineNonMinimalSolver::create(points); + estimator = AffineEstimator::create(min_solver, non_min_solver); + } else CV_Error(cv::Error::StsNotImplemented, "Estimator not implemented!"); + + switch (params->getSampler()) { + case SamplingMethod::SAMPLING_UNIFORM: + sampler = UniformSampler::create(state++, min_sample_size, points_size); break; + case SamplingMethod::SAMPLING_PROSAC: + sampler = ProsacSampler::create(state++, points_size, min_sample_size, 200000); break; + case SamplingMethod::SAMPLING_PROGRESSIVE_NAPSAC: + sampler = ProgressiveNapsac::create(state++, points_size, min_sample_size, layers, 20); break; + case SamplingMethod::SAMPLING_NAPSAC: + sampler = NapsacSampler::create(state++, points_size, min_sample_size, graph); break; + default: CV_Error(cv::Error::StsNotImplemented, "Sampler is not implemented!"); + } + + switch (params->getVerifier()) { + case VerificationMethod::NullVerifier: verifier = ModelVerifier::create(); break; + case VerificationMethod::SprtVerifier: + verifier = SPRT::create(state++, error, points_size, params->getScore() == ScoreMethod ::SCORE_METHOD_MAGSAC ? max_thr : threshold, + params->getSPRTepsilon(), params->getSPRTdelta(), params->getTimeForModelEstimation(), + params->getSPRTavgNumModels(), params->getScore()); break; + default: CV_Error(cv::Error::StsNotImplemented, "Verifier is not imeplemented!"); + } + + if (params->getSampler() == SamplingMethod::SAMPLING_PROSAC) { + termination = ProsacTerminationCriteria::create(sampler.dynamicCast(), error, + points_size, min_sample_size, params->getConfidence(), + params->getMaxIters(), 100, 0.05, 0.05, threshold); + } else if (params->getSampler() == SamplingMethod::SAMPLING_PROGRESSIVE_NAPSAC) { + if (params->getVerifier() == VerificationMethod::SprtVerifier) + termination = SPRTPNapsacTermination::create(((SPRT *)verifier.get())->getSPRTvector(), + params->getConfidence(), points_size, min_sample_size, + params->getMaxIters(), params->getRelaxCoef()); + else + termination = StandardTerminationCriteria::create (params->getConfidence(), + points_size, min_sample_size, params->getMaxIters()); + } else if (params->getVerifier() == VerificationMethod::SprtVerifier) { + termination = SPRTTermination::create(((SPRT *) verifier.get())->getSPRTvector(), + params->getConfidence(), points_size, min_sample_size, params->getMaxIters()); + } else + termination = StandardTerminationCriteria::create + (params->getConfidence(), points_size, min_sample_size, params->getMaxIters()); + + if (params->getLO() != LocalOptimMethod::LOCAL_OPTIM_NULL) { + lo_sampler = UniformRandomGenerator::create(state++, points_size, params->getLOSampleSize()); + switch (params->getLO()) { + case LocalOptimMethod::LOCAL_OPTIM_INNER_LO: + lo = InnerIterativeLocalOptimization::create(estimator, quality, lo_sampler, + points_size, threshold, false, params->getLOIterativeSampleSize(), + params->getLOInnerMaxIters(), params->getLOIterativeMaxIters(), + params->getLOThresholdMultiplier()); break; + case LocalOptimMethod::LOCAL_OPTIM_INNER_AND_ITER_LO: + lo = InnerIterativeLocalOptimization::create(estimator, quality, lo_sampler, + points_size, threshold, true, params->getLOIterativeSampleSize(), + params->getLOInnerMaxIters(), params->getLOIterativeMaxIters(), + params->getLOThresholdMultiplier()); break; + case LocalOptimMethod::LOCAL_OPTIM_GC: + lo = GraphCut::create(estimator, error, quality, graph, lo_sampler, threshold, + params->getGraphCutSpatialCoherenceTerm(), params->getLOInnerMaxIters()); break; + case LocalOptimMethod::LOCAL_OPTIM_SIGMA: + lo = SigmaConsensus::create(estimator, error, quality, verifier, params->getLOSampleSize(), 1, + params->getDegreesOfFreedom(), params->getSigmaQuantile(), + params->getUpperIncompleteOfSigmaQuantile(), params->getC(), max_thr); break; + default: CV_Error(cv::Error::StsNotImplemented , "Local Optimization is not implemented!"); + } + } + + if (params->getFinalPolisher() == PolishingMethod::LSQPolisher) + polisher = LeastSquaresPolishing::create(estimator, quality, params->getFinalLSQIterations()); + + Ransac ransac (params, points_size, estimator, quality, sampler, + termination, verifier, degeneracy, lo, polisher, params->isParallel(), state); + if (ransac.run(ransac_output)) { + if (params->isPnP()) { + // convert R to rodrigues and back and recalculate inliers which due to numerical + // issues can differ + Mat out, R, newR, newP, t, rvec; + if (K1.empty()) { + usac::Utils::decomposeProjection (ransac_output->getModel(), K1, R, t); + Rodrigues(R, rvec); + hconcat(rvec, t, out); + hconcat(out, K1, out); + } else { + const Mat Rt = K1.inv() * ransac_output->getModel(); + t = Rt.col(3); + Rodrigues(Rt.colRange(0,3), rvec); + hconcat(rvec, t, out); + } + Rodrigues(rvec, newR); + hconcat(K1 * newR, K1 * t, newP); + std::vector inliers_mask(points_size); + quality->getInliers(newP, inliers_mask); + ransac_output = RansacOutput::create(out, inliers_mask, 0,0,0,0,0,0); + } + return true; + } + return false; +} +}} \ No newline at end of file diff --git a/modules/calib3d/src/usac/sampler.cpp b/modules/calib3d/src/usac/sampler.cpp new file mode 100644 index 0000000..42fb1e7 --- /dev/null +++ b/modules/calib3d/src/usac/sampler.cpp @@ -0,0 +1,548 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#include "../precomp.hpp" +#include "../usac.hpp" + +namespace cv { namespace usac { +/* +* Uniform Sampler: +* Choose uniformly m (sample size) points from N (points size). +* Uses Fisher-Yates shuffle. +*/ +class UniformSamplerImpl : public UniformSampler { +private: + std::vector points_random_pool; + int sample_size, random_pool_size, points_size = 0; + RNG rng; +public: + + UniformSamplerImpl (int state, int sample_size_, int points_size_) : rng(state) { + sample_size = sample_size_; + setPointsSize (points_size_); + } + void setNewPointsSize (int points_size_) override { + setPointsSize(points_size_); + } + void generateSample (std::vector &sample) override { + random_pool_size = points_size; // random points of entire range + for (int i = 0; i < sample_size; i++) { + // get random point index + const int array_random_index = rng.uniform(0, random_pool_size); + // get point by random index + // store sample + sample[i] = points_random_pool[array_random_index]; + // swap random point with the end of random pool + std::swap(points_random_pool[array_random_index], + points_random_pool[--random_pool_size]); + } + } + Ptr clone (int state) const override { + return makePtr(state, sample_size, points_size); + } +private: + void setPointsSize (int points_size_) { + CV_Assert (sample_size <= points_size_); + + if (points_size_ > points_size) + points_random_pool = std::vector(points_size_); + + if (points_size != points_size_) { + points_size = points_size_; + + for (int i = 0; i < points_size; i++) + points_random_pool[i] = i; + } + } +}; +Ptr UniformSampler::create(int state, int sample_size_, int points_size_) { + return makePtr(state, sample_size_, points_size_); +} + +/////////////////////////////////// PROSAC (SIMPLE) SAMPLER /////////////////////////////////////// +/* +* PROSAC (simple) sampler does not use array of precalculated T_n (n is subset size) samples, but computes T_n for +* specific n directy in generateSample() function. +* Also, the stopping length (or maximum subset size n*) by default is set to points_size (N) and does not updating +* during computation. +*/ +class ProsacSimpleSamplerImpl : public ProsacSimpleSampler { +protected: + int points_size, subset_size, t_n_prime, kth_sample_number, + max_prosac_samples_count, largest_sample_size, sample_size; + double t_n; + Ptr random_gen; +public: + ProsacSimpleSamplerImpl (int state, int points_size_, int sample_size_, + int max_prosac_samples_count_) : random_gen(UniformRandomGenerator::create(state)) { + + CV_Assert(sample_size_ <= points_size_); + sample_size = sample_size_; + points_size = points_size_; + max_prosac_samples_count = max_prosac_samples_count_; + initialize (); + } + + void generateSample (std::vector &sample) override { + if (kth_sample_number > max_prosac_samples_count) { + // do uniform sampling, if prosac has not found solution + random_gen->generateUniqueRandomSet(sample, sample_size, points_size); + return; + } + + kth_sample_number++; // t := t + 1 + + // Choice of the hypothesis generation set + if (kth_sample_number >= t_n_prime && subset_size < largest_sample_size) { + // do not use array of growth sample, calculate it directly + double t_n_plus1 = (subset_size + 1) * t_n / (subset_size + 1 - sample_size); + t_n_prime += static_cast(ceil(t_n_plus1 - t_n)); + t_n = t_n_plus1; + subset_size++; + } + + // Semi-random sample Mt of size m + if (t_n_prime < kth_sample_number) { + random_gen->generateUniqueRandomSet(sample, sample_size, subset_size); + } else { + random_gen->generateUniqueRandomSet(sample, sample_size-1, subset_size-1); + sample[sample_size-1] = subset_size-1; // Make the last point from the nth position. + } + } + + // Set the sample such that you are sampling the kth prosac sample (Eq. 6). + void setSampleNumber (int k) { + kth_sample_number = k; + + // If the method should act exactly like RANSAC + if (kth_sample_number > max_prosac_samples_count) + return; + else { // Increment the size of the sampling pool while required + t_n = max_prosac_samples_count; + t_n_prime = 1; // reset growth function + subset_size = sample_size; // reset subset size as from the beginning + for (int i = 0; i < sample_size; i++) + t_n *= static_cast(subset_size - i) / (points_size - i); + + while (kth_sample_number > t_n_prime) { // t_n_prime == growth_function + double t_n_plus1 = static_cast(subset_size + 1) * t_n / (subset_size + 1 - sample_size); + t_n_prime += static_cast(ceil(t_n_plus1 - t_n)); + t_n = t_n_plus1; + subset_size++; + } + if (subset_size > points_size) + subset_size = points_size; + } + } + + void setNewPointsSize (int points_size_) override { + CV_Assert(sample_size <= points_size_); + points_size = points_size_; + initialize (); + } + Ptr clone (int state) const override { + return makePtr(state, points_size, sample_size, + max_prosac_samples_count); + } +private: + void initialize () { + largest_sample_size = points_size; // termination length, n* + subset_size = sample_size; // n + t_n = max_prosac_samples_count; + t_n_prime = 1; + + // From Equations leading up to Eq 3 in Chum et al. + // t_n samples containing only data points from U_n and + // t_n+1 samples containing only data points from U_n+1 + for (int i = 0; i < sample_size; i++) + t_n *= static_cast(subset_size - i) / (points_size - i); + + kth_sample_number = 0; + } +}; +Ptr ProsacSimpleSampler::create(int state, int points_size_, int sample_size_, + int max_prosac_samples_count_) { + return makePtr(state, points_size_, sample_size_, + max_prosac_samples_count_); +} + +////////////////////////////////////// PROSAC SAMPLER //////////////////////////////////////////// +class ProsacSamplerImpl : public ProsacSampler { +protected: + std::vector growth_function; + + // subset_size = size of sampling range (subset of good sorted points) + // termination_length = n*, maximum sampling range (largest subset size) + int points_size, sample_size, subset_size, termination_length; + + // it is T_N + // Imagine standard RANSAC drawing T_N samples of size m out of N data points + // In our experiments, the parameter was set to T_N = 200000 + int growth_max_samples; + + // how many time PROSAC generateSample() was called + int kth_sample_number; + Ptr random_gen; +public: + void setTerminationLength (int termination_length_) override { + termination_length = termination_length_; + } + + // return constant reference to prosac termination criteria + int getKthSample () const override { + return kth_sample_number; + } + + // return constant points of growth function to prosac termination criteria + const std::vector & getGrowthFunction () const override { + return growth_function; + } + + ProsacSamplerImpl (int state, int points_size_, int sample_size_, + int growth_max_samples_) : random_gen(UniformRandomGenerator::create(state)) { + CV_Assert(sample_size_ <= points_size_); + + sample_size = sample_size_; + points_size = points_size_; + + growth_max_samples = growth_max_samples_; + growth_function = std::vector(points_size); + + kth_sample_number = 0; + + // The data points in U_N are sorted in descending order w.r.t. the quality function q. + // Let {Mi}i = 1...T_N denote the sequence of samples Mi c U_N that are uniformly drawn by Ransac. + + // Let T_n be an average number of samples from {Mi}i=1...T_N that contain data points from U_n only. + // compute initial value for T_n + // n - i + // T_n = T_N * Product i = 0...m-1 -------, n >= sample size, N = points size + // N - i + double T_n = growth_max_samples; + for (int i = 0; i < sample_size; i++) + T_n *= static_cast (sample_size-i) / (points_size-i); + + int T_n_prime = 1; + + // fill growth function with T'_n until sample_size + for (int n = 0; n < sample_size; n++) + growth_function[n] = T_n_prime; + + // compute values using recurrent relation + // n + 1 + // T(n+1) = --------- T(n), m is sample size. + // n + 1 - m + + // growth function is defined as + // g(t) = min {n, T'_(n) >= t} + // T'_(n+1) = T'_(n) + (T_(n+1) - T_(n)) + // T'_m = 1 + for (int n = sample_size; n < points_size; n++) { + double Tn_plus1 = static_cast(n + 1) * T_n / (n + 1 - sample_size); + growth_function[n] = T_n_prime + (int) ceil(Tn_plus1 - T_n); // T'_{n+1} + + // update + T_n = Tn_plus1; + T_n_prime = growth_function[n]; // T'_{n+1} + } + + // other initializations + termination_length = points_size; // n* = N, largest set sampled in PROSAC (termination length) + subset_size = sample_size; // n, size of the current sampling pool + kth_sample_number = 0; // t (iteration) + } + + void generateSample (std::vector &sample) override { + // std::cout << "PROSAC sampler, termination length " << termination_length << "\n"; + + if (kth_sample_number > growth_max_samples) { + // if PROSAC has not converged to solution then do uniform sampling. + random_gen->generateUniqueRandomSet(sample, sample_size, points_size); + return; + } + + kth_sample_number++; // t := t + 1 + + // Choice of the hypothesis generation set + // if (t = T'_n) & (n < n*) then n = n + 1 (eqn. 4) + if (kth_sample_number == growth_function[subset_size-1] && subset_size < termination_length) + subset_size++; + + // Semi-random sample M_t of size m + // if T'n < t then + if (growth_function[subset_size-1] < kth_sample_number) { + // The sample contains m-1 points selected from U_(n-1) at random and u_n + random_gen->generateUniqueRandomSet(sample, sample_size-1, subset_size-1); + sample[sample_size-1] = subset_size-1; + } else { + // Select m points from U_n at random. + random_gen->generateUniqueRandomSet(sample, sample_size, subset_size); + } + } + + // Set the sample such that you are sampling the kth prosac sample (Eq. 6). + void setSampleNumber (int k) { + kth_sample_number = k; + + // If the method should act exactly like RANSAC + if (kth_sample_number > growth_max_samples) + return; + else { // Increment the size of the sampling pool while required + subset_size = sample_size; // reset subset size as from the beginning + while (kth_sample_number > growth_function[subset_size-1]) { + subset_size++; + if (subset_size >= points_size){ + subset_size = points_size; + break; + } + } + if (termination_length < subset_size) + termination_length = subset_size; + } + } + + void setNewPointsSize (int /*points_size_*/) override { + CV_Error(cv::Error::StsError, "Changing points size in PROSAC requires to change also " + "termination criteria! Use PROSAC simpler version"); + } + Ptr clone (int state) const override { + return makePtr(state, points_size, sample_size, + growth_max_samples); + } +}; + +Ptr ProsacSampler::create(int state, int points_size_, int sample_size_, + int growth_max_samples_) { + return makePtr(state, points_size_, sample_size_, growth_max_samples_); +} + +////////////////////////////////////// P-NAPSAC SAMPLER //////////////////////////////////////////// +class ProgressiveNapsacImpl : public ProgressiveNapsac { +private: + int max_progressive_napsac_iterations, points_size; + // how many times generateSample() was called. + int kth_sample_number, grid_layers_number, sample_size, sampler_length; + + const Ptr random_generator; + ProsacSamplerImpl one_point_prosac, prosac_sampler; + + // The overlapping neighborhood layers + const std::vector> * layers; + + std::vector growth_function; + std::vector hits_per_point; // number of iterations, t + std::vector subset_size_per_point; // k + std::vector current_layer_per_point; // layer of grid neighborhood graph +public: + + // points must be sorted + ProgressiveNapsacImpl (int state,int points_size_, int sample_size_, + const std::vector> &layers_, int sampler_length_) : + // initialize one-point prosac sampler and global prosac sampler + random_generator (UniformRandomGenerator::create(state)), + one_point_prosac (random_generator->getRandomNumber(INT_MAX), points_size_, + 1 /* sample_size*/,points_size_), + prosac_sampler (random_generator->getRandomNumber(INT_MAX), points_size_, + sample_size_, 200000), layers(&layers_) { + CV_Assert(sample_size_ <= points_size_); + sample_size = sample_size_; + points_size = points_size_; + sampler_length = sampler_length_; + grid_layers_number = static_cast(layers_.size()); + + // Create growth function for P-NAPSAC + growth_function = std::vector(points_size); + + // 20 is sampler_length = The length of fully blending to global sampling + max_progressive_napsac_iterations = sampler_length * points_size; + + const int local_sample_size = sample_size - 1; // not including initial point + double T_n = max_progressive_napsac_iterations; + for (int i = 0; i < local_sample_size; i++) + T_n *= static_cast (local_sample_size - i) / (points_size - i); + + // calculate growth function by recurrent relation (see PROSAC) + int T_n_prime = 1; + for (int n = 0; n < points_size; n++) { + if (n + 1 <= local_sample_size) { + growth_function[n] = T_n_prime; + continue; + } + double Tn_plus1 = (n+1) * T_n / (n + 1 - local_sample_size); + growth_function[n] = T_n_prime + static_cast(ceil(Tn_plus1 - T_n)); + T_n = Tn_plus1; + T_n_prime = growth_function[n]; + } + + subset_size_per_point = std::vector(points_size, sample_size); // subset size + hits_per_point = std::vector(points_size, 0); // 0 hits + current_layer_per_point = std::vector(points_size, 0); // 0-th layer + + kth_sample_number = 0; // iteration + } + + void generateSample (std::vector &sample) override { + // Do completely global sampling (PROSAC is used now), instead of Progressive NAPSAC, + // if the maximum iterations has been done without finding the sought model. + if (kth_sample_number > max_progressive_napsac_iterations) { + prosac_sampler.generateSample(sample); + return; + } + + kth_sample_number++; + + // get PROSAC one-point sample (initial point) + one_point_prosac.generateSample(sample); + const int initial_point = sample[0]; + + // get hits number and subset size (i.e., the size of the neighborhood sphere) + // of initial point (note, get by reference) + int &iters_of_init_pt = ++hits_per_point[initial_point]; // t := t + 1, increase iteration + int &subset_size_of_init_pt = subset_size_per_point[initial_point]; + + while (iters_of_init_pt > growth_function[subset_size_of_init_pt - 1] && subset_size_of_init_pt < points_size) + subset_size_of_init_pt++; + + // Get layer of initial point (note, get by reference) + int ¤t_layer = current_layer_per_point[initial_point]; + + bool is_last_layer = false; + do {// Try to find the grid which contains enough points + // In the case when the grid with a single cell is used, + // apply PROSAC. + if (current_layer >= grid_layers_number) { + is_last_layer = true; + break; + } + + // If there are not enough points in the cell, start using a + // less fine grid. + if ((int)layers->at(current_layer)->getNeighbors(initial_point).size() < subset_size_of_init_pt) { + ++current_layer; // Jump to the next layer with bigger cells. + continue; + } + // If the procedure got to this point, there is no reason to choose a different layer of grids + // since the current one has enough points. + break; + } while (true); + + // If not the last layer has been chosen, sample from the neighbors of the initially selected point. + if (!is_last_layer) { + // The indices of the points which are in the same cell as the + // initially selected one. + const std::vector &neighbors = layers->at(current_layer)->getNeighbors(initial_point); + + // Put the selected point to the end of the sample array to avoid + // being overwritten when sampling the remaining points. + sample[sample_size - 1] = initial_point; + + // The next point should be the farthest one from the initial point. Note that the points in the grid cell are + // not ordered w.r.t. to their distances from the initial point. However, they are ordered as in PROSAC. + sample[sample_size - 2] = neighbors[subset_size_of_init_pt - 1]; + + // Select n - 2 points randomly + random_generator->generateUniqueRandomSet(sample, sample_size - 2, subset_size_of_init_pt - 1); + + for (int i = 0; i < sample_size - 2; i++) { + sample[i] = neighbors[sample[i]]; // Replace the neighbor index by the index of the point + ++hits_per_point[sample[i]]; // Increase the hit number of each selected point + } + ++hits_per_point[sample[sample_size - 2]]; // Increase the hit number of each selected point + } + // If the last layer (i.e., the layer with a single cell) has been chosen, do global sampling + // by PROSAC sampler. + else { + // last layer, all points are neighbors + // If local sampling + prosac_sampler.setSampleNumber(kth_sample_number); + prosac_sampler.generateSample (sample); + sample[sample_size - 1] = initial_point; + } + } + + void setNewPointsSize (int /*points_size_*/) override { + CV_Error(cv::Error::StsError, "Changing points size requires changing neighborhood graph! " + "You must reinitialize P-NAPSAC!"); + } + Ptr clone (int state) const override { + return makePtr(state, points_size, sample_size, *layers, + sampler_length); + } +}; +Ptr ProgressiveNapsac::create(int state, int points_size_, int sample_size_, + const std::vector> &layers, int sampler_length_) { + return makePtr(state, points_size_, sample_size_, + layers, sampler_length_); +} + +////////////////////// N adjacent points sample consensus (NAPSAC) SAMPLER //////////////////////// +class NapsacSamplerImpl : public NapsacSampler { +private: + const Ptr neighborhood_graph; + const Ptr random_generator; + bool do_uniform = false; + std::vector points_large_neighborhood; + int points_large_neighborhood_size, points_size, sample_size; +public: + + NapsacSamplerImpl (int state, int points_size_, int sample_size_, + const Ptr &neighborhood_graph_) : + neighborhood_graph (neighborhood_graph_), + random_generator(UniformRandomGenerator::create(state, points_size_, sample_size_)) { + + CV_Assert(points_size_ >= sample_size_); + + points_size = points_size_; + sample_size = sample_size_; + points_large_neighborhood = std::vector(points_size); + + points_large_neighborhood_size = 0; + + // find indicies of points that have sufficient neighborhood (at least sample_size-1) + for (int pt_idx = 0; pt_idx < points_size; pt_idx++) + if ((int)neighborhood_graph->getNeighbors(pt_idx).size() >= sample_size-1) + points_large_neighborhood[points_large_neighborhood_size++] = pt_idx; + + // if no points with sufficient neighborhood then do only uniform sampling + if (points_large_neighborhood_size == 0) + do_uniform = true; + + // set random generator to generate random points of sample_size-1 + random_generator->setSubsetSize(sample_size-1); + } + + void generateSample (std::vector &sample) override { + if (do_uniform) + // uniform sampling + random_generator->generateUniqueRandomSet(sample, points_size); + else { + // Take uniformly one initial point from points with sufficient neighborhood + int initial_point = points_large_neighborhood + [random_generator->getRandomNumber(points_large_neighborhood_size)]; + + const std::vector &neighbors = neighborhood_graph->getNeighbors(initial_point); + + // select random neighbors of initial point + random_generator->generateUniqueRandomSet(sample, (int)neighbors.size()); + for (int i = 0; i < sample_size-1; i++) + sample[i] = neighbors[sample[i]]; + + // sample includes initial point too. + sample[sample_size-1] = initial_point; + } + } + + void setNewPointsSize (int /*points_size_*/) override { + CV_Error(cv::Error::StsError, "Changing points size requires changing neighborhood graph!" + " You must reinitialize NAPSAC!"); + } + Ptr clone (int state) const override { + return makePtr(state, points_size, sample_size, neighborhood_graph); + } +}; +Ptr NapsacSampler::create(int state, int points_size_, int sample_size_, + const Ptr &neighborhood_graph_) { + return makePtr(state, points_size_, sample_size_, neighborhood_graph_); +} +}} diff --git a/modules/calib3d/src/usac/termination.cpp b/modules/calib3d/src/usac/termination.cpp new file mode 100644 index 0000000..6c341a9 --- /dev/null +++ b/modules/calib3d/src/usac/termination.cpp @@ -0,0 +1,378 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#include "../precomp.hpp" +#include "../usac.hpp" + +namespace cv { namespace usac { +////////////////////////////////// STANDARD TERMINATION /////////////////////////////////////////// +class StandardTerminationCriteriaImpl : public StandardTerminationCriteria { +private: + const double log_confidence; + const int points_size, sample_size, MAX_ITERATIONS; +public: + StandardTerminationCriteriaImpl (double confidence, int points_size_, + int sample_size_, int max_iterations_) : + log_confidence(log(1 - confidence)), points_size (points_size_), + sample_size (sample_size_), MAX_ITERATIONS(max_iterations_) {} + + /* + * Get upper bound iterations for any sample number + * n is points size, w is inlier ratio, p is desired probability, k is expceted number of iterations. + * 1 - p = (1 - w^n)^k, + * k = log_(1-w^n) (1-p) + * k = ln (1-p) / ln (1-w^n) + * + * w^n is probability that all N points are inliers. + * (1 - w^n) is probability that at least one point of N is outlier. + * 1 - p = (1-w^n)^k is probability that in K steps of getting at least one outlier is 1% (5%). + */ + int update (const Mat &/*model*/, int inlier_number) override { + const double predicted_iters = log_confidence / log(1 - std::pow + (static_cast(inlier_number) / points_size, sample_size)); + + // if inlier_prob == 1 then log(0) = -inf, predicted_iters == -0 + // if inlier_prob == 0 then log(1) = 0 , predicted_iters == (+-) inf + + if (! std::isinf(predicted_iters) && predicted_iters < MAX_ITERATIONS) + return static_cast(predicted_iters); + return MAX_ITERATIONS; + } + + Ptr clone () const override { + return makePtr(1-exp(log_confidence), points_size, + sample_size, MAX_ITERATIONS); + } +}; +Ptr StandardTerminationCriteria::create(double confidence, + int points_size_, int sample_size_, int max_iterations_) { + return makePtr(confidence, points_size_, + sample_size_, max_iterations_); +} + +/////////////////////////////////////// SPRT TERMINATION ////////////////////////////////////////// +class SPRTTerminationImpl : public SPRTTermination { +private: + const std::vector &sprt_histories; + const double log_eta_0; + const int points_size, sample_size, MAX_ITERATIONS; +public: + SPRTTerminationImpl (const std::vector &sprt_histories_, double confidence, + int points_size_, int sample_size_, int max_iterations_) + : sprt_histories (sprt_histories_), log_eta_0(log(1-confidence)), + points_size (points_size_), sample_size (sample_size_),MAX_ITERATIONS(max_iterations_){} + + /* + * Termination criterion: + * l is number of tests + * n(l) = Product from i = 0 to l ( 1 - P_g (1 - A(i)^(-h(i)))^k(i) ) + * log n(l) = sum from i = 0 to l k(i) * ( 1 - P_g (1 - A(i)^(-h(i))) ) + * + * log (n0) - log (n(l-1)) + * k(l) = ----------------------- (9) + * log (1 - P_g*A(l)^-1) + * + * A is decision threshold + * P_g is probability of good model. + * k(i) is number of samples verified by i-th sprt. + * n0 is typically set to 0.05 + * this equation does not have to be evaluated before nR < n0 + * nR = (1 - P_g)^k + */ + int update (const Mat &/*model*/, int inlier_size) override { + if (sprt_histories.empty()) + return std::min(MAX_ITERATIONS, getStandardUpperBound(inlier_size)); + + const double epsilon = static_cast(inlier_size) / points_size; // inlier probability + const double P_g = pow (epsilon, sample_size); // probability of good sample + + double log_eta_lmin1 = 0; + + int total_number_of_tested_samples = 0; + const int sprts_size_min1 = static_cast(sprt_histories.size())-1; + if (sprts_size_min1 < 0) return getStandardUpperBound(inlier_size); + // compute log n(l-1), l is number of tests + for (int test = 0; test < sprts_size_min1; test++) { + log_eta_lmin1 += log (1 - P_g * (1 - pow (sprt_histories[test].A, + -computeExponentH(sprt_histories[test].epsilon, epsilon,sprt_histories[test].delta)))) + * sprt_histories[test].tested_samples; + total_number_of_tested_samples += sprt_histories[test].tested_samples; + } + + // Implementation note: since η > ηR the equation (9) does not have to be evaluated + // before ηR < η0 is satisfied. + if (std::pow(1 - P_g, total_number_of_tested_samples) < log_eta_0) + return std::min(MAX_ITERATIONS, getStandardUpperBound(inlier_size)); + // use decision threshold A for last test (l-th) + const double predicted_iters_sprt = (log_eta_0 - log_eta_lmin1) / + log (1 - P_g * (1 - 1 / sprt_histories[sprts_size_min1].A)); // last A + if (std::isnan(predicted_iters_sprt) || std::isinf(predicted_iters_sprt)) + return getStandardUpperBound(inlier_size); + + if (predicted_iters_sprt < 0) return 0; + // compare with standard upper bound + if (predicted_iters_sprt < MAX_ITERATIONS) + return std::min(static_cast(predicted_iters_sprt), + getStandardUpperBound(inlier_size)); + return getStandardUpperBound(inlier_size); + } + + Ptr clone () const override { + return makePtr(sprt_histories, 1-exp(log_eta_0), points_size, + sample_size, MAX_ITERATIONS); + } +private: + inline int getStandardUpperBound(int inlier_size) const { + const double predicted_iters = log_eta_0 / log(1 - std::pow + (static_cast(inlier_size) / points_size, sample_size)); + return (! std::isinf(predicted_iters) && predicted_iters < MAX_ITERATIONS) ? + static_cast(predicted_iters) : MAX_ITERATIONS; + } + /* + * h(i) must hold + * + * δ(i) 1 - δ(i) + * ε (-----)^h(i) + (1 - ε) (--------)^h(i) = 1 + * ε(i) 1 - ε(i) + * + * ε * a^h + (1 - ε) * b^h = 1 + * Has numerical solution. + */ + static double computeExponentH (double epsilon, double epsilon_new, double delta) { + const double a = log (delta / epsilon); // log likelihood ratio + const double b = log ((1 - delta) / (1 - epsilon)); + + const double x0 = log (1 / (1 - epsilon_new)) / b; + const double v0 = epsilon_new * exp (x0 * a); + const double x1 = log ((1 - 2*v0) / (1 - epsilon_new)) / b; + const double v1 = epsilon_new * exp (x1 * a) + (1 - epsilon_new) * exp(x1 * b); + const double h = x0 - (x0 - x1) / (1 + v0 - v1) * v0; + + if (std::isnan(h)) + // The equation always has solution for h = 0 + // ε * a^0 + (1 - ε) * b^0 = 1 + // ε + 1 - ε = 1 -> 1 = 1 + return 0; + return h; + } +}; +Ptr SPRTTermination::create(const std::vector &sprt_histories_, + double confidence, int points_size_, int sample_size_, int max_iterations_) { + return makePtr(sprt_histories_, confidence, points_size_, sample_size_, + max_iterations_); +} + +///////////////////////////// PROGRESSIVE-NAPSAC-SPRT TERMINATION ///////////////////////////////// +class SPRTPNapsacTerminationImpl : public SPRTPNapsacTermination { +private: + SPRTTerminationImpl sprt_termination; + const std::vector &sprt_histories; + const double relax_coef, log_confidence; + const int points_size, sample_size, MAX_ITERS; +public: + + SPRTPNapsacTerminationImpl (const std::vector &sprt_histories_, + double confidence, int points_size_, int sample_size_, + int max_iterations_, double relax_coef_) + : sprt_termination (sprt_histories_, confidence, points_size_, sample_size_, + max_iterations_), sprt_histories (sprt_histories_), + relax_coef (relax_coef_), log_confidence(log(1-confidence)), + points_size (points_size_), sample_size (sample_size_), + MAX_ITERS (max_iterations_) {} + + int update (const Mat &model, int inlier_number) override { + int predicted_iterations = sprt_termination.update(model, inlier_number); + + const double inlier_prob = static_cast(inlier_number) / points_size + relax_coef; + if (inlier_prob >= 1) + return 0; + + const double predicted_iters = log_confidence / log(1 - std::pow(inlier_prob, sample_size)); + + if (! std::isinf(predicted_iters) && predicted_iters < predicted_iterations) + return static_cast(predicted_iters); + return predicted_iterations; + } + Ptr clone () const override { + return makePtr(sprt_histories, 1-exp(log_confidence), + points_size, sample_size, MAX_ITERS, relax_coef); + } +}; +Ptr SPRTPNapsacTermination::create(const std::vector& + sprt_histories_, double confidence, int points_size_, int sample_size_, + int max_iterations_, double relax_coef_) { + return makePtr(sprt_histories_, confidence, points_size_, + sample_size_, max_iterations_, relax_coef_); +} +////////////////////////////////////// PROSAC TERMINATION ///////////////////////////////////////// + +class ProsacTerminationCriteriaImpl : public ProsacTerminationCriteria { +private: + const double log_confidence, beta, non_randomness_phi, inlier_threshold; + const int MAX_ITERATIONS, points_size, min_termination_length, sample_size; + const Ptr sampler; + + std::vector non_random_inliers; + + const Ptr error; +public: + ProsacTerminationCriteriaImpl (const Ptr &error_, int points_size_,int sample_size_, + double confidence, int max_iterations, int min_termination_length_, double beta_, + double non_randomness_phi_, double inlier_threshold_) : log_confidence + (log(1-confidence)), beta(beta_), non_randomness_phi(non_randomness_phi_), + inlier_threshold(inlier_threshold_), MAX_ITERATIONS(max_iterations), + points_size (points_size_), min_termination_length (min_termination_length_), + sample_size(sample_size_), error (error_) { init(); } + + ProsacTerminationCriteriaImpl (const Ptr &sampler_,const Ptr &error_, + int points_size_, int sample_size_, double confidence, int max_iterations, + int min_termination_length_, double beta_, double non_randomness_phi_, + double inlier_threshold_) : log_confidence(log(1-confidence)), beta(beta_), + non_randomness_phi(non_randomness_phi_), inlier_threshold(inlier_threshold_), + MAX_ITERATIONS(max_iterations), points_size (points_size_), + min_termination_length (min_termination_length_), sample_size(sample_size_), + sampler(sampler_), error (error_) { init(); } + + void init () { + // m is sample_size + // N is points_size + + // non-randomness constraint + // The non-randomness requirement prevents PROSAC + // from selecting a solution supported by outliers that are + // by chance consistent with it. The constraint is typically + // checked ex-post in standard approaches [1]. The distribution + // of the cardinalities of sets of random ‘inliers’ is binomial + // i-th entry - inlier counts for termination up to i-th point (term length = i+1) + + // ------------------------------------------------------------------------ + // initialize the data structures that determine stopping + // see probabilities description below. + + non_random_inliers = std::vector(points_size, 0); + std::vector pn_i_arr(points_size); + const double beta2compl_beta = beta / (1-beta); + const int step_n = 50, max_n = std::min(points_size, 1200); + for (int n = sample_size; n <= points_size; n+=step_n) { + if (n > max_n) { + // skip expensive calculation + break; + } + + // P^R_n(i) = β^(i−m) (1−β)^(n−i+m) (n−m i−m). (7) i = m,...,N + // initial value for i = m = sample_size + // P^R_n(i=m) = β^(0) (1−β)^(n) (n-m 0) = (1-β)^(n) + // P^R_n(i=m+1) = β^(1) (1−β)^(n−1) (n−m 1) = P^R_n(i=m) * β / (1-β) * (n-m) / 1 + // P^R_n(i=m+2) = β^(2) (1−β)^(n−2) (n−m 2) = P^R_n(i=m) * β^2 / (1-β)^2 * (n-m-1)(n-m) / 2 + // So, for each i=m+1.., P^R_n(i+1) must be calculated as P^R_n(i) * β / (1-β) * (n-i+1) / (i-m) + + pn_i_arr[sample_size-1] = std::pow(1-beta, n); + double pn_i = pn_i_arr[sample_size-1]; // prob of random inlier set of size i for subset size n + for (int i = sample_size+1; i <= n; i++) { + // use recurrent relation to fulfill remaining values + pn_i *= beta2compl_beta * static_cast(n-i+1) / (i-sample_size); + // update + pn_i_arr[i-1] = pn_i; + } + + // find minimum number of inliers satisfying the non-randomness constraint + // Imin n = min{j : n∑i=j P^R_n(i) < Ψ }. (8) + double acc = 0; + int i_min = sample_size; // there is always sample_size inliers + for (int i = n; i >= sample_size; i--) { + acc += pn_i_arr[i-1]; + if (acc < non_randomness_phi) i_min = i; + else break; + } + non_random_inliers[n-1] = i_min; + } + + // approximate values of binomial distribution + for (int n = sample_size; n <= points_size; n+=step_n) { + if (n-1+step_n >= max_n) { + // copy rest of the values + std::fill(&non_random_inliers[0]+n-1, &non_random_inliers[0]+points_size, non_random_inliers[n-1]); + break; + } + const int non_rand_n = non_random_inliers[n-1]; + const double step = (double)(non_random_inliers[n-1+step_n] - non_rand_n) / (double)step_n; + for (int i = 0; i < step_n-1; i++) + non_random_inliers[n+i] = (int)(non_rand_n + (i+1)*step); + } + } + /* + * The PROSAC algorithm terminates if the number of inliers I_n* + * within the set U_n* satisfies the following conditions: + * + * • non-randomness – the probability that I_n* out of n* (termination_length) + * data points are by chance inliers to an arbitrary incorrect model + * is smaller than Ψ (typically set to 5%) + * + * • maximality – the probability that a solution with more than + * In* inliers in U_n* exists and was not found after k + * samples is smaller than η0 (typically set to 5%). + */ + int update (const Mat &model, int inliers_size) override { + int predicted_iterations = MAX_ITERATIONS; + /* + * The termination length n* is chosen to minimize k_n*(η0) subject to I_n* ≥ I_min n*; + * k_n*(η0) >= log(η0) / log(1 - (I_n* / n*)^m) + * g(k) <= n, I_n is number of inliers under termination length n. + */ + const auto &errors = error->getErrors(model); + + // find number of inliers under g(k) + int num_inliers_under_termination_len = 0; + for (int pt = 0; pt < min_termination_length; pt++) + if (errors[pt] < inlier_threshold) + num_inliers_under_termination_len++; + + for (int termination_len = min_termination_length; termination_len < points_size;termination_len++){ + if (errors[termination_len /* = point*/] < inlier_threshold) { + num_inliers_under_termination_len++; + + // non-random constraint must satisfy I_n* ≥ I_min n*. + if (num_inliers_under_termination_len < non_random_inliers[termination_len]) + continue; + + // add 1 to termination length since num_inliers_under_termination_len is updated + const double new_max_samples = log_confidence / log(1 - + std::pow(static_cast(num_inliers_under_termination_len) + / (termination_len+1), sample_size)); + + if (! std::isinf(new_max_samples) && predicted_iterations > new_max_samples) { + predicted_iterations = static_cast(new_max_samples); + if (predicted_iterations == 0) break; + if (sampler != nullptr) + sampler->setTerminationLength(termination_len); + } + } + } + + // compare also when termination length = points_size, + // so inliers under termination length is total number of inliers: + const double predicted_iters = log_confidence / log(1 - std::pow + (static_cast(inliers_size) / points_size, sample_size)); + + if (! std::isinf(predicted_iters) && predicted_iters < predicted_iterations) + return static_cast(predicted_iters); + return predicted_iterations; + } + + Ptr clone () const override { + return makePtr(error->clone(), + points_size, sample_size, 1-exp(log_confidence), MAX_ITERATIONS, + min_termination_length, beta, non_randomness_phi, inlier_threshold); + } +}; + +Ptr +ProsacTerminationCriteria::create(const Ptr &sampler, const Ptr &error, + int points_size_, int sample_size_, double confidence, int max_iterations, + int min_termination_length_, double beta, double non_randomness_phi, double inlier_thresh) { + return makePtr (sampler, error, points_size_, sample_size_, + confidence, max_iterations, min_termination_length_, + beta, non_randomness_phi, inlier_thresh); +} +}} diff --git a/modules/calib3d/src/usac/utils.cpp b/modules/calib3d/src/usac/utils.cpp new file mode 100644 index 0000000..9a371a4 --- /dev/null +++ b/modules/calib3d/src/usac/utils.cpp @@ -0,0 +1,526 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#include "../precomp.hpp" +#include "../usac.hpp" +#include "opencv2/flann/miniflann.hpp" +#include + +namespace cv { namespace usac { +double Utils::getCalibratedThreshold (double threshold, const Mat &K1, const Mat &K2) { + return threshold / ((K1.at(0, 0) + K1.at(1, 1) + + K2.at(0, 0) + K2.at(1, 1)) / 4.0); +} + +/* + * K1, K2 are 3x3 intrinsics matrices + * points is matrix of size |N| x 4 + * Assume K = [k11 k12 k13 + * 0 k22 k23 + * 0 0 1] + */ +void Utils::calibratePoints (const Mat &K1, const Mat &K2, const Mat &points, Mat &calib_points) { + const auto * const points_ = (float *) points.data; + const auto * const k1 = (double *) K1.data; + const auto inv1_k11 = float(1 / k1[0]); // 1 / k11 + const auto inv1_k12 = float(-k1[1] / (k1[0]*k1[4])); // -k12 / (k11*k22) + // (-k13*k22 + k12*k23) / (k11*k22) + const auto inv1_k13 = float((-k1[2]*k1[4] + k1[1]*k1[5]) / (k1[0]*k1[4])); + const auto inv1_k22 = float(1 / k1[4]); // 1 / k22 + const auto inv1_k23 = float(-k1[5] / k1[4]); // -k23 / k22 + + const auto * const k2 = (double *) K2.data; + const auto inv2_k11 = float(1 / k2[0]); + const auto inv2_k12 = float(-k2[1] / (k2[0]*k2[4])); + const auto inv2_k13 = float((-k2[2]*k2[4] + k2[1]*k2[5]) / (k2[0]*k2[4])); + const auto inv2_k22 = float(1 / k2[4]); + const auto inv2_k23 = float(-k2[5] / k2[4]); + + calib_points = Mat ( points.rows, 4, points.type()); + auto * calib_points_ = (float *) calib_points.data; + + for (int i = 0; i < points.rows; i++) { + const int idx = 4*i; + (*calib_points_++) = inv1_k11 * points_[idx ] + inv1_k12 * points_[idx+1] + inv1_k13; + (*calib_points_++) = inv1_k22 * points_[idx+1] + inv1_k23; + (*calib_points_++) = inv2_k11 * points_[idx+2] + inv2_k12 * points_[idx+3] + inv2_k13; + (*calib_points_++) = inv2_k22 * points_[idx+3] + inv2_k23; + } +} + +/* + * K is 3x3 intrinsic matrix + * points is matrix of size |N| x 5, first two columns are image points [u_i, v_i] + * calib_norm_pts are K^-1 [u v 1]^T / ||K^-1 [u v 1]^T|| + */ +void Utils::calibrateAndNormalizePointsPnP (const Mat &K, const Mat &pts, Mat &calib_norm_pts) { + const auto * const points = (float *) pts.data; + const auto * const k = (double *) K.data; + const auto inv_k11 = float(1 / k[0]); + const auto inv_k12 = float(-k[1] / (k[0]*k[4])); + const auto inv_k13 = float((-k[2]*k[4] + k[1]*k[5]) / (k[0]*k[4])); + const auto inv_k22 = float(1 / k[4]); + const auto inv_k23 = float(-k[5] / k[4]); + + calib_norm_pts = Mat (pts.rows, 3, pts.type()); + auto * calib_norm_pts_ = (float *) calib_norm_pts.data; + + for (int i = 0; i < pts.rows; i++) { + const int idx = 5 * i; + const float k_inv_u = inv_k11 * points[idx] + inv_k12 * points[idx+1] + inv_k13; + const float k_inv_v = inv_k22 * points[idx+1] + inv_k23; + const float norm = 1.f / sqrtf(k_inv_u*k_inv_u + k_inv_v*k_inv_v + 1); + (*calib_norm_pts_++) = k_inv_u * norm; + (*calib_norm_pts_++) = k_inv_v * norm; + (*calib_norm_pts_++) = norm; + } +} + +void Utils::normalizeAndDecalibPointsPnP (const Mat &K_, Mat &pts, Mat &calib_norm_pts) { + const auto * const K = (double *) K_.data; + const auto k11 = (float)K[0], k12 = (float)K[1], k13 = (float)K[2], + k22 = (float)K[4], k23 = (float)K[5]; + calib_norm_pts = Mat (pts.rows, 3, pts.type()); + auto * points = (float *) pts.data; + auto * calib_norm_pts_ = (float *) calib_norm_pts.data; + + for (int i = 0; i < pts.rows; i++) { + const int idx = 5 * i; + const float k_inv_u = points[idx ]; + const float k_inv_v = points[idx+1]; + const float norm = 1.f / sqrtf(k_inv_u*k_inv_u + k_inv_v*k_inv_v + 1); + (*calib_norm_pts_++) = k_inv_u * norm; + (*calib_norm_pts_++) = k_inv_v * norm; + (*calib_norm_pts_++) = norm; + points[idx ] = k11 * k_inv_u + k12 * k_inv_v + k13; + points[idx+1] = k22 * k_inv_v + k23; + } +} +/* + * decompose Projection Matrix to calibration, rotation and translation + * Assume K = [fx 0 tx + * 0 fy ty + * 0 0 1] + */ +void Utils::decomposeProjection (const Mat &P, Mat &K_, Mat &R, Mat &t, bool same_focal) { + const Mat M = P.colRange(0,3); + double scale = norm(M.row(2)); scale *= scale; + Matx33d K = Matx33d::eye(); + K(1,2) = M.row(1).dot(M.row(2)) / scale; + K(0,2) = M.row(0).dot(M.row(2)) / scale; + K(1,1) = sqrt(M.row(1).dot(M.row(1)) / scale - K(1,2)*K(1,2)); + K(0,0) = sqrt(M.row(0).dot(M.row(0)) / scale - K(0,2)*K(0,2)); + if (same_focal) + K(0,0) = K(1,1) = (K(0,0) + K(1,1)) / 2; + R = K.inv() * M / sqrt(scale); + if (determinant(M) < 0) R *= -1; + t = R * M.inv() * P.col(3); + K_ = Mat(K); +} + +Matx33d Math::getSkewSymmetric(const Vec3d &v) { + return Matx33d(0, -v[2], v[1], + v[2], 0, -v[0], + -v[1], v[0], 0); +} + +Matx33d Math::rotVec2RotMat (const Vec3d &v) { + const double phi = sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]); + const double x = v[0] / phi, y = v[1] / phi, z = v[2] / phi; + const double a = sin(phi), b = cos(phi); + // R = I + sin(phi) * skew(v) + (1 - cos(phi) * skew(v)^2 + return Matx33d((b - 1)*y*y + (b - 1)*z*z + 1, -a*z - x*y*(b - 1), a*y - x*z*(b - 1), + a*z - x*y*(b - 1), (b - 1)*x*x + (b - 1)*z*z + 1, -a*x - y*z*(b - 1), + -a*y - x*z*(b - 1), a*x - y*z*(b - 1), (b - 1)*x*x + (b - 1)*y*y + 1); +} + +Vec3d Math::rotMat2RotVec (const Matx33d &R) { + // https://math.stackexchange.com/questions/83874/efficient-and-accurate-numerical-implementation-of-the-inverse-rodrigues-rotatio?rq=1 + Vec3d rot_vec; + const double trace = R(0,0)+R(1,1)+R(2,2); + if (trace >= 3 - FLT_EPSILON) { + rot_vec = (0.5 * (trace-3)/12)*Vec3d(R(2,1)-R(1,2), + R(0,2)-R(2,0), + R(1,0)-R(0,1)); + } else if (3 - FLT_EPSILON > trace && trace > -1 + FLT_EPSILON) { + double theta = acos((trace - 1) / 2); + rot_vec = (theta / (2 * sin(theta))) * Vec3d(R(2,1)-R(1,2), + R(0,2)-R(2,0), + R(1,0)-R(0,1)); + } else { + int a; + if (R(0,0) > R(1,1)) + a = R(0,0) > R(2,2) ? 0 : 2; + else + a = R(1,1) > R(2,2) ? 1 : 2; + Vec3d v; + int b = (a + 1) % 3, c = (a + 2) % 3; + double s = sqrt(R(a,a) - R(b,b) - R(c,c) + 1); + v[a] = s / 2; + v[b] = (R(b,a) + R(a,b)) / (2 * s); + v[c] = (R(c,a) + R(a,c)) / (2 * s); + rot_vec = M_PI * v / norm(v); + } + return rot_vec; +} + +/* + * Eliminate matrix of m rows and n columns to be upper triangular. + */ +void Math::eliminateUpperTriangular (std::vector &a, int m, int n) { + for (int r = 0; r < m; r++){ + double pivot = a[r*n+r]; + int row_with_pivot = r; + + // find the maximum pivot value among r-th column + for (int k = r+1; k < m; k++) + if (fabs(pivot) < fabs(a[k*n+r])) { + pivot = a[k*n+r]; + row_with_pivot = k; + } + + // if pivot value is 0 continue + if (fabs(pivot) < DBL_EPSILON) + continue; + + // swap row with maximum pivot value with current row + for (int c = r; c < n; c++) + std::swap(a[row_with_pivot*n+c], a[r*n+c]); + + // eliminate other rows + for (int j = r+1; j < m; j++){ + const auto fac = a[j*n+r] / pivot; + for (int c = r; c < n; c++) + a[j*n+c] -= fac * a[r*n+c]; + } + } +} + +//////////////////////////////////////// RANDOM GENERATOR ///////////////////////////// +class UniformRandomGeneratorImpl : public UniformRandomGenerator { +private: + int subset_size = 0, max_range = 0; + std::vector subset; + RNG rng; +public: + explicit UniformRandomGeneratorImpl (int state) : rng(state) {} + + // interval is <0; max_range); + UniformRandomGeneratorImpl (int state, int max_range_, int subset_size_) : rng(state) { + subset_size = subset_size_; + max_range = max_range_; + subset = std::vector(subset_size_); + } + + int getRandomNumber () override { + return rng.uniform(0, max_range); + } + + int getRandomNumber (int max_rng) override { + return rng.uniform(0, max_rng); + } + + // closed range + void resetGenerator (int max_range_) override { + CV_CheckGE(0, max_range_, "max range must be greater than 0"); + max_range = max_range_; + } + + void generateUniqueRandomSet (std::vector& sample) override { + CV_CheckLE(subset_size, max_range, "RandomGenerator. Subset size must be LE than range!"); + int j, num; + sample[0] = rng.uniform(0, max_range); + for (int i = 1; i < subset_size;) { + num = rng.uniform(0, max_range); + // check if value is in array + for (j = i - 1; j >= 0; j--) + if (num == sample[j]) + // if so, generate again + break; + // success, value is not in array, so it is unique, add to sample. + if (j == -1) sample[i++] = num; + } + } + + // interval is <0; max_range) + void generateUniqueRandomSet (std::vector& sample, int max_range_) override { + /* + * necessary condition: + * if subset size is bigger than range then array cannot be unique, + * so function has infinite loop. + */ + CV_CheckLE(subset_size, max_range_, "RandomGenerator. Subset size must be LE than range!"); + int num, j; + sample[0] = rng.uniform(0, max_range_); + for (int i = 1; i < subset_size;) { + num = rng.uniform(0, max_range_); + for (j = i - 1; j >= 0; j--) + if (num == sample[j]) + break; + if (j == -1) sample[i++] = num; + } + } + + // interval is <0, max_range) + void generateUniqueRandomSet (std::vector& sample, int subset_size_, int max_range_) override { + CV_CheckLE(subset_size_, max_range_, "RandomGenerator. Subset size must be LE than range!"); + int num, j; + sample[0] = rng.uniform(0, max_range_); + for (int i = 1; i < subset_size_;) { + num = rng.uniform(0, max_range_); + for (j = i - 1; j >= 0; j--) + if (num == sample[j]) + break; + if (j == -1) sample[i++] = num; + } + } + const std::vector &generateUniqueRandomSubset (std::vector &array1, int size1) override { + CV_CheckLE(subset_size, size1, "RandomGenerator. Subset size must be LE than range!"); + int temp_size1 = size1; + for (int i = 0; i < subset_size; i++) { + const int idx1 = rng.uniform(0, temp_size1); + subset[i] = array1[idx1]; + std::swap(array1[idx1], array1[--temp_size1]); + } + return subset; + } + + void setSubsetSize (int subset_size_) override { + subset_size = subset_size_; + } + int getSubsetSize () const override { return subset_size; } + Ptr clone (int state) const override { + return makePtr(state, max_range, subset_size); + } +}; + +Ptr UniformRandomGenerator::create (int state) { + return makePtr(state); +} +Ptr UniformRandomGenerator::create + (int state, int max_range, int subset_size_) { + return makePtr(state, max_range, subset_size_); +} + +// @k_minth - desired k-th minimal element. For median is half of array +// closed working interval of array <@left; @right> +float quicksort_median (std::vector &array, int k_minth, int left, int right); +float quicksort_median (std::vector &array, int k_minth, int left, int right) { + // length is 0, return single value + if (right - left == 0) return array[left]; + + // get pivot, the rightest value in array + const auto pivot = array[right]; + int right_ = right - 1; // -1, not including pivot + // counter of values smaller equal than pivot + int j = left, values_less_eq_pivot = 1; // 1, inludes pivot already + for (; j <= right_;) { + if (array[j] <= pivot) { + j++; + values_less_eq_pivot++; + } else + // value is bigger than pivot, swap with right_ value + // swap values in array and decrease interval + std::swap(array[j], array[right_--]); + } + if (values_less_eq_pivot == k_minth) return pivot; + if (k_minth > values_less_eq_pivot) + return quicksort_median(array, k_minth - values_less_eq_pivot, j, right-1); + else + return quicksort_median(array, k_minth, left, j-1); +} + +// find median using quicksort with complexity O(log n) +// Note, function changes order of values in array +float Utils::findMedian (std::vector &array) { + const int length = static_cast(array.size()); + if (length % 2) { + // odd number of values + return quicksort_median (array, length/2+1, 0, length-1); + } else { + // even: return average + return (quicksort_median(array, length/2 , 0, length-1) + + quicksort_median(array, length/2+1, 0, length-1))/2; + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////// Radius Search Graph ///////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////// +class RadiusSearchNeighborhoodGraphImpl : public RadiusSearchNeighborhoodGraph { +private: + std::vector> graph; +public: + RadiusSearchNeighborhoodGraphImpl (const Mat &container_, int points_size, + double radius, int flann_search_params, int num_kd_trees) { + // Radius search OpenCV works only with float data + CV_Assert(container_.type() == CV_32F); + + FlannBasedMatcher flann(makePtr(num_kd_trees), makePtr(flann_search_params)); + std::vector> neighbours; + flann.radiusMatch(container_, container_, neighbours, (float)radius); + + // allocate graph + graph = std::vector> (points_size); + + int pt = 0; + for (const auto &n : neighbours) { + auto &graph_row = graph[pt]; + graph_row = std::vector(n.size()-1); + int j = 0; + for (const auto &idx : n) + // skip neighbor which has the same index as requested point + if (idx.trainIdx != pt) + graph_row[j++] = idx.trainIdx; + pt++; + } + } + + inline const std::vector &getNeighbors(int point_idx) const override { + return graph[point_idx]; + } +}; +Ptr RadiusSearchNeighborhoodGraph::create (const Mat &points, + int points_size, double radius_, int flann_search_params, int num_kd_trees) { + return makePtr (points, points_size, radius_, + flann_search_params, num_kd_trees); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////// FLANN Graph ///////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////// +class FlannNeighborhoodGraphImpl : public FlannNeighborhoodGraph { +private: + std::vector> graph; + std::vector> distances; +public: + FlannNeighborhoodGraphImpl (const Mat &container_, int points_size, int k_nearest_neighbors, + bool get_distances, int flann_search_params_, int num_kd_trees) { + CV_Assert(k_nearest_neighbors <= points_size); + // FLANN works only with float data + CV_Assert(container_.type() == CV_32F); + + flann::Index flannIndex (container_.reshape(1), flann::KDTreeIndexParams(num_kd_trees)); + Mat dists, nearest_neighbors; + + flannIndex.knnSearch(container_, nearest_neighbors, dists, k_nearest_neighbors+1, + flann::SearchParams(flann_search_params_)); + + // first nearest neighbor of point is this point itself. + // remove this first column + nearest_neighbors.colRange(1, k_nearest_neighbors+1).copyTo (nearest_neighbors); + + graph = std::vector>(points_size, std::vector(k_nearest_neighbors)); + const auto * const nn = (int *) nearest_neighbors.data; + const auto * const dists_ptr = (float *) dists.data; + + if (get_distances) + distances = std::vector>(points_size, std::vector(k_nearest_neighbors)); + + for (int pt = 0; pt < points_size; pt++) { + std::copy(nn + k_nearest_neighbors*pt, nn + k_nearest_neighbors*pt + k_nearest_neighbors, &graph[pt][0]); + if (get_distances) + std::copy(dists_ptr + k_nearest_neighbors*pt, dists_ptr + k_nearest_neighbors*pt + k_nearest_neighbors, + &distances[pt][0]); + } + } + const std::vector& getNeighborsDistances (int idx) const override { + return distances[idx]; + } + inline const std::vector &getNeighbors(int point_idx) const override { + // CV_Assert(point_idx_ < num_vertices); + return graph[point_idx]; + } +}; + +Ptr FlannNeighborhoodGraph::create(const Mat &points, + int points_size, int k_nearest_neighbors_, bool get_distances, + int flann_search_params_, int num_kd_trees) { + return makePtr(points, points_size, + k_nearest_neighbors_, get_distances, flann_search_params_, num_kd_trees); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////// Grid Neighborhood Graph ///////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////// +class GridNeighborhoodGraphImpl : public GridNeighborhoodGraph { +private: + // This struct is used for the nearest neighbors search by griding two images. + struct CellCoord { + int c1x, c1y, c2x, c2y; + CellCoord (int c1x_, int c1y_, int c2x_, int c2y_) { + c1x = c1x_; c1y = c1y_; c2x = c2x_; c2y = c2y_; + } + bool operator==(const CellCoord &o) const { + return c1x == o.c1x && c1y == o.c1y && c2x == o.c2x && c2y == o.c2y; + } + bool operator<(const CellCoord &o) const { + if (c1x < o.c1x) return true; + if (c1x == o.c1x && c1y < o.c1y) return true; + if (c1x == o.c1x && c1y == o.c1y && c2x < o.c2x) return true; + return c1x == o.c1x && c1y == o.c1y && c2x == o.c2x && c2y < o.c2y; + } + }; + + std::map> neighbors_map; + std::vector> graph; +public: + GridNeighborhoodGraphImpl (const Mat &container_, int points_size, + int cell_size_x_img1, int cell_size_y_img1, int cell_size_x_img2, int cell_size_y_img2) { + + const auto * const container = (float *) container_.data; + // -> {neighbors set} + // Key is cell position. The value is indexes of neighbors. + + const float cell_sz_x1 = 1.f / (float) cell_size_x_img1, + cell_sz_y1 = 1.f / (float) cell_size_y_img1, + cell_sz_x2 = 1.f / (float) cell_size_x_img2, + cell_sz_y2 = 1.f / (float) cell_size_y_img2; + const int dimension = container_.cols; + for (int i = 0; i < points_size; i++) { + const int idx = dimension * i; + neighbors_map[CellCoord((int)(container[idx ] * cell_sz_x1), + (int)(container[idx+1] * cell_sz_y1), + (int)(container[idx+2] * cell_sz_x2), + (int)(container[idx+3] * cell_sz_y2))].emplace_back(i); + } + + //--------- create a graph ---------- + graph = std::vector>(points_size); + + // store neighbors cells into graph (2D vector) + for (const auto &cell : neighbors_map) { + const int neighbors_in_cell = static_cast(cell.second.size()); + + // only one point in cell -> no neighbors + if (neighbors_in_cell < 2) continue; + + const std::vector &neighbors = cell.second; + // ---------- fill graph ----- + for (int v_in_cell : neighbors) { + // there is always at least one neighbor + auto &graph_row = graph[v_in_cell]; + graph_row = std::vector(neighbors_in_cell-1); + int j = 0; + for (int n : neighbors) + if (n != v_in_cell) + graph_row[j++] = n; + } + } + } + + inline const std::vector &getNeighbors(int point_idx) const override { + // Note, neighbors vector also includes point_idx! + // return neighbors_map[vertices_to_cells[point_idx]]; + return graph[point_idx]; + } +}; + +Ptr GridNeighborhoodGraph::create(const Mat &points, + int points_size, int cell_size_x_img1_, int cell_size_y_img1_, + int cell_size_x_img2_, int cell_size_y_img2_) { + return makePtr(points, points_size, + cell_size_x_img1_, cell_size_y_img1_, cell_size_x_img2_, cell_size_y_img2_); +} +}} \ No newline at end of file diff --git a/modules/calib3d/test/test_usac.cpp b/modules/calib3d/test/test_usac.cpp new file mode 100644 index 0000000..0b5cfde --- /dev/null +++ b/modules/calib3d/test/test_usac.cpp @@ -0,0 +1,408 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#include "test_precomp.hpp" + +namespace opencv_test { +enum TestSolver { Homogr, Fundam, Essen, PnP, Affine}; +/* +* rng -- reference to random generator +* pts1 -- 2xN image points +* pts2 -- for PnP is 3xN object points, otherwise 2xN image points. +* two_calib -- True if two cameras have different calibration. +* K1 -- intrinsic matrix of the first camera. For PnP only one camera. +* K2 -- only if two_calib is True. +* pts_size -- required size of points. +* inlier_ratio -- required inlier ratio +* noise_std -- standard deviation of Gaussian noise of image points. +* gt_inliers -- has size of number of inliers. Contains indices of inliers. +*/ +static int generatePoints (cv::RNG &rng, cv::Mat &pts1, cv::Mat &pts2, cv::Mat &K1, cv::Mat &K2, + bool two_calib, int pts_size, TestSolver test_case, double inlier_ratio, double noise_std, + std::vector >_inliers) { + + auto eulerAnglesToRotationMatrix = [] (double pitch, double yaw, double roll) { + // Calculate rotation about x axis + cv::Matx33d R_x (1, 0, 0, 0, cos(roll), -sin(roll), 0, sin(roll), cos(roll)); + // Calculate rotation about y axis + cv::Matx33d R_y (cos(pitch), 0, sin(pitch), 0, 1, 0, -sin(pitch), 0, cos(pitch)); + // Calculate rotation about z axis + cv::Matx33d R_z (cos(yaw), -sin(yaw), 0, sin(yaw), cos(yaw), 0, 0, 0, 1); + return cv::Mat(R_z * R_y * R_x); // Combined rotation matrix + }; + + const double pitch_min = -CV_PI / 6, pitch_max = CV_PI / 6; // 30 degrees + const double yaw_min = -CV_PI / 6, yaw_max = CV_PI / 6; + const double roll_min = -CV_PI / 6, roll_max = CV_PI / 6; + + cv::Mat R = eulerAnglesToRotationMatrix(rng.uniform(pitch_min, pitch_max), + rng.uniform(yaw_min, yaw_max), rng.uniform(roll_min, roll_max)); + + // generate random translation, + // if test for homography fails try to fix translation to zero vec so H is related by transl. + cv::Vec3d t (rng.uniform(-0.5f, 0.5f), rng.uniform(-0.5f, 0.5f), rng.uniform(1.0f, 2.0f)); + + // generate random calibration + auto getRandomCalib = [&] () { + return cv::Mat(cv::Matx33d(rng.uniform(100.0, 1000.0), 0, rng.uniform(100.0, 100.0), + 0, rng.uniform(100.0, 1000.0), rng.uniform(-100.0, 100.0), + 0, 0, 1.)); + }; + K1 = getRandomCalib(); + K2 = two_calib ? getRandomCalib() : K1.clone(); + + auto updateTranslation = [] (const cv::Mat &pts, const cv::Mat &R_, cv::Vec3d &t_) { + // Make sure the shape is in front of the camera + cv::Mat points3d_transformed = R_ * pts + t_ * cv::Mat::ones(1, pts.cols, pts.type()); + double min_dist, max_dist; + cv::minMaxIdx(points3d_transformed.row(2), &min_dist, &max_dist); + if (min_dist < 0) t_(2) -= min_dist + 1.0; + }; + + // compute size of inliers and outliers + const int inl_size = static_cast(inlier_ratio * pts_size); + const int out_size = pts_size - inl_size; + + // all points will have top 'inl_size' of their points inliers + gt_inliers.clear(); gt_inliers.reserve(inl_size); + for (int i = 0; i < inl_size; i++) + gt_inliers.emplace_back(i); + + // double precision to multiply points by models + const int pts_type = CV_64F; + cv::Mat points3d; + if (test_case == TestSolver::Homogr) { + points3d.create(2, inl_size, pts_type); + rng.fill(points3d, cv::RNG::UNIFORM, 0.0, 1.0); // keep small range + // inliers must be planar points, let their 3D coordinate be 1 + cv::vconcat(points3d, cv::Mat::ones(1, inl_size, points3d.type()), points3d); + } else if (test_case == TestSolver::Fundam || test_case == TestSolver::Essen) { + // create 3D points which are inliers + points3d.create(3, inl_size, pts_type); + rng.fill(points3d, cv::RNG::UNIFORM, 0.0, 1.0); + } else if (test_case == TestSolver::PnP) { + //pts1 are image points, pts2 are object points + pts2.create(3, inl_size, pts_type); // 3D inliers + rng.fill(pts2, cv::RNG::UNIFORM, 0, 1); + + updateTranslation(pts2, R, t); + + // project 3D points (pts2) on image plane (pts1) + pts1 = K1 * (R * pts2 + t * cv::Mat::ones(1, pts2.cols, pts2.type())); + cv::divide(pts1.row(0), pts1.row(2), pts1.row(0)); + cv::divide(pts1.row(1), pts1.row(2), pts1.row(1)); + // make 2D points + pts1 = pts1.rowRange(0, 2); + + // create random outliers + cv::Mat pts_outliers = cv::Mat(5, out_size, pts2.type()); + rng.fill(pts_outliers, cv::RNG::UNIFORM, 0, 1000); + + // merge inliers with random image points = outliers + cv::hconcat(pts1, pts_outliers.rowRange(0, 2), pts1); + // merge 3D inliers with 3D outliers + cv::hconcat(pts2, pts_outliers.rowRange(2, 5), pts2); + + // add Gaussian noise to image points + cv::Mat noise(pts1.rows, pts1.cols, pts1.type()); + rng.fill(noise, cv::RNG::NORMAL, 0, noise_std); + pts1 += noise; + return inl_size; + } else if (test_case == TestSolver::Affine) { + } else + CV_Error(cv::Error::StsBadArg, "Unknown solver!"); + + if (test_case != TestSolver::PnP) { + // project 3D point on image plane + // use two relative scenes. The first camera is P1 = K1 [I | 0], the second P2 = K2 [R | t] + + if (test_case != TestSolver::Affine) { + updateTranslation(points3d, R, t); + + pts1 = K1 * points3d; + pts2 = K2 * (R * points3d + t * cv::Mat::ones(1, points3d.cols, points3d.type())); + + // normalize by 3 coordinate + cv::divide(pts1.row(0), pts1.row(2), pts1.row(0)); + cv::divide(pts1.row(1), pts1.row(2), pts1.row(1)); + cv::divide(pts2.row(0), pts2.row(2), pts2.row(0)); + cv::divide(pts2.row(1), pts2.row(2), pts2.row(1)); + } else { + pts1 = cv::Mat(2, inl_size, pts_type); + rng.fill(pts1, cv::RNG::UNIFORM, 0, 1000); + cv::Matx33d sc(rng.uniform(1., 5.),0,0,rng.uniform(1., 4.),0,0, 0, 0, 1); + cv::Matx33d tr(1,0,rng.uniform(50., 500.),0,1,rng.uniform(50., 500.), 0, 0, 1); + const double phi = rng.uniform(0., CV_PI); + cv::Matx33d rot(cos(phi), -sin(phi),0, sin(phi), cos(phi),0, 0, 0, 1); + cv::Matx33d A = sc * tr * rot; + cv::vconcat(pts1, cv::Mat::ones(1, pts1.cols, pts1.type()), points3d); + pts2 = A * points3d; + } + + // get 2D points + pts1 = pts1.rowRange(0,2); pts2 = pts2.rowRange(0,2); + + // generate random outliers as 2D image points + cv::Mat pts1_outliers(pts1.rows, out_size, pts1.type()), + pts2_outliers(pts2.rows, out_size, pts2.type()); + rng.fill(pts1_outliers, cv::RNG::UNIFORM, 0, 1000); + rng.fill(pts2_outliers, cv::RNG::UNIFORM, 0, 1000); + // merge inliers and outliers + cv::hconcat(pts1, pts1_outliers, pts1); + cv::hconcat(pts2, pts2_outliers, pts2); + + // add normal / Gaussian noise to image points + cv::Mat noise1 (pts1.rows, pts1.cols, pts1.type()), noise2 (pts2.rows, pts2.cols, pts2.type()); + rng.fill(noise1, cv::RNG::NORMAL, 0, noise_std); pts1 += noise1; + rng.fill(noise2, cv::RNG::NORMAL, 0, noise_std); pts2 += noise2; + } + + return inl_size; +} + +/* +* for test case = 0, 1, 2 (homography and epipolar geometry): pts1 and pts2 are 3xN +* for test_case = 3 (PnP): pts1 are 3xN and pts2 are 4xN +* all points are of the same type as model +*/ +static double getError (TestSolver test_case, int pt_idx, const cv::Mat &pts1, const cv::Mat &pts2, const cv::Mat &model) { + cv::Mat pt1 = pts1.col(pt_idx), pt2 = pts2.col(pt_idx); + if (test_case == TestSolver::Homogr) { // reprojection error + // compute Euclidean distance between given and reprojected points + cv::Mat est_pt2 = model * pt1; est_pt2 /= est_pt2.at(2); + if (false) { + cv::Mat est_pt1 = model.inv() * pt2; est_pt1 /= est_pt1.at(2); + return (cv::norm(est_pt1 - pt1) + cv::norm(est_pt2 - pt2)) / 2; + } + return cv::norm(est_pt2 - pt2); + } else + if (test_case == TestSolver::Fundam || test_case == TestSolver::Essen) { + cv::Mat l2 = model * pt1; + cv::Mat l1 = model.t() * pt2; + if (test_case == TestSolver::Fundam) // sampson error + return fabs(pt2.dot(l2)) / sqrt(pow(l1.at(0), 2) + pow(l1.at(1), 2) + + pow(l2.at(0), 2) + pow(l2.at(1), 2)); + else // symmetric geometric distance + return sqrt(pow(pt1.dot(l1),2) / (pow(l1.at(0),2) + pow(l1.at(1),2)) + + pow(pt2.dot(l2),2) / (pow(l2.at(0),2) + pow(l2.at(1),2))); + } else + if (test_case == TestSolver::PnP) { // PnP, reprojection error + cv::Mat img_pt = model * pt2; img_pt /= img_pt.at(2); + return cv::norm(pt1 - img_pt); + } else + CV_Error(cv::Error::StsBadArg, "Undefined test case!"); +} + +/* +* inl_size -- number of ground truth inliers +* pts1 and pts2 are of the same size as from function generatePoints(...) +*/ +static void checkInliersMask (TestSolver test_case, int inl_size, double thr, const cv::Mat &pts1_, + const cv::Mat &pts2_, const cv::Mat &model, const cv::Mat &mask) { + ASSERT_TRUE(!model.empty() && !mask.empty()); + + cv::Mat pts1 = pts1_, pts2 = pts2_; + if (pts1.type() != model.type()) { + pts1.convertTo(pts1, model.type()); + pts2.convertTo(pts2, model.type()); + } + // convert to homogeneous + cv::vconcat(pts1, cv::Mat::ones(1, pts1.cols, pts1.type()), pts1); + cv::vconcat(pts2, cv::Mat::ones(1, pts2.cols, pts2.type()), pts2); + + thr *= 1.001; // increase a little threshold due to numerical imprecisions + const auto * const mask_ptr = mask.ptr(); + int num_found_inliers = 0; + for (int i = 0; i < pts1.cols; i++) + if (mask_ptr[i]) { + ASSERT_LT(getError(test_case, i, pts1, pts2, model), thr); + num_found_inliers++; + } + // check if RANSAC found at least 80% of inliers + ASSERT_GT(num_found_inliers, 0.8 * inl_size); +} + +TEST(usac_Homography, accuracy) { + std::vector gt_inliers; + const int pts_size = 1500; + cv::RNG &rng = cv::theRNG(); + // do not test USAC_PARALLEL, because it is not deterministic + const std::vector flags = {USAC_DEFAULT, USAC_ACCURATE, USAC_PROSAC, USAC_FAST, USAC_MAGSAC}; + for (double inl_ratio = 0.1; inl_ratio < 0.91; inl_ratio += 0.1) { + cv::Mat pts1, pts2, K1, K2; + int inl_size = generatePoints(rng, pts1, pts2, K1, K2, false /*two calib*/, + pts_size, TestSolver ::Homogr, inl_ratio/*inl ratio*/, 0.1 /*noise std*/, gt_inliers); + // compute max_iters with standard upper bound rule for RANSAC with 1.5x tolerance + const double conf = 0.99, thr = 2., max_iters = 1.3 * log(1 - conf) / + log(1 - pow(inl_ratio, 4 /* sample size */)); + for (auto flag : flags) { + cv::Mat mask, H = cv::findHomography(pts1, pts2,flag, thr, mask, + int(max_iters), conf); + checkInliersMask(TestSolver::Homogr, inl_size, thr, pts1, pts2, H, mask); + } + } +} + +TEST(usac_Fundamental, accuracy) { + std::vector gt_inliers; + const int pts_size = 2000; + cv::RNG &rng = cv::theRNG(); + // start from 25% otherwise max_iters will be too big + const std::vector flags = {USAC_DEFAULT, USAC_FM_8PTS, USAC_ACCURATE, USAC_PROSAC, USAC_FAST, USAC_MAGSAC}; + const double conf = 0.99, thr = 1.; + for (double inl_ratio = 0.25; inl_ratio < 0.91; inl_ratio += 0.1) { + cv::Mat pts1, pts2, K1, K2; + int inl_size = generatePoints(rng, pts1, pts2, K1, K2, false /*two calib*/, + pts_size, TestSolver ::Fundam, inl_ratio, 0.1 /*noise std*/, gt_inliers); + + for (auto flag : flags) { + const int sample_size = flag == USAC_FM_8PTS ? 8 : 7; + const double max_iters = 1.25 * log(1 - conf) / + log(1 - pow(inl_ratio, sample_size)); + cv::Mat mask, F = cv::findFundamentalMat(pts1, pts2,flag, thr, conf, + int(max_iters), mask); + checkInliersMask(TestSolver::Fundam, inl_size, thr, pts1, pts2, F, mask); + } + }} + +TEST(usac_Essential, accuracy) { + std::vector gt_inliers; + const int pts_size = 1500; + cv::RNG &rng = cv::theRNG(); + // findEssentilaMat has by default number of maximum iterations equal to 1000. + // It means that with 99% confidence we assume at least 34.08% of inliers + const std::vector flags = {USAC_DEFAULT, USAC_ACCURATE, USAC_PROSAC, USAC_FAST, USAC_MAGSAC}; + for (double inl_ratio = 0.35; inl_ratio < 0.91; inl_ratio += 0.1) { + cv::Mat pts1, pts2, K1, K2; + int inl_size = generatePoints(rng, pts1, pts2, K1, K2, false /*two calib*/, + pts_size, TestSolver ::Fundam, inl_ratio, 0.01 /*noise std, works bad with high noise*/, gt_inliers); + const double conf = 0.99, thr = 1.; + for (auto flag : flags) { + cv::Mat mask, E; + try { + E = cv::findEssentialMat(pts1, pts2, K1, flag, conf, thr, mask); + } catch (cv::Exception &e) { + if (e.code != cv::Error::StsNotImplemented) + FAIL() << "Essential matrix estimation failed!\n"; + else continue; + } + // calibrate points + cv::Mat cpts1_3d, cpts2_3d; + cv::vconcat(pts1, cv::Mat::ones(1, pts1.cols, pts1.type()), cpts1_3d); + cv::vconcat(pts2, cv::Mat::ones(1, pts2.cols, pts2.type()), cpts2_3d); + cpts1_3d = K1.inv() * cpts1_3d; cpts2_3d = K1.inv() * cpts2_3d; + checkInliersMask(TestSolver::Essen, inl_size, thr / ((K1.at(0,0) + K1.at(1,1)) / 2), + cpts1_3d.rowRange(0,2), cpts2_3d.rowRange(0,2), E, mask); + } + } +} + +TEST(usac_P3P, accuracy) { + std::vector gt_inliers; + const int pts_size = 3000; + cv::Mat img_pts, obj_pts, K1, K2; + cv::RNG &rng = cv::theRNG(); + const std::vector flags = {USAC_DEFAULT, USAC_ACCURATE, USAC_PROSAC, USAC_FAST, USAC_MAGSAC}; + for (double inl_ratio = 0.1; inl_ratio < 0.91; inl_ratio += 0.1) { + int inl_size = generatePoints(rng, img_pts, obj_pts, K1, K2, false /*two calib*/, + pts_size, TestSolver ::PnP, inl_ratio, 0.15 /*noise std*/, gt_inliers); + const double conf = 0.99, thr = 2., max_iters = 1.3 * log(1 - conf) / + log(1 - pow(inl_ratio, 3 /* sample size */)); + + for (auto flag : flags) { + cv::Mat rvec, tvec, mask, R, P; + CV_Assert(cv::solvePnPRansac(obj_pts, img_pts, K1, cv::noArray(), rvec, tvec, + false, (int)max_iters, (float)thr, conf, mask, flag)); + cv::Rodrigues(rvec, R); + cv::hconcat(K1 * R, K1 * tvec, P); + checkInliersMask(TestSolver ::PnP, inl_size, thr, img_pts, obj_pts, P, mask); + } + } +} + +TEST (usac_Affine2D, accuracy) { + std::vector gt_inliers; + const int pts_size = 2000; + cv::Mat pts1, pts2, K1, K2; + cv::RNG &rng = cv::theRNG(); + const std::vector flags = {USAC_DEFAULT, USAC_ACCURATE, USAC_PROSAC, USAC_FAST, USAC_MAGSAC}; + for (double inl_ratio = 0.1; inl_ratio < 0.91; inl_ratio += 0.1) { + int inl_size = generatePoints(rng, pts1, pts2, K1, K2, false /*two calib*/, + pts_size, TestSolver ::Affine, inl_ratio, 0.15 /*noise std*/, gt_inliers); + const double conf = 0.99, thr = 2., max_iters = 1.3 * log(1 - conf) / + log(1 - pow(inl_ratio, 3 /* sample size */)); + for (auto flag : flags) { + cv::Mat mask, A = cv::estimateAffine2D(pts1, pts2, mask, flag, thr, (size_t)max_iters, conf, 0); + cv::vconcat(A, cv::Mat(cv::Matx13d(0,0,1)), A); + checkInliersMask(TestSolver::Homogr /*use homography error*/, inl_size, thr, pts1, pts2, A, mask); + } + } +} + +TEST(usac_testUsacParams, accuracy) { + std::vector gt_inliers; + const int pts_size = 1500; + cv::RNG &rng = cv::theRNG(); + const cv::UsacParams usac_params = cv::UsacParams(); + cv::Mat pts1, pts2, K1, K2, mask, model, rvec, tvec, R; + int inl_size; + auto getInlierRatio = [] (int max_iters, int sample_size, double conf) { + return std::pow(1 - exp(log(1 - conf)/(double)max_iters), 1 / (double)sample_size); + }; + cv::Vec4d dist_coeff (0, 0, 0, 0); // test with 0 distortion + + // Homography matrix + inl_size = generatePoints(rng, pts1, pts2, K1, K2, false, pts_size, TestSolver::Homogr, + getInlierRatio(usac_params.maxIterations, 4, usac_params.confidence), 0.1, gt_inliers); + model = cv::findHomography(pts1, pts2, mask, usac_params); + checkInliersMask(TestSolver::Homogr, inl_size, usac_params.threshold, pts1, pts2, model, mask); + + // Fundamental matrix + inl_size = generatePoints(rng, pts1, pts2, K1, K2, false, pts_size, TestSolver::Fundam, + getInlierRatio(usac_params.maxIterations, 7, usac_params.confidence), 0.1, gt_inliers); + model = cv::findFundamentalMat(pts1, pts2, mask, usac_params); + checkInliersMask(TestSolver::Fundam, inl_size, usac_params.threshold, pts1, pts2, model, mask); + + // Essential matrix + inl_size = generatePoints(rng, pts1, pts2, K1, K2, true, pts_size, TestSolver::Essen, + getInlierRatio(usac_params.maxIterations, 5, usac_params.confidence), 0.01, gt_inliers); + try { + model = cv::findEssentialMat(pts1, pts2, K1, K2, dist_coeff, dist_coeff, mask, usac_params); + cv::Mat cpts1_3d, cpts2_3d; + cv::vconcat(pts1, cv::Mat::ones(1, pts1.cols, pts1.type()), cpts1_3d); + cv::vconcat(pts2, cv::Mat::ones(1, pts2.cols, pts2.type()), cpts2_3d); + cpts1_3d = K1.inv() * cpts1_3d; cpts2_3d = K2.inv() * cpts2_3d; + checkInliersMask(TestSolver::Essen, inl_size, usac_params.threshold / + ((K1.at(0,0) + K1.at(1,1) + K2.at(0,0) + K2.at(1,1)) / 4), + cpts1_3d.rowRange(0,2), cpts2_3d.rowRange(0,2), model, mask); + } catch (cv::Exception &e) { + if (e.code != cv::Error::StsNotImplemented) + FAIL() << "Essential matrix estimation failed!\n"; + // CV_Error(cv::Error::StsError, "Essential matrix estimation failed!"); + } + + // P3P + inl_size = generatePoints(rng, pts1, pts2, K1, K2, false, pts_size, TestSolver::PnP, + getInlierRatio(usac_params.maxIterations, 3, usac_params.confidence), 0.01, gt_inliers); + CV_Assert(cv::solvePnPRansac(pts2, pts1, K1, dist_coeff, rvec, tvec, mask, usac_params)); + cv::Rodrigues(rvec, R); cv::hconcat(K1 * R, K1 * tvec, model); + checkInliersMask(TestSolver::PnP, inl_size, usac_params.threshold, pts1, pts2, model, mask); + + // P6P + inl_size = generatePoints(rng, pts1, pts2, K1, K2, false, pts_size, TestSolver::PnP, + getInlierRatio(usac_params.maxIterations, 6, usac_params.confidence), 0.1, gt_inliers); + cv::Mat K_est; + CV_Assert(cv::solvePnPRansac(pts2, pts1, K_est, dist_coeff, rvec, tvec, mask, usac_params)); + cv::Rodrigues(rvec, R); cv::hconcat(K_est * R, K_est * tvec, model); + checkInliersMask(TestSolver::PnP, inl_size, usac_params.threshold, pts1, pts2, model, mask); + + // Affine2D + inl_size = generatePoints(rng, pts1, pts2, K1, K2, false, pts_size, TestSolver::Affine, + getInlierRatio(usac_params.maxIterations, 3, usac_params.confidence), 0.1, gt_inliers); + model = cv::estimateAffine2D(pts1, pts2, mask, usac_params); + cv::vconcat(model, cv::Mat(cv::Matx13d(0,0,1)), model); + checkInliersMask(TestSolver::Homogr, inl_size, usac_params.threshold, pts1, pts2, model, mask); +} + +} diff --git a/samples/cpp/epipolar_lines.cpp b/samples/cpp/epipolar_lines.cpp new file mode 100644 index 0000000..ed514c9 --- /dev/null +++ b/samples/cpp/epipolar_lines.cpp @@ -0,0 +1,106 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html + +#include "opencv2/calib3d.hpp" +#include "opencv2/highgui.hpp" +#include "opencv2/imgproc.hpp" + +#include +#include + +using namespace cv; + +int main(int args, char** argv) { + std::string img_name1, img_name2; + if (args < 3) { + CV_Error(Error::StsBadArg, + "Path to two images \nFor example: " + "./epipolar_lines img1.jpg img2.jpg"); + } else { + img_name1 = argv[1]; + img_name2 = argv[2]; + } + + Mat image1 = imread(img_name1); + Mat image2 = imread(img_name2); + Mat descriptors1, descriptors2; + std::vector keypoints1, keypoints2; + + Ptr detector = SIFT::create(); + detector->detect(image1, keypoints1); + detector->detect(image2, keypoints2); + detector->compute(image1, keypoints1, descriptors1); + detector->compute(image2, keypoints2, descriptors2); + + FlannBasedMatcher matcher(makePtr(5), makePtr(32)); + + // get k=2 best match that we can apply ratio test explained by D.Lowe + std::vector> matches_vector; + matcher.knnMatch(descriptors1, descriptors2, matches_vector, 2); + + std::vector pts1, pts2; + pts1.reserve(matches_vector.size()); pts2.reserve(matches_vector.size()); + for (const auto &m : matches_vector) { + // compare best and second match using Lowe ratio test + if (m[0].distance / m[1].distance < 0.75) { + pts1.emplace_back(keypoints1[m[0].queryIdx].pt); + pts2.emplace_back(keypoints2[m[0].trainIdx].pt); + } + } + + std::cout << "Number of points " << pts1.size() << '\n'; + + Mat inliers; + const auto begin_time = std::chrono::steady_clock::now(); + const Mat F = findFundamentalMat(pts1, pts2, RANSAC, 1., 0.99, 2000, inliers); + std::cout << "RANSAC fundamental matrix time " << static_cast(std::chrono::duration_cast + (std::chrono::steady_clock::now() - begin_time).count()) << "\n"; + + Mat points1 = Mat((int)pts1.size(), 2, CV_64F, pts1.data()); + Mat points2 = Mat((int)pts2.size(), 2, CV_64F, pts2.data()); + vconcat(points1.t(), Mat::ones(1, points1.rows, points1.type()), points1); + vconcat(points2.t(), Mat::ones(1, points2.rows, points2.type()), points2); + + RNG rng; + const int circle_sz = 3, line_sz = 1, max_lines = 300; + std::vector pts_shuffle (points1.cols); + for (int i = 0; i < points1.cols; i++) + pts_shuffle[i] = i; + randShuffle(pts_shuffle); + int plot_lines = 0, num_inliers = 0; + double mean_err = 0; + for (int pt : pts_shuffle) { + if (inliers.at(pt)) { + const Scalar col (rng.uniform(0,256), rng.uniform(0,256), rng.uniform(0,256)); + const Mat l2 = F * points1.col(pt); + const Mat l1 = F.t() * points2.col(pt); + double a1 = l1.at(0), b1 = l1.at(1), c1 = l1.at(2); + double a2 = l2.at(0), b2 = l2.at(1), c2 = l2.at(2); + const double mag1 = sqrt(a1*a1 + b1*b1), mag2 = (a2*a2 + b2*b2); + a1 /= mag1; b1 /= mag1; c1 /= mag1; a2 /= mag2; b2 /= mag2; c2 /= mag2; + if (plot_lines++ < max_lines) { + line(image1, Point2d(0, -c1/b1), + Point2d((double)image1.cols, -(a1*image1.cols+c1)/b1), col, line_sz); + line(image2, Point2d(0, -c2/b2), + Point2d((double)image2.cols, -(a2*image2.cols+c2)/b2), col, line_sz); + } + circle (image1, pts1[pt], circle_sz, col, -1); + circle (image2, pts2[pt], circle_sz, col, -1); + mean_err += (fabs(points1.col(pt).dot(l2)) / mag2 + fabs(points2.col(pt).dot(l1) / mag1)) / 2; + num_inliers++; + } + } + std::cout << "Mean distance from tentative inliers to epipolar lines " << mean_err/num_inliers + << " number of inliers " << num_inliers << "\n"; + // concatenate two images + hconcat(image1, image2, image1); + const int new_img_size = 1200 * 800; // for example + // resize with the same aspect ratio + resize(image1, image1, Size((int) sqrt ((double) image1.cols * new_img_size / image1.rows), + (int)sqrt ((double) image1.rows * new_img_size / image1.cols))); + + imshow("epipolar lines, image 1, 2", image1); + imwrite("epipolar_lines.png", image1); + waitKey(0); +} \ No newline at end of file diff --git a/samples/cpp/essential_mat_reconstr.cpp b/samples/cpp/essential_mat_reconstr.cpp new file mode 100644 index 0000000..2ebeac5 --- /dev/null +++ b/samples/cpp/essential_mat_reconstr.cpp @@ -0,0 +1,342 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html + +#include "opencv2/calib3d.hpp" +#include "opencv2/highgui.hpp" +#include "opencv2/imgproc.hpp" + +#include +#include +#include + +using namespace cv; +static double getError2EpipLines (const Mat &F, const Mat &pts1, const Mat &pts2, const Mat &mask) { + Mat points1, points2; + vconcat(pts1, Mat::ones(1, pts1.cols, pts1.type()), points1); + vconcat(pts2, Mat::ones(1, pts2.cols, pts2.type()), points2); + + double mean_error = 0; + for (int pt = 0; pt < (int) mask.total(); pt++) + if (mask.at(pt)) { + const Mat l2 = F * points1.col(pt); + const Mat l1 = F.t() * points2.col(pt); + mean_error += (fabs(points1.col(pt).dot(l1)) / sqrt(pow(l1.at(0), 2) + pow(l1.at(1), 2)) + + fabs(points2.col(pt).dot(l2) / sqrt(pow(l2.at(0), 2) + pow(l2.at(1), 2)))) / 2; + } + return mean_error / mask.total(); +} +static int sgn(double val) { return (0 < val) - (val < 0); } + +/* + * @points3d - vector of Point3 or Mat of size Nx3 + * @planes - vector of found planes + * @labels - vector of size point3d. Every point which has non-zero label is classified to this plane. + */ +static void getPlanes (InputArray points3d_, std::vector &labels, std::vector &planes, int desired_num_planes, double thr_, double conf_, int max_iters_) { + Mat points3d = points3d_.getMat(); + points3d.convertTo(points3d, CV_64F); // convert points to have double precision + if (points3d_.isVector()) + points3d = Mat((int)points3d.total(), 3, CV_64F, points3d.data); + else { + if (points3d.type() != CV_64F) + points3d = points3d.reshape(1, (int)points3d.total()); // convert point to have 1 channel + if (points3d.rows < points3d.cols) + transpose(points3d, points3d); // transpose so points will be in rows + CV_CheckEQ(points3d.cols, 3, "Invalid dimension of point"); + } + + /* + * 3D plane fitting with RANSAC + * @best_model contains coefficients [a b c d] s.t. ax + by + cz = d + * + */ + auto plane_ransac = [] (const Mat &pts, double thr, double conf, int max_iters, Vec4d &best_model, std::vector &inliers) { + const int pts_size = pts.rows, max_lo_inliers = 15, max_lo_iters = 10; + int best_inls = 0; + if (pts_size < 3) return false; + RNG rng; + const auto * const points = (double *) pts.data; + std::vector min_sample(3); + inliers = std::vector(pts_size); + const double log_conf = log(1-conf); + Vec4d model, lo_model; + std::vector random_pool (pts_size); + for (int p = 0; p < pts_size; p++) + random_pool[p] = p; + + // estimate plane coefficients using covariance matrix + auto estimate = [&] (const std::vector &sample, Vec4d &model_) { + // https://www.ilikebigbits.com/2017_09_25_plane_from_points_2.html + const int n = static_cast(sample.size()); + if (n < 3) return false; + double sum_x = 0, sum_y = 0, sum_z = 0; + for (int s : sample) { + sum_x += points[3*s ]; + sum_y += points[3*s+1]; + sum_z += points[3*s+2]; + } + const double c_x = sum_x / n, c_y = sum_y / n, c_z = sum_z / n; + double xx = 0, yy = 0, zz = 0, xy = 0, xz = 0, yz = 0; + for (int s : sample) { + const double x_ = points[3*s] - c_x, y_ = points[3*s+1] - c_y, z_ = points[3*s+2] - c_z; + xx += x_*x_; yy += y_*y_; zz += z_*z_; xy = x_*y_; yz += y_*z_; xz += x_*z_; + } + xx /= n; yy /= n; zz /= n; xy /= n; yz /= n; xz /= n; + Vec3d weighted_normal(0,0,0); + const double det_x = yy*zz - yz*yz, det_y = xx*zz - xz*xz, det_z = xx*yy - xy*xy; + Vec3d axis_x (det_x, xz*xz-xy*zz, xy*yz-xz*yy); + Vec3d axis_y (xz*yz-xy*zz, det_y, xy*xz-yz*xx); + Vec3d axis_z (xy*yz-xz*yy, xy*xz-yz*xx, det_z); + weighted_normal += axis_x * det_x * det_x; + weighted_normal += sgn(weighted_normal.dot(axis_y)) * axis_y * det_y * det_y; + weighted_normal += sgn(weighted_normal.dot(axis_z)) * axis_z * det_z * det_z; + weighted_normal /= norm(weighted_normal); + if (std::isinf(weighted_normal(0)) || + std::isinf(weighted_normal(1)) || + std::isinf(weighted_normal(2))) return false; + // find plane model from normal and centroid + model_ = Vec4d(weighted_normal(0), weighted_normal(1), weighted_normal(2), + weighted_normal.dot(Vec3d(c_x, c_y, c_z))); + return true; + }; + + // calculate number of inliers + auto getInliers = [&] (const Vec4d &model_) { + const double a = model_(0), b = model_(1), c = model_(2), d = model_(3); + int num_inliers = 0; + std::fill(inliers.begin(), inliers.end(), false); + for (int p = 0; p < pts_size; p++) { + inliers[p] = fabs(a * points[3*p] + b * points[3*p+1] + c * points[3*p+2] - d) < thr; + if (inliers[p]) num_inliers++; + if (num_inliers + pts_size - p < best_inls) break; + } + return num_inliers; + }; + // main RANSAC loop + for (int iters = 0; iters < max_iters; iters++) { + // find minimal sample: 3 points + min_sample[0] = rng.uniform(0, pts_size); + min_sample[1] = rng.uniform(0, pts_size); + min_sample[2] = rng.uniform(0, pts_size); + if (! estimate(min_sample, model)) + continue; + int num_inliers = getInliers(model); + if (num_inliers > best_inls) { + // store so-far-the-best + std::vector best_inliers = inliers; + // do Local Optimization + for (int lo_iter = 0; lo_iter < max_lo_iters; lo_iter++) { + std::vector inliers_idx; inliers_idx.reserve(max_lo_inliers); + randShuffle(random_pool); + for (int p : random_pool) { + if (best_inliers[p]) { + inliers_idx.emplace_back(p); + if ((int)inliers_idx.size() >= max_lo_inliers) + break; + } + } + if (! estimate(inliers_idx, lo_model)) + continue; + int lo_inls = getInliers(lo_model); + if (best_inls < lo_inls) { + best_model = lo_model; + best_inls = lo_inls; + best_inliers = inliers; + } + } + if (best_inls < num_inliers) { + best_model = model; + best_inls = num_inliers; + } + // update max iters + // because points are quite noisy we need more iterations + const double max_hyp = 3 * log_conf / log(1 - pow(double(best_inls) / pts_size, 3)); + if (! std::isinf(max_hyp) && max_hyp < max_iters) + max_iters = static_cast(max_hyp); + } + } + getInliers(best_model); + return best_inls != 0; + }; + + labels = std::vector(points3d.rows, 0); + Mat pts3d_plane_fit = points3d.clone(); + // keep array of indices of points corresponding to original points3d + std::vector to_orig_pts_arr(pts3d_plane_fit.rows); + for (int i = 0; i < (int) to_orig_pts_arr.size(); i++) + to_orig_pts_arr[i] = i; + for (int num_planes = 1; num_planes <= desired_num_planes; num_planes++) { + Vec4d model; + std::vector inl; + if (!plane_ransac(pts3d_plane_fit, thr_, conf_, max_iters_, model, inl)) + break; + planes.emplace_back(model); + + const int pts3d_size = pts3d_plane_fit.rows; + pts3d_plane_fit = Mat(); + pts3d_plane_fit.reserve(points3d.rows); + + int cnt = 0; + for (int p = 0; p < pts3d_size; p++) { + if (! inl[p]) { + // if point is not inlier to found plane - add it to next run + to_orig_pts_arr[cnt] = to_orig_pts_arr[p]; + pts3d_plane_fit.push_back(points3d.row(to_orig_pts_arr[cnt])); + cnt++; + } else labels[to_orig_pts_arr[p]] = num_planes; // otherwise label this point + } + } +} + +int main(int args, char** argv) { + std::string data_file, image_dir; + if (args < 3) { + CV_Error(Error::StsBadArg, + "Path to data file and directory to image files are missing!\nData file must have" + " format:\n--------------\n image_name_1\nimage_name_2\nk11 k12 k13\n0 k22 k23\n" + "0 0 1\n--------------\nIf image_name_{1,2} are not in the same directory as " + "the data file then add argument with directory to image files.\nFor example: " + "./essential_mat_reconstr essential_mat_data.txt ./"); + } else { + data_file = argv[1]; + image_dir = argv[2]; + } + std::ifstream file(data_file, std::ios_base::in); + CV_CheckEQ(file.is_open(), true, "Data file is not found!"); + std::string filename1, filename2; + std::getline(file, filename1); + std::getline(file, filename2); + Mat image1 = imread(image_dir+filename1); + Mat image2 = imread(image_dir+filename2); + CV_CheckEQ(image1.empty(), false, "Image 1 is not found!"); + CV_CheckEQ(image2.empty(), false, "Image 2 is not found!"); + + // read calibration + Matx33d K; + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + file >> K(i,j); + file.close(); + + Mat descriptors1, descriptors2; + std::vector keypoints1, keypoints2; + + // detect points with SIFT + Ptr detector = SIFT::create(); + detector->detect(image1, keypoints1); + detector->detect(image2, keypoints2); + detector->compute(image1, keypoints1, descriptors1); + detector->compute(image2, keypoints2, descriptors2); + + FlannBasedMatcher matcher(makePtr(5), makePtr(32)); + + // get k=2 best match that we can apply ratio test explained by D.Lowe + std::vector> matches_vector; + matcher.knnMatch(descriptors1, descriptors2, matches_vector, 2); + + // filter keypoints with Lowe ratio test + std::vector pts1, pts2; + pts1.reserve(matches_vector.size()); pts2.reserve(matches_vector.size()); + for (const auto &m : matches_vector) { + // compare best and second match using Lowe ratio test + if (m[0].distance / m[1].distance < 0.75) { + pts1.emplace_back(keypoints1[m[0].queryIdx].pt); + pts2.emplace_back(keypoints2[m[0].trainIdx].pt); + } + } + + Mat inliers; + const int pts_size = (int) pts1.size(); + const auto begin_time = std::chrono::steady_clock::now(); + // fine essential matrix + const Mat E = findEssentialMat(pts1, pts2, Mat(K), RANSAC, 0.99, 1.0, inliers); + std::cout << "RANSAC essential matrix time " << std::chrono::duration_cast + (std::chrono::steady_clock::now() - begin_time).count() << + "mcs.\nNumber of inliers " << countNonZero(inliers) << "\n"; + + Mat points1 = Mat((int)pts1.size(), 2, CV_64F, pts1.data()); + Mat points2 = Mat((int)pts2.size(), 2, CV_64F, pts2.data()); + points1 = points1.t(); points2 = points2.t(); + + std::cout << "Mean error to epipolar lines " << + getError2EpipLines(K.inv().t() * E * K.inv(), points1, points2, inliers) << "\n"; + + // decompose essential into rotation and translation + Mat R1, R2, t; + decomposeEssentialMat(E, R1, R2, t); + + // Create two relative pose + // P1 = K [ I | 0 ] + // P2 = K [R{1,2} | {+-}t] + Mat P1; + hconcat(K, Vec3d::zeros(), P1); + std::vector P2s(4); + hconcat(K * R1, K * t, P2s[0]); + hconcat(K * R1, -K * t, P2s[1]); + hconcat(K * R2, K * t, P2s[2]); + hconcat(K * R2, -K * t, P2s[3]); + + // find objects point by enumerating over 4 different projection matrices of second camera + // vector to keep object points + std::vector> obj_pts_per_cam(4); + // vector to keep indices of image points corresponding to object points + std::vector> img_idxs_per_cam(4); + int cam_idx = 0, best_cam_idx = 0, max_obj_pts = 0; + for (const auto &P2 : P2s) { + obj_pts_per_cam[cam_idx].reserve(pts_size); + img_idxs_per_cam[cam_idx].reserve(pts_size); + for (int i = 0; i < pts_size; i++) { + // process only inliers + if (! inliers.at(i)) + continue; + + Vec4d obj_pt; + // find object point using triangulation + triangulatePoints(P1, P2, points1.col(i), points2.col(i), obj_pt); + obj_pt /= obj_pt(3); // normalize 4d point + if (obj_pt(2) > 0) { // check if projected point has positive depth + obj_pts_per_cam[cam_idx].emplace_back(Vec3d(obj_pt(0), obj_pt(1), obj_pt(2))); + img_idxs_per_cam[cam_idx].emplace_back(i); + } + } + if (max_obj_pts < (int) obj_pts_per_cam[cam_idx].size()) { + max_obj_pts = (int) obj_pts_per_cam[cam_idx].size(); + best_cam_idx = cam_idx; + } + cam_idx++; + } + + std::cout << "Number of object points " << max_obj_pts << "\n"; + + const int circle_sz = 7; + // draw image points that are inliers on two images + std::vector labels; + std::vector planes; + getPlanes (obj_pts_per_cam[best_cam_idx], labels, planes, 4, 0.002, 0.99, 10000); + const int num_found_planes = (int) planes.size(); + RNG rng; + std::vector plane_colors (num_found_planes); + for (int pl = 0; pl < num_found_planes; pl++) + plane_colors[pl] = Scalar (rng.uniform(0,256), rng.uniform(0,256), rng.uniform(0,256)); + for (int obj_pt = 0; obj_pt < max_obj_pts; obj_pt++) { + const int pt = img_idxs_per_cam[best_cam_idx][obj_pt]; + if (labels[obj_pt] > 0) { // plot plane points + circle (image1, pts1[pt], circle_sz, plane_colors[labels[obj_pt]-1], -1); + circle (image2, pts2[pt], circle_sz, plane_colors[labels[obj_pt]-1], -1); + } else { // plot inliers + circle (image1, pts1[pt], circle_sz, Scalar(0,0,0), -1); + circle (image2, pts2[pt], circle_sz, Scalar(0,0,0), -1); + } + } + + // concatenate two images + hconcat(image1, image2, image1); + const int new_img_size = 1200 * 800; // for example + // resize with the same aspect ratio + resize(image1, image1, Size((int)sqrt ((double) image1.cols * new_img_size / image1.rows), + (int)sqrt ((double) image1.rows * new_img_size / image1.cols))); + imshow("image 1-2", image1); + imwrite("planes.png", image1); + waitKey(0); +} \ No newline at end of file diff --git a/samples/data/essential_mat_data.txt b/samples/data/essential_mat_data.txt new file mode 100644 index 0000000..d2c5dc9 --- /dev/null +++ b/samples/data/essential_mat_data.txt @@ -0,0 +1,5 @@ +leuvenA.jpg +leuvenB.jpg +651.4462353114224 0 376.27522319223914 +0 653.7348054191838 280.1106539526218 +0 0 1 \ No newline at end of file diff --git a/samples/data/leuvenA.jpg b/samples/data/leuvenA.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cded37550b1014524b86c4c99872268e71eada26 GIT binary patch literal 324949 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ǨVkwRU#0nq*$uAcIA(V0%4$lM8?Hw>O9`j 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∨7-#X@#%!7ngMXdK?=%^X;#w)O92Ky#Msyku$}gy=Zu>R zITCSJt$Q_?0h+Ix(?&*5g=Ox#+3R^(2#GhuKIcIl~2V{AIsPcMj>7a4BAG(}}sS*K+qO1V=d%vf>t+{Ta`?IRE{f0%V~ahme|wW`-Kes?yjFo|?} zs7_l=F+E0+!-%C;oT-Jvn7Jth$j{doQr?)OamHbb#^DyK^1xJjr-ge@>I0Eca1LiD z#0U*HHOZ*oQ)<<#)*3P!8r0UNQzW29l&f+EuZ#`08-Eu##!<{u$!4<K7-r(%pZg($6Z($^{rZme$vw5kg-6b!hR0ee>#8(c^nwMdUl%1cJEkhIoiYW+60 zMQFwI=^Nq|2(DrP^sA2vXu%UKKZ)6EA!-qM#pveMCJf&ew8BPfKM>ipnui4zIsz8C zNEk;qNWmPgc+5<12|R--s;ut zfUSZLENapcqA&4Jg^2Z%*Nh5*gD6S_CS@jUneb0@2dC`fap}rw>~>XY3zN#jFCt9s zm0_z~tID8Cof$yOmyeq6zR6r#yh~cvRQ~{hi2 zQ3TAy4aDLPxa~eXidRa@*vPBXrC$T;ZW@Lu2c(!|U>8+tL@Y)nEP@lBbF#%a20qLU zysnrwtxjuhUcButv@;z+bt^3u%Nc`~S6bIm^L3u0!#ZRDHM*h2whi^Ex}`eFtBqTz zS4B7l;?@q}!`}4VxK(=AvKLm!trn3gjBQ9#DII5niI2G8bv8|(?#_utTT(TvwkgGR zTNKAllv=(URi+C8JN7DY%jNBio=-5|v!+pULYlIuEJ+4V`~$(0=kJB9+pk@fyQNV` zkP_t-+HJqdi0Q^6EM5IOa~d+ZvUV#l28RswP#d)%)ml*Ht3_8K$6^sklT~nX!4Y_J zh4zd~)AWXGU$4;&zA~FFRvi9EP-T~!sm;n&>kFf#ro4s{w=u_^$g5UYPlOL3uGY*~ z^un&%c33eK!3}E-VNRgdsy5vr4oYWxs~U+oVz9W}eVOSbj$ZpN;zGY2fEpFw5{y{g z4w<5!LlCQLvv^#IIxUn%J4b-@(9?c4y{1~owSv2L1uJlP2mLYB7FvV`p8)`gu)K~q zBlO2NZkO=BT?w=@yD1O>jWWPbkiPb`K`+T%$}}$IGZ`UWe0@5oUJbg**zD57AU4}y zHu`w#^&eEG1p>PyHQ5#Fz>uNE;04pU1$iJbAD4{^~N&hpM6_+qP3VsjBWg8VU!(=v0N1^ zK%q5F?H1Z)qiwUT>8sHS=!IFZo~t7ozYRE&T~)WuA26QiIAw-dxeLbJsS?B*z$;mc zb*@g+HAa0{JdjHw<+%-(M=6x2N}#P)synM72}~3L*GVGemYea?;F*P;?R?H+R+Rw< zNq1)fi4aPOP&AE%TW*6B$H(4E-gn6S0hsBARsR0~>1i7}ecqyC$Rg_3P0Ko!ObQWb zSk)Ahc9jzlOKCg-X;Eb=INN87OjNXv73X%8wZa0c6m1C_;2XG_jSWy)9fTl?A$|$` zvGQ9?=#V8br0wFx2@>)NAc+vw$xqMu7s2M?#|Yp)5A{jX0UNy!;> zT)Is~rtZs7_!)y0GFI?*=62g*Sq0l$g$~e27Yh&|8w2NSl497eb}+3I`K3D7!o(#l zu|h?$7IEnYF{??4fV(wNCRUyJ5rjo{iGx)>7h{uMrZ=iwW$b;0gB51Ktgw|w(5`l- zQ(99A1L+H_fy_$;Kt+KdGrE=Yrl$}XO9`M3ZMDaEO(k7k^4g(8~xpC{F+H|v*YvXZh$X&zaM#g6EFMrFE z+7mkQ$o7;Nl>}}eGVWyci~PFbnns|o2cO7+`)#%(nsoXAn--~cU_DZ+*S8_pu`59} z-89KP4-TTpB-UwE2*?mPxd}Vg#Zk+yLQSuLRAp?iGDnJaY3D5pl`E-e4lx4mt1IlW zD2Am$6AB468c!P7)0U!^L>HQ~ezJ*)vq8DLc+jvnaV?NRUZjMM#Ji&nYf>hJe6ve=~ziDSV~ohIOy8EQ`F=^#L-@CSX8{q z&n3g9Of@StE83~X6WnW=V{9=`a+bld6$%&&c+oS6T~LLVxwu9=1m0_?l2>bWg5W^r11 zTB{wIy|xuTkw6u%W0H&S8WeJsNxcg+R?evM^%ZV`y}{u*+tQS}fQc;V^w3)Oy) z%E`B$Xi6K8w@m9lfRH6jih=^kNXwdlcOxJ`H#CFj$i<&MIX++IapGWBC^z+3|bj9s{@ys}wf@ziw94Nr@U6$-3HYZhFL zim}U4iw8DW<&hWE$PATul1T7_bax})@9uZ^3MtBi1P*xe5%THI1XrZ$-fgam-TP&6 zg;t{5T{~5Uv(>eFL!@qfi0LRgROD*@-X8UsL^ckOqQq6JZAxW>VVe}cS7PN&$`lO9 z@df%`p~2RxS%ubgkg;8ID43EmI3!v;?MBzgW|~xM+jHAbAnTUXl3B2GSr&2nIJM$8i@Qm$AexcSKfNQ*pT1saUO=ipkW>3tnoO zLZgk!O8I*tP*U(TSFYKABsjRt_(abu`p$eR9csYDxwO?SvsSfHo}4tHl+B3=GbjaC zTb9CGCU}tq%>Mvl&U&XjMUP&~OS|(bw=vD26|y+Fv&fh?E?=ABk+Dg#qg$&wx~#-m zluF444V8-1Xw_~d*X!KM+J0JvjKv86ysCDE7jX-76Gp99VtE~Qs~o#&w^+gDdaIud zj_%AA08OS(q2JHT>4z}@378!wPQZD7M-U~?Bn{n$a%nDV;Xe2nI&R#X(5%8Iyt} z&84ejA8u%}{vXsOHhns7y1Dv#R$p#K?8+gwuRJVE%<0!AHQ4Z5gl+v$4if(WlvSsd zigoZkO7t>Kre~GME|178*=mCuk-c9bk!95t$Lv+>+J)1yZwRZCP(qR{G{}MZ?P!RJ z+Hin{@hjZK9rlgPAD7smZSu{=WGtoDh9!3vPp)nv0$K_fx$g6<#}qhQz#=AOWJzoR z0k`>8QU=WBaCu^2Y;3b!?PCl!A?C5=Y}BUkDP%Ro!F-W};Y*PNzWF?Q8Iii2#uc=( zOv}YgncGd^%deC|YbMnPNqnr+B8fmKYSaXu(BqOWZZFfPPR=_EnMF0M-irNvmM-ZF z9n)+o+}CAV7OOGLG_Iw(38tfAn$tGLZRGU`ol9p2DEQPZW!5UAO8QS#W zmE#}jYg%C)gk-)`lV4Khhp0-#b!*qMCu(A{QDV}YU4$a8fckapV>6;I(Y130Q4PrD zaffp_%5K9(XlPBU^@Wz^%oRJAaZH&S_grYYXCS1`M9^&D3ySi?IhDV1`!gDQHW@ct zI{JQe{-DNMMX*NiZ9IM|t?Ye-CIL}#^xic>!%TwZbe!(&y$W?|5twsHKqN65q}VF) zxI67Wm@{Xy6lsp=>xdd=+lz_c*o$I>+sk>Ipstdz`JXYcHQJf6ZMtBxRdE-biit(X zvcf_z=9UW7DF(Q#9g`%cY;zf7mO%4fW8?E$hUTL4BUt3|PqAHjT!l(`L{q5R(KYB) z#!e?8X0^K(A7rvN66)2>30P#}jgqY6zBtVnlBqbKTa+A47GW;ARS;2D?oF*jnClvK zb}f>bg-~D0*Moy`v8Y(BklcAoi|~byrx+bYmwrz@4xra@LwY2YKe@RI8H!nLIdeNDg2Q6*jmFCHnMyhKUd6DncC6OYnE<IrMw*JDPl6WGB{=wIc~}**-|SGSeDd9LjM5r6-KMuOt2uR0P)az-HzI*6sLEWR60v9 zcEKW>1`=etu-j5Po$fU;H4o)_K87v0Dwut0%v-Vei`6lgZ?P#X=!q4qCtl~3-7~^i zv68i87j=r7)+(-%I#wAg2?W}nZo_fbw8mFfoujSNyKeRe8g;ONexX&*V`=3hNn&yr z@h=x$$IR2EUG@avu2g+!+-+ue%Zy^_oGc)8Uvuy+-L5OpwM z=Jdqe$KO#|uaWr;3k-%IT3gFqGgiHN5vla%TLYeZZKk#BhO9nNCZ(x8G1RKNl>TQ) z;!eZHT{wKj9KDeYPEN2kw7e2;t3B8bH$WwZeramFvjhwy1XKq>`Wo- zhSV%)RLRsXaaS@}oTX1M-DT~|T?SyRSFKd4RKqr^jq;0P`~k7HgNP7}^R*ItneOAik41@wcp| zi2=guD;O$Ns*OA@e-A6UmAQw+v(w-*7xNl?sy7{4ja>DL=vdmp+dLbyE{eHq9b&O? zY#yER&$cI}A(xd2WyS;-q!73})=^7JQev9~xPfFxL1#M>h6#onXgd~&r%N)cqyoxT zHh{O4;Pv5&#TI_Kty+ynJ}pI!fB=%DzyJUyU;rR>!SqvA#nu~D@)30sROZEekE&fE zm`uaMezsU|>#K0KC z$BytoW%W=!frXwz#zL5Zl3|xE=c-XL60;Fph9@Uq zGqdw_ZBgcw53d7LlU*{k+omi-DrD&&2{>_ugIIt-xnnaDT1-WKBW-}{X3_Vw;Pug8 zEvjZTlYXQN``UOX&lUSRcRqQRBThKK_ZxA^b}s+{%g!6wwIs=4$u1@T05I)4%zKJn zD{PPhO>vPq{{Z@?_8w8cB4sh$raKhRZMKQtV0R+aadLAxA}ioTHrv(z0NYUnY?+BJ zLKlDnXZHw%KYx_O3{MDPZ>`^uUQ0P2Xl6Kzv~Mvn)4V4m9@8DRExXJ|YsI#nB0TuT z6OsgvyN|!q9y-=jv@(b{VTh7d)e#RE-`T2Bcb*Xu+9oD{6FwIq_FA}-tFSgBfX$>y z#77w^h>kx=#6Wf}<86u}IPS%5_bZ<5u}S>aa6Bu$WgGX6qtrGIMq+l~aqYL&J^VQ0 ztz04j^mShXU`rxplp6NmnZSx&9HvMnV{({?ouhK&R~`Ihlzl;3dLmc-}VLq9SL)KP>P1YM5!WRH(oXs#ihQP{D8Q>)02GrbTcT zMTScf0ch{_t|w{no6HLXV<)Gqq`{nW81aGRL_;jH0#gyV@)(nl{{WYn&e7Ond$1LgQsOX&tuV*v2MEVkG#+;$txr z^=~r+wrggouHq8hShw|O=_#1$&fi!}$e#O89kzkoOMUw^h%v~I$R9(~3F08gy`yjS zgxE$H4m68mlDSX{dV>Pab_OM!K8R8AE?`WVfjEgNfZlu>d5HQLu9eJwXDLeE3rVot zo&suQ?v%6_O42c2jrZx_dja)=>IAI}L&92snSdZ_khfxn8nI*(7j3O0yuP3x>&78ahCt&j@I&3xRfW-H_HYj$l3sEV~HV{!JJy5PlQl8e_N zi+)ndYr0j;WX_khdorGGu2Va$(zZdF>3~Oe>g7#Es0cQNu@MJw!r0MvE_`J&-J_PM z6S~b&8l0Fa)YZbmfp9|*W*`7W>q_fX zb%lz#HYpt{YA0}PKrM+MPZf!@yV%^0rM*(dS&(@8`ilo<)x<8T#p_nvimH?3SGcaV z#?&TQiDV#Q$uscllSVP3>q^r=m%Y-nRKx6z7Q;)LWZ5RrTINT8Q!rBz!R_QlCYGiH zC01OUSb7W^u=rVx72Y8=B#x@pRsN+*qhiR&+KFn-EhWnZvAFn)`24cpSP`V|44Y2d za7gr+k&3FlrI$qloA^(Nku3#)vAH1iwZXZZ5aBiNlu7j%Hhlj89ZuQQ^;Git8O$|S zsW!->j3zZ5?HKR8CE2+&s8tYPNyDKV8QB*~m zvqse`Nh>Q$eKou9QJhS$09;2jcg=k&yHKp_S6ymF8Wb%=V=H2qhceCINnGnvl2wsX zpdj)~U1+du7-eoi#_%!^f|=s%Pq* z`;6`2ixsXs#=|j1kIXw^-b1F=prU!q?j(j+`h>ze#?$mfM8?tLL0w$MyzjS9y|AnS zHs9Xn&_4a~yK4Uc4&M%WD;+7)_|WUF2$N4!upFr3G6CuCUJEPc8!ktpED>P@_Beva zci{g3$Tlb|ID0olxTbB)s3nk|xdU zo%+gjH`7^nt*A%Ma#Ju0+rWRxeENS13tmPtg000g=^$4mRB ztis@?M~+KS+pz-#GD2a{$Fcw4M^lyjUPm)Pjv`_Jj~W35&BYMC zQf;X;&wx!xR*093aq@u`U>K*utc-P~!rYMISBX-mnJJsVG3y!Q4 zn^mIrS5&F75PKBvXVYjsYwApNW*aj`;@KB6O|PP?2noSV&EHFrw~*ZCAV^HtF5j7O zp3oPFZ14<8qZSedg=R^7z4)@+Q(8LF;NB~k=9b0YNY7D&fX#$p6v)XLR@ ztD%kT(FXhNVsC64@l^m_E3o8=;K!FZ)P21}sO;8eM((7|%ROPNhbKc3O$QIILpGNc z7ZU>pxPlRgu4XDJ0%QsJ1;^FQTFpzYXY4r&0fgH@odRIhsD_GZn_N|d>!ud9Awam~ zm4QC6$60$y)Sn3T^DI;FT6*$2$_XM?wbPl3ZIuk|)2H$Xa4-OftP5NQe9YunQc(g` zehRg;SvAodIzeb+dRcZ;Wp*aQIwDnFQpqfwzN9?`2}9{KqQnf6Nlb`NdXQi;x`6}| zwJF#FI66qQ+exwC5Zg7F4ogzhHXc3f05*t#IsNfVOHa2bns$pTl~FqMG3c?Xu;$H( zV3%=NV0q2dHD@X)X(OPuuon9U!ia0RO3HDTD4jZXK`s^J5E`Q8=_=vsUuM(RHqxrZ zrxLv?)PO`T%jEja0r7Ejp9KDLV!H03r|}s?HWF2tOEHUwLgGZ;7SQNPeKWBos$_>4 zIcb#g8H=-j4?cBilHVoeo_aumEQ>U2*UBgWX7g0w zjH9K+*-0C4RB7`jNVf5?U$kq0L7>1$y~x{hU^?t$^TlZ_RVLY)F{@sr!q@{Wv1-6x z^vUYOU)7$l4WCpVpaDyjO?eOkT*;tTHFURiI@BPd59q$Tc@ihQpg5%$QfgAv69*yA z1*S5@v25CWNqH?jsPRuK`Ah~vgCU{I*W)i#o%qJ#F=nzLL}1p=V>^^V1e9@z@#bl< zjU-yGP;o3%I%cA3`a;Q>k>)FsiH)Q7!?*!)BI6Mu{{X7yR>cMX07&b9rH%0n_N8OG zF2nC{EANQmxWc$KdSZkW?=}{U7z{M}ginZCoWtmfl`ZRR8-biRh^&eb&L<-<$XHE< z@OiOr#@Fbgsc>1TOh&^9ToNIK*y5))N@QWeJ|%cT*XHD#m&7_3kiK$-oI!%f`1J@N#Gz2x1PR3~wV75grDlHG%|8ufI1n zge+$b-~={Qao!F{pi7ZSL6L0`GvJHbd8GdU)ae9(O|;w?CT;ngD9z>tg+g}T4${PhkDGgJ2D>kN z8=R|k)u%O^ERC;IUPKp!Nyd>|a~TB+xD1vqw*n+I6fw9=XO3Q@JF*rOr~csa1=y%?Air7GkF;r>1|S2RuBfY zoEc~g-J$*IxNw%;TCZ?+a(D zT8CNTTXL>%%nS~mv68CXom^g%#wuY!jyo2w!tP)(RIAr>#2ZiO$rKwDxV~V3RKRgemOXGN;TW)Wi` zY^P4EZguG@PnC=Auyqu6A17ZW2vD|Ru!Sv>OebVl>8K7%LeNDU?X7W@MS70?d|5or z4OT(Hl;B5gmdvVGwN~4v1$GT9Xb1+CHV$7*0cJWx7MnE2{94Bb%;qWgW|pw>bfUQg zgc@vts#IZU4K&tbNdQ4ajKtnmN?9A4<5s)n?yR!MtD#wo$l9+JUULy}logXa){mD= zC{KU_VZC|56>}EO+owh8+$CaL9JcCQ{{XHLT9FlPi>XU1lK842sIJU;NU(ra5%j^6 zT-0ftW-A_>db?Eertsm0sa~8()V#tts+$kAHG^YVHVT>Y5t$aqK!BsSj#P{}7`$E# zr4uo0H>lTAcg+`QPW>VlWdY8n8W~E6oX#hm&a=@L(7Ards=G5g? zBqd^h9V>TST{R_gf@rm6|Ef1AUo%C!Iy*ODYS zad_O8OBr|>mDNv+HkEvFn0oV!!`(w4G_0~%u#i|Cs4^D303lVmG!!Gv3Wpt619b+v zSUPJObB>$Y8xxSZclWW+kfK&CV-5B(N5t3Dg+6UWp^20FT?;d)vlBZ&SPRVD$?1Wb zq^PH)r~r$RacC_Hzc?nw_-C=L>(mSp0I;t8&I8BV*zlAK@764Y0P-^(7Mdz}fXjtOmgn^z%OtqxeW6iu+v zd?~;mQaQ4!{VGa*md%C|sjn#dIDB^{A;o%Ut75vIrPox;#cp4t5Fsc2+ywiY_Ql{8 zF4h~;BPpw;X$`xUueg$!Wt;9Fr9#TJ2<;b9DUK$w>JSl0(i~2JqVP)@Vo15@H;5f~ zwj%3#Ms=w$qBMn7S&Kw`TT4kZ!GnSeSj!BnvE?-*t65EQ`Adqnki|he_Rav3wd=AW zDT{>kfYxduzd;8vQ3B+!x_2C_Ly8J#a{X{XmKPV1$z3C=&Sw@fIfsH9Rux*Dg6W}T zvo^F$%4A5d`@55`dmVQ_mC|%GUX~QxE?+M?vjAa0p1(Lbe1cZhqNHO=-YpBI2X?)r z|Krbi}g6{n~PSn^^5Ah?Nt$}!_&QaKAMw2GM#O=VdXDr9TJ7hV|?CcBRbH>w>S zP6WEC{{WH=%#INXWPTboHge9C&(S2@3~kmn+c6dF$WDu|eIpe(VxMFfh?!q<&j%=dr|Qj7D0kV5?=dRB#*)77ZFR+1&6$>t(PSwi~%}UEXvWexz-lz zHY%tOsFl~LS@$h$Tm*Jxi`UC^_BCZq8QIL`7HJhq(#&;Zu0=9O>9Z}bk*PJShe|-y zNp*sNLttVgj4_zYca2ZLVse>)sN0Ll{Kk!XRP0u;n67b(%VV;)X({#Me{Bg}JFpGs zHdJTgH+-xv#w~riay@U;1S(afL=qr_zTn^5+y4MDulHLnO|@Zf5wA1OWtDA0E376a zR86~Jqy`jWDT~6V*pfCN95Qe#vGi-5b6bvTT6u#hTjOY@WH7D`R7&AUP)v&bOUkWY zQUupb42oho)8JAt@#My%ECZ52cXC08p_0vk^*DRIVC6IM+cXg$OUfxqCZ1oEOwS>aC zmX^L|{DRER1-)09k-hUQrRrG33XxLPJT2gvG^7~Y2O*5=u&FU@8AvYLV4AZMQu&FB zoSt_Q_E!0BVYI@YKhV-$Bwt#ppxOQ_>7dTFA5{%~V0hU2deh+;u=s&cdFgQj ze?QVNiX>_7e(k3NEYC7Wm zQubw-kj0H7bqso!kvo{2PG2?B=}cL-XzQaUjBBj$lV!ZK!>Lo5NkiN`B|a_huou`{ zY2Ihs&e&m67{=rQ9BeQ8?Tpy`S)M~1CCuMsZe(xLxmwO8I81GBFjwkP0J#PK=UFol7;B1#v$%^hw=IWMuEE9B0%hY#tLHDK~V1(gdW$@fuhVAV?i%et(u8 zj3Y}l5M&a1M#S6O^WO&f1nJ67$KY*J(=mtA^G`jhwGCUAS${jI>;VmYb!RW2R;pRB zZicCKm1?M!bXf@%8zfD(Rv2gE?9!OjT8k+c+htQ!C}Zm_(pFlFtGdaW^>K+B?n=}l zYQhOtR^@S$Wv!pSSWA?jS?58Q5qlsD!P!Y!v0bFOP^7UU`)@N?dXo!Px~o_1tYz4v zn~y`dM@be1}qL!p*K+8b?eEbrw#|W}yqnWT-7@*%;y{;~7@8%Ob?k zeU0Qri0L*AvgN5-tf!1-XnLCXu*ze)C_oC9n{!v4s}4e|)M2&)xzt8bcW@ej484YN z`hzE!l~DxNL^@PiOBCFNweYzSl;rDMLgg%DcAA4#9AZ>(79OrWCocQMdVTHu?}m_A z4ou1Sz50E}kv;<=!8`yv7^K-n%=S+rRYJ5?$LULHvFMJnuRbcG)#g1j>V)Yw%ORpG zmzaYxQMrbX?zM{+7>lJjY?h)s6sX@TdQ&#@p@p%PqN)Wh&17BCqa|YLHm@{>Lb8!t zsL{Hp3y#RmK+5K`q}wSvcFrzVv0|`{DQf=!+%dT)yVH`{()6!NxB&|ec1#MRHFUBy zmi%4=7nKC`har`zR;9F_=0bfFvlsXa;uu4DsId)zGH*!YJUPHHb_5CQ(3txlNkbq4 zCga?ne!PCzmxe8Alg48&)se~Rnm6!PDEjJoR8-FD9+R<+MT}usBdLi)6=8vkszwXaYrW@ z+Sd-oV;zdhG9%PjZR@CuLD$@`)~AY5#alKa!-;Y?ZGs-9iLJr(5xFx1a~MpV{mf=k zrAHkfoZ+ry63gnCmDig#N~L$wveSZ#44{WH84e2O-VkZv{{WN=4_&X$=hFLOLotXt zV&s_e_TSqDSiEuN@-;D)D!%4RALaPlsb3h3eoN*XuBoP@Ux-^l%Eh5pnacE}AQ>c8 zqAj@NE-MwK?!_eKDB?|4v{qp%JDC8ayE((8h^021+iIG?mlG{bxn*<^4AwE}4+#Lr zw<5^7lDB^r%ZLy{RJ?vGD{CHM&|8lkimREYV#=m^ES0+#er9Pc)Xx`EFv)J{Dx*D6CcHx?IO4Pz6jC;mEq6gA=#=^Y{HQjO@bX z5CGVV%zXCa&jvTM8BCq9$lx#1w`Vb@C}C_l&&HLtQ^Kj?V;+Uqv2;tPbnG|RF=FfH z&{&`XA%rrGF_<#4mEy4&ips>P4y}=E+g(+7u;pD(SpqjK%$wgFooPZ-w?a#1I?=j} zeR>CFiLP%Gu8eV3%i76X1Td6vSL@kg*F}wBF|sTcqB?7e$pV0q{3d5FB?!h|$z<`W z7>iib#@Mrr$34PxEU`~7HJ4cx+HL5{Qrj&qt&&KXg!nT;%&L*rAefDh8xQ7j$ppow zK$EcAcjn{oag93dSo^dxR56&mo$O^0ri9Ka-EUV`xI${nRf{^dZ$L6eBYqN7#d!{0 zl_qS&>MYGHwm&z5rs{Mn++_-N4)r`foxP9%zkOK8!4o3I#uDsU#oMy#j%fgrPPZDO zoq24!GHk_KrVm5})jX9t*s8FmjIQBR;h3{l)taUZnCp->nn;a6{<^^)4K$u(CX0(p z61y1Z*PgDJb=oQQ$gZ~yaV+AExaA0N>X)Thv3Ae^c3>rw1Jnx=766NXk^9@_g=GTZ zg8&O`NQpCepSxj;Na(yz&DN_|@pw%=nA7&mo2oI{TGXuD>LR*VMy@XjZ4`1P4Q0CT z8o@3ULgxHggep|#H11x;3kGGBJwchYcW~{+EmR1Vg{J-?Y#J}Ko9K{MMnE$bF|;Av zVrIHlMJzS5pVO>mnanitmEOivS^V5*A=iXU8yE z91C%FmtK`imqo61dAS3`8txF5x{o3sJFL8s{=4n*t?)>^p({9B2MJ7mNQ@=9*_h{ zfz##EaGJm(0|6J26SalrP3;HQi~{5|_MlhGsQG`Q2P=pSg?!GQ$i_~x@;Y{{sp{Cm zrs^A-6|EKW-XAY=E7Rp(kR^)i z1%OiR91;PKmy^NU3z-@XxsAuw$YUPo zn{t|4G3f%9J3mRTKiSZ(y1588*Rf93c{VMQu9?(!>SQySDtGdFe;bp|*hR~Aarp0? zRKC^)s&283se2uS$wLfmKQ1`i7;KHAi&wPytlJE+XP3j$sx>lg`M@S2VHpZF?QChV z;6(h==&C`Y4A@wUshXoJP&cH*RIz3(fQ`p{WU^pvdmJlc}v*Xp_}2NGSb@$WaV)!j6;Gf*|UbA!m!65+1FT_7%!C5 z!ecSF&c6$qofDP6sO)sq)r2i}&bA8@%MdF4wlazn1uW$zLmXm9>rHiv!#HO4+77<58jWenbpR{rF=J0&8Qi?5|xqc8FTWBK1qUy4Yi=YU}v6!ZJAhOI_K^Sj#$slGtv? zXY~8#Afm6v2PQRuaE|n z5!M)Mj>=X;gCTmpL@S%pha-;Gm`mZ3x1GU`8zo}SKN+0UcI_dyPY)EbIf|*Gyk&#@* zd4)Jgt=!Ap#M84Vf)uR|B(N+^5L}~lEDDI*>-%kvcq{^tL{5?k>2t-s_qO61JlT&& z#?RGVpa&d;Vciy-_=$YzmU&5}JhG!2=sK#7l+^5;C45@rqW~s$z6B?Af3Slu}a&_g5u1w-%6C^y2 zB(&-6HJ-<1Yf9*<#bWi98HQs}3!nYK)W8-IbaEXviZTxcgf+iZI%Z_19{%rSt5a7- z0&UW?yImHnI*_M7Vljp;1eXULGh*5XQ~Nc9!4wWgt&-N7!p%zvuu%cemllUT*bI>Z znK4vs1APJ5nOnUFZcYRROYCw+dz~D*J%EIFMWGVLa z#Br!_OsSX3DVZ#jC)GA!-r;K|WT$f@V6mGY88U(?m9k6%AYf;}k<@7)6lE{(+=F>R zNpaylrfZx8PSe<;c>C|meV1y?<;3a?jb|d0;;fID*8EXV`Qf zz84-W?Tj1l+!n~lz|DG0;$-Lz;2~koIK+`|Ln2Tm%V>d|*x1P9ZVaO)w(_5*TSMrW zj{IE#Y$x1gq}L)_cZv3hZ41K20=+6@d69wZ+7p7_W@D7PW@muT!ylg8%twVQvXcdD zvl(Fw8HJ*l2$PtS0cwwUh@GTJ#&?*W(Hwj!0Ejzaf1V~K>L=U9V*&jhwI^O1O{}YH zs-S$+gf?9)a3!sUHuX&lwNu=0cqFPfhIN5G&fSg^B^jtP>O9~LtgqH(rS zfvu6tTTP3kH*EaF7IotvU3Gf1NWD#LSjmNviH8&yP9*;TZrKfugrzvNbOZLofo3B6 zNRmE$eSWvVc0%)$Zb&Q=`cW{kT!DQ%$rMS!hamtd7@3ILcHU#&6xM$+kvlHjpr#|H zGaO6li2nfhfruH6w=Mac#D^j6G1jrcPM^CaIZ8I@Fw3IBsFP#ax9%)P!$MOLzSbrL zN=8<|+@rvwa;T9t4YfeR`LTa5uQRsu12e!I#Gv9LI7x3YG8|`UgaKJW1|xrX{NwI0 zKu<8u=)ef}ECfDS-)zdf?!MB&3Ig9PcwHJ4o%yB4#&FmQ|_RQ+ZfW zS9IB26JJ?n`);T#Ojp(9B3rm&n*>M@uutd}6++%hn1y9pwN=7U(hPqfJ%~i$AZrk_ zjP?@ZTuusLdBksE{Ib&ptExqO)=ygF?qMBPrMz`onB!()SHi<;9$G20L&`OHPw}L><=J~!ICg4t6Y!lzLM5um<%i;W1!n< zJm60Z+{&FYxMObQ$tF(MC%<-`B=rM%%W}Zpd#y1&O zo2@L{3a{$xh=TgYo}Ei!XQuuv6*LG&Lb&lJn-gtjiy2eO%_@seD|z6#$~X+Ivh{Tn zY7A194oe$?zp0y8gu*P*vq2UuG3o+oAR5eQ$!8qdXwJvRbXbWn1c}&^Jf?Ppay2yq z+EOCnu0Y;mM_-V|7SvQS#iw!~Hm%+pMTSP=XBPGLj>XL86%CPff+7fH@rE#X$B5Fl zj>BXw(p8*h=WX>;Y!N6k7LY{o7=bB{EZj&SV`%R?Z$2+K#3qEo={*yF6;|DhhF#b2 z^zK9GWbv>#oPzAJm6KNbVwKt?%IexHvemlVOxa=2CitV3FixPw*urJ9xTmGdWqC!C zYF6R>&Q)zg(IPv*?FyJM*iI%pM%%HHr7VimsiRPLkcL*|H$2VFhooX<3Qa{7WFHd} z2GB_Q@8lxb!{*k_Sn^5&rB??!?4Jd9g=O zP?9{UsFg^fAuN3^4B1w_+Dg&{ncGB*|4A5Mn|m zM4>oC;svUXp2jBy;@O#zX3^z&+t1tH*pLLsxdi&!06(q6+6s8!0sz3-eO=zVD~Mi zJ?3I{p;r$Mr;8{RgxM%#EK&$_sw<{b68)f9*<@OWtoto#jvQonly-E!n)TC?U27JW z!m{=|8<9YjW!EaB4SJ1i_(roMG0u9sWMzhSdxw<-ee?rz|2f;JMfLad$#@%w@L_Z+9DMU^9GrRKAIC?-}T2gQsorw2&#gozXpaV4%xkB6>hPx(cr{?;7r zco*l-3~CGsvjJ`=ppzcIaB&^NH9k1^uake$UrZYy;GieoVX(px?K{Ml(;IEKyvh1U z&fROF8)DKxN?RbA^(l{}dz-*C5+(n|66i?oiC;^wp~;B2Wcu z(J{1*$|jk?4^L>~22B%b9MgjM(8FDj2WIp5Vc=kuTgTw_9W(~=aJ=s%1LPdyrJCdNN6uyMK!N5xhhXav#JT4Kn78;y1y zpTJrPiRCUZwKuBAS_XK)w3ebIae^I)WULRxVBB4UeKgooNl*)3qSF~HYmJ0EI7yjI zMd#RdwV`1f?G}OvgI4ZWR2khXAA&l5(a*>FR;~V#l_88hEWM(I_@VA|q zEtn1^M%(mLCo#%9%nD$N2bXx5?L230(LOsu{r&yVrW7@%{Wjl;$IzO-DV=<)qP~f@ zYmh*!XlfiNG6aA`oB+J_h=YQN-X+ZyoXXq4fIyrR=dL+mubb)pe6V*CMNXw_tqyhJ zq%DCPh7e`2i$E3zLmYr6Vh87~c6B;roU>Sv%>AM!LVJwE1lE7O8=P;jA0ERy%sGy& z)+;r))sUD>tt1Y(6B7})7-Uv znEG2A_%AiI-dT;QXBnvE8fMhvvU-0c=wxz;*o9cbsKNUG0K`a)%3z?%4{6<(A*j5J z%`Gd;;B@t?QczPje7w0{wOJO&4^fZ|3Qfx~9s?oXW(iFg2--AETJv2jq{j9^9CqGS zl)k8$F4992Xr_Bi#P^NjH<|XI3Q^{Nm~~DK8i!M;h&gAxB@ArafOo2z!+GM-T zl>PiQ^3)%CNhE_LDe1`{Q+>K%WkZ{&H<%(t&hdYqH-s23g{-KwuVOS1MRQuD3XY`3 z*Dhl)scnVWt6D@z&#lbn7s3h)sT_ryBcT2gtqgq{LmDT_L~H7NrAl+OkJk^eoMAz7 zi4q726NugdN0!=hrRS%a^hlw4lT`>XgjvfoZIIqGED_z{!I>B-n1b92I~Y#g+)v^c z%y*;GKTv0lAi=N@%a!a9G$UvzCf4UWjLi2g9j0TH?=u|sc1)T4H4r(9Y7ZM)IJm+J zH1z;!q2K&OTic6$eDSoL$CY0SwJW;fHEu4Ya_KLHU0(ZeL}Jb=Ax2rY#ot7+5-MoG zEc&xE;3&Mh_;nySp{^<-+HMy^mbJ%<4ygn{6iw?PF=Th&j0Z0B9ln_@cUANM09e+! zH^%$H@%2NQLkTS-ArYO5Dg+NW4lIF)TS5d|5z2SMK7Q*)-hG3=eCxf^M_vMp6g!*~ zJvDxrts+Gn>Ds z`8l%c9%14Z#3^J|*{iUH5N+l4B&1v{V*a2Mv7C0^1&kpfgg3q%v?Rh=Pg_`O&2Yk9 zW@GXUG9WVIwpLFLB@w(Wn-|nk+GZeW417uIm59OdVnkLQI~W`r$949OL~ALLiTeAF z(K1sTLko8W{7Pnziw=ecNnj#S?G>lS83DH$BdQ9Sf!~PE(KEdAw14oDcA{O^q604WU3MYuI^u_1hLce4)hF&jtmWvQ=Pejm(1zrYEP1q{~mM zUd-2KK~rkQmIR71=wR7!a(aRnTEmoj--a9;#2`H5!z7Pr2xc;;IGKq#l9cKKltRTu zgIR|XWC1D0qX?Qx--z8qjLhUSSYSmo=jr3C-A+FlkFJ%T6fD%L1CMg$D-cD;%pWj& z3ey-xFnmYM{7PmHWbLG$Q?%`S3x%=*UE^_s7}{WFAce5NgCdYv6bXQzvT}@VL2b~o zgUs2j5&K^F=DN6QOc8ZynB<4ouUe%skE$VRV;?Gr zl9(2b-aWesrS9a|G-+xKkW*ZlZ!29= zZIrrrN-^0kK_+2Z9qC~l-HnllE;<^>uHRu|HD=Mouz(nDeM-tLh z$XF6m*#=HD(CBc6o||gaK|6IP%yhXI+Y#3=P*e`)pl^p#D+QA>B&b`KxI%fuy;{eR zw#DDny1QPyJw^*8x`NDZI*n)5A6qIz8Qc zXFIGchkAS0)Y|OlMUgiq`K;g7lZPb`iIZrwRwFUt>5&k;O77~L85UVhx{jl#DOycy zx2YQmvVCM@lYOSU73dwgqi>McYF??@)7lkVzk98*wO&Y*T~;2 z)ygh~&D1gItu|;ChP*8piou3e>DO6DCqfDEY&@RIckN`~QO}ySsbZ_832|6~3hu|M zwOeIgy?@&SU3(i@4kB4~1L~7kjKa=A-z`=L8-!a~7p>pSS24<2=?PbtHjzb(FE379 zApIpu+=q>IE+%05n3n!6xIcb)jZ-kH1hwt64`VnTgNt6&0OX$Juza4qHC7GF}o zP^&Rg5EE#SAiC>VG6>}uF;!+7EFJJ0s!3d{eKjzcpd}P0y_{;0yU1e+WJBxi)}$gZ z$qNl(6d^`l%Ix}USlY9S79D>2PoEEUO1rZ z0I8&Zp7RzjCao6+qGRPod8~Fu<|ee;u9g4*Dl2IWZFkxS3@w&yP+YTjENmznGvZ;P zP843(++5mic^4R}uT|@iT(Ke`sUQ<*u{&H^AaN0h`yY<1s^wuBGsi5JRt+(UDNinp zawB;KbRCiijmXLDYb1aUW@E#aE|wD^a{Zk|yyb1CbN349JybRmrDdik8_@y>7co0(l8GnvADl0+|_sVoO5aPhE^f{q1}eoluW& zJ6mE8(BKCX7!pOBNq#=iEUY%JMLsp)X6X1xHpQRh)calu`CcZ`hKL_)#lP->f) zf$6_HfN9~1)fvxM!|EKyp13t2SIHRcl_XZiGTUDRerF;s7fRBzYHPu4lTha}Iozq+ zwHVx;z^b%awSq<5Rw$SIM%G2Tt*uO6{w*d+#5ZRK_Hua&R3e)T+T1S?&d<0I?sx%KJY7G^Oze`BfRJ<3dGn#(oG`VC@tc2xpnd->RRZy5YE5aTF?o8`;3(rOnkbaaFD&pat7)-ksS?tR*or*D@(8=vlo?6U~6Sd)t{E z`3A=^-j&mupHdYMPlkQU^kt-*fsenKt3ZSXEIn@pg)t$D zsO1t=X=CjJN?DxG+P!TnQ=)5Hy^6+Sip?%i;aLSzXQQUM5b9sBT}TyHB*8K!c|V@s zUvT6ig{tRix>aiCUmRe1KrG?3H zq|@|?kZ^SQu;ohtsnR`99)(1=qfX{%Y63?oUgMCA?n0W9ZZitwZ>UEJZI47CYo871 z(;7n@c8>0#W$J{5mOh3)%`>@>fFg-=sh`T;p>G0WQ*oHGYTTk&S}tps%q@LEsuDQN z2AsKemMH=9+*2yzG3=>kr!=zT8EW$S79lP4#cQ31S`$Rsm9P@YWPnAFoPnm`A6|ZY zV~GcOpC}*B-Ekb@G8XAywivQjC5u@j(rQfV1U@mqz?4pAL04d|!YKChp%Hlme>O!e1tdXsoh^@<&ty0Heaah}QG^LB! ze1WpD;_Y9moE=*u3^H>wm4dq@ERk(HKCL7a$PrZi*y2XSHuEcfpCTjj^1?=deiL}w zdT-_Wk%+OiXjG|16*A@MA{koMhpG`Xkef~P>Q*kRvN$}F-y>d|9akGkb{KncWGkxU zGg z=^YD#pwX*UHfgu#bMn^$Wn7|`y-ZfdAtVYbmcf;(v@1gzQ4oF}m7(&taY?&0vX_Sa zex+M=>I8m#8|P7t+$hcPchAfYs{8R7}-4iOUuut~(=LkORuH zKQ>f=A6#az{KkeqOx2mLs`ewIn7`@MW+vJiR$zm|jJ~(bGMX2EE_pZ9xIFlERTX--q`h|L zJQ(LOb;gmH<7$KKlZ3*h4^LD?i9IEo*lxOJ<#ky@16`*Zs3}98Mx7*Pa#n#AR}j09 z>}Vb)5)EVlf_DnWQcn-8C&H`AaouG6`OxEJ*)%hareyOwOSZZM>nVPVa> zW3-srt66|F%`*>NG+6?TnNmhpu0p+BNmxJ}Dyl0BNkmFzr8eSUjsUXGtx$$zt;R%N zC+VxGz+41kp`&c#1x!WlkttJhqNhB{Yryjfa=-#J$#{%3=l zp!5)v>Da2lx4~=>>PRiA`K9F8oUP1N6#8`n4AG9mU@I}MYz)KIipEz-wPg_qO^UGc z66y6!RvrkhYOIDc2CP(5)Ri!I*COFoYc#r^oVWoty(ZE04p~euqzs547V;;!U|9od zXTzjkMy@Sk^21e$64p`39GK!~4p?7ZgT`fWOT#(k4Qg3BhA^~ol^#h~Tq;*Ah5H!^ zVL=UM8LU*9>B4%3QZ3<&yExihFI>5jC2U$le1wyjfB-TJI zDDmQbF$(#7qw6ej_DE2!p}{e=?BA_b#3fs-FRH;*ucYuds!~TH#i)A5W8suCHVd91 zckZ=g$GezT>%uJBVb!WmnXIK*dr>S3VCxfJ5Wi54luLXaXs{OFkS;~-y2bwE3R!G= z?PKH*Q_ss26zKejU!z8iye>lHt1O7p2aR?*!zuu*G78F4V=N_zn0HqXM%hV7Zq@MS zZs&!+LcJ=PDXV?;y5sX)E%jQgWzU4uwu?CWEDMMbY4uj#m6XER&NISh9?EK*&8j%H zzc-M{(xFt9j>D1lep=|41+!R!=Z>DWH6288JkUr<8I8;(SJrC=A8a2#P+gl@Z=Ot?3x-MEj|ltBOphx`K)fMANn#RmzmYAZQD zq_Xb_fw1|imDni*S{2u@#vCa?z=!i)f@Op<6|#jUr}TvH-5c&XK-iw2NH%jfS%@f7 z%Mb+RwXNN<_7p@YQq>m_)Sj$u2Ud}$gCsLkb#VmT?Uj=U*ik9k-)=CCeCfRDNf{M;TX_9OyGZtdMP&t^Oq@e=C zGa`+|+bSb%Zcm_(P&aIiWehsVA~~|35LFpvjxQoUf5s9gJzpP$%wwZVX&bMyRZfm;C^;;B+zTp9$+*#4Y9j7etg|IQF=>#w zf>161#wI_=;jc|_)NR#T%NVNl-B~tt?Mn6VDm$*M`?VjMt(m!H84QvT+4b>E8XyM* z(sG=pn`E;1cP*%G=F2z}CM^ZGxy*bbE6P_Czi6l?EkCj5!6}6?1u+U>wfwNvLMV-@ z@2>Yet5(UW(t&(Q`i3r*s#8dqN*P-&vXb~$E?{8zOh{^F6~^41QzS*Ck3Vla#uQY7 z3E&I!$DY`4%u~T-I+yg8iOGhc#@(E*G%4K5AFK4Hy4D9&<}!BQ8kx6}*~#C@3A+_h z-jxknx(rhyOpckNn@`13t#X!4*Np>O&PMekzt!ND*ZG&C#Z)z+&UJiz)TYy(5?mn> z>IPtTPgjlt?vt;cbm{B1t3|qY4Dz+ugIKLqm5a;elT53Ho^~L`isvS!aahV^27XWt zv5As)Fz)6rUYfSDn8TXYK17-VyBD!Iyi{Y23yTsIky-gwSTs!KEn}rDOxIM(3RVUN zshHI}M1yNv-VN|h@RO)5+R!WnK=bMP`C_c*w7arrkjG}@9!VA2uTSNkivd=nak9qM zwwJAR{$|wGA_w2T%Tn->YhajanXjkiuBo=m0jF_!jX`AA$Jnf#b<%qoTu8ZAjgPFO zObb@Q1ufj>M{$^#*weI5ef96&rH}RaFI>pV@Gn|f@e++i$q93dGX{zKfDq2 z>|FktFuO!AxqH-iVZWg$Qe0Di>#0k? z5EW1af=0jrVzvSRwXlsw@(lVPAO`UtF1XeyY1=6=>rr^wUt$;(D50GxY(d1osRm&& zA}}$qL~k(@%f=>Q?g0diE35XB>Q|NV5}y0@1ZG3LPW)yzkG$_Ov0T5D2|`CARj^l; zl4KPq#=SPI#o{75r$Zv8Dw`(20V1j7nsVVFl88Yq)82E*O-+ocUWQ8y{7p>QWe*n_ z-EH8eBw~39M;_C+*V;YiB4cghNPJ!TnH-&b$k(Zm$=3*_ zA|#9U;sqR+GJ)e{dMFKtkc{ye5SboBI|y9zF6EWOaR+ICEs1@wv&QO+_F}=XvRZ5U zK^~+-6vkO>YBqK!35$SH7ErZOI-ExQ@dnIj5BIYj0T4ZyL zw>^pFJI3)ca}hi3F|f?;AW}0eg?$VIpQUbWZ5*SSb2hRjW@qZ1;&++j9rlTrR{2rp zZk?u^In58Ku=MS!CcUdwc+jv9F;ziMO)YjkuDQ);Ss`pl(BxTxiuP3FjI(}Qd69$Z zo?A@Z#+A!UrB1V~)r-z;zPCmSvff3rX1Tyd{Yc~mA<;Nzf>X}WV1K<#u(0t7;&wk@ zE1j^qT2F+64a5-}b=z@<+Ea0S6ugbah{?jmSMIJMY-F^DimVJs^CoTs8~!6{i17aa zfUq_7Qy-JHbg}BuHq`UjT21YPkdwBpYw( z9dOnJ0~cT>1jyL=3I70G;>BZiHEh)YELB0Vdmjn9oaUWE^=qmzlv7&8Eth$jtU7En zorYG&u578z>Q%@&b=L-4b5Lcn7^-7KIdd@i1Grf1qVf8crYwVsS{Ijd4vlkBHX2Tf zwqo(*DHyQ@Fr_p+G?tpvvzEkC%xb&24M%c~RMxqo^O)^Fjmchs8#Wb|r$((@eKD%k z0b}fEuNth|NUe6^k`);!Y3v8dX80%wYkm02Kt<<8Y!P!u!dY_KZWn5_ru; zjPfqI>YbG?7t&v;rY+AVIv`&ykEdgcXVSWP@QO z+-!Zk@FTAE9xE}8rjWTRVyq0douxjVvd~M^+fPY| z_nx>__@eS}W3UhpwZx1U5$4lf2adAK7G;&(4o*S^r6(mby4@mjAQ8aHolV5xTO-qG zPFLqL>&YsPs>i}4-@?NtlwvNFFiUZZIQ7$2fpm(-NQJ=){i36OGbA{Q))_@O+*P_( z03GUA7ad-er7(hNO+K~7^cg{{C~Ed6Gy%FM8^g0`9UebpmbI_{E-DlT{iPqAM69ykfh?!~!_- zz`YGYjf;x0W%e;=SW?XAe);79nR}si5G90Rm`mfq8svrJlOjI)VfHXl#5hX4cEQym(R|l1|X0^<1b=|;CIyJH7s2@_3a!QDa zQXG&L)?;fj0VZgQz>^R%^v5z1F7a7pNIL@&2G--#1Zq_&u~xiA!PPJY#9A+gyn?Hp z1zQwXn+xj2o}k3NrtxbH!wX?ZrnDv&CNjU;6mt`piSZuUsaqt~BPmuGxUByGO7+av z`mC6W9yS%QF(6Q9B*h=q2hL=OyhxT)kipi-1F(5bKBgsXQ;kc#MWCB#4t271&gzxO z3e!Lhse31x6bisbLGHCg3Ek3i=p-l%xDc5^2{)#dbl?c)3$Sn!DJk2jGvL&Yn6R64 zvH73RrXkdhh9E&a@zM;$@%msA{va_N=!J-|3y2YPh>RHZ2&39$N+u_6pw7(w{h}r! z7y(j63lLaIsmd9Z49M>gGZQc{T%(A!Gw%1eyAdX-Xa8Nc;yo_Hk8b$ zoyT8eKX$|;AjEv4Fqms_R<;P zm@Pwg0E2xp zs}q2_CZxq(?nUCL%i*8#-+*=B{%n3v;08VCL1*Xk}L`9HYgrL5y z*Rbyq1qBlm1Zh(ma4iA|4rXi!oyGkptl~Me`6gYW1sc6&;8(Kq_~kcD7Zw-8N|fG!akjd zW*5tT(>oka=k#wew~q$_C&h}Dir}UNN4~^m97s=&@)9!>Jcc&fV{QJKC0;sQqksHC zCK*b`NuTr1&?Hl_Om8LiY(?5VS7m`C)<|WZX1`>2e|DU@`?72+&K1<*rWP#0*NVt&fMlvC^$1)g!iS4pXTPc{MlR+{=F|mRBM)AKX4lrdu z^2YNcJN>7LK0^)zT!fRbnprIRW(R&UJysa(dja>6DVc)UhCA)xLmP_A(h@QPd@MkK zLy@0&ZWTHE5oM~c*qG4wr)`XPE#k%YQWXOog1h#gbJIwu29Q*CxX>IvM z*Lqs%Lu|U#sYpnPb)v%=3ql4Dh-}$lDqy$>p2H;@{VlAd%IdPW(6$#8!dpR=S`xBR z8lIAloP?4b8&4KVNtY54+rKLVazNjh;2ZmWFyM@M`H21b!?nshJu7RZ?pGDtZKJ3q zY-txN;I_SWL4+%GErY)e#ey+0v2WopClb!A&s_R*`)3Y6BhpsVB0SybiD5EF0k=P> z=V^#7pqrc3T{SwsIzkq;#j64(GYx_%>Q8OPCU%KrM&mIMQ|v|IdED8`))tMhQN%@v ziHU$2o#E30M;iP+$$3{jD%$xzI#w>lT#o>iwuzGtKme*QLhMF>0 z-B~k$rJMI_&9+BiIAvt))y z6cHShwAVhX1xXl*BA*^$l$x%VxKP8WKjS0=xb>f|H{mi@n4K+&#e*ucsKK+VYPsQ*>seQdR&V)|Ruz^);e?9B z2ypnT&Wiqv4Rb4MVNoQ)a8fI%8G|?Fxznj+jr^bzr@3TP`)0T411`mBj2;IntR>oI zhss#DD^6=#Ve^&oxT+0Onz>zZr0dq6@E5Ww(SnO1!=g-%PE@$eRuXBGaN4A`)$Ddr zXbc{n)0)2zXVW*P4T{(7;_cR|r5j?yCFH1LLKdkfPo*gai&!s+08QfGf1cQYbIeDH zKoWLSBE|;s{^l_kQo(AyQ*9Nm>PosPIN@@ZtuKiF@dIYb^-jOa^t|KkSG4A;TugPq zO9RlXS44pRExXP8> z)vDv%wOBTctz51R_I_`M)YvSm98LLQ?n!}wpk!%_X;2g zC*(Mh`*gRaAw5TPs7Q#u`w_{HA?4Q&IF5~seX2O*W`&7h)XG%C)^;}wQy*s3fz_pM zgFb0>6~MqN8PK#hn=rDv*1?kc`E_XZ_^bv$=6M@=dfzq2T&tC{n8O03q8hD12~Hly zJ>>8G{`z>D4-m1eQ}=BMp11^eWv9u<9IBVAw2We1hxz_9WO*^?!>6nC_WB zrT`pLBS_kMd2xYw%o2T|etZ7dAJo)zHa4S?R|lqz;eIH##wT0mH67aa?N=gwLBr}4 z+j)|tWcdbSiYmZQBq9U`U2C^XK8jIe8*4Dy35l8-o}Liu-U{-VP+7=f?ql;bR`MAK zSyh(w;wPzFiHwUavlZlRX6G4t?{ILrURl5et;`ynIyQZz=bn=L$j`T9!Jz2RB zs2uur?2_8@nOQmJ9YTgnI!CCRnL4?BGP9kfiwv@_SRyhc`gB*IySD3^Rn5OvJ%A`>*@WLB0?ObZ{ls#w2|fzMlOpCS9w@*+8~=1pR5;c zQ^~Ibu4%YgRTnZEilzYDO0&T0Sgm61Fw83H&lNl^Nx5~!L`q4+q|s@RMv}vkJMecg zKI0r&cifG>;{#fEP_B+SxaL;VS&~e)QS%%gM=xqr?n-@Nda^WxP(!$^+@fM3V+a6d z@eawmQtUCMV@qQy{>8J6`3;Y+i2Kvfi+~N zw;@gUH?&^=0CvOWtzU;6eUV7wZ&!XjBJrzVG=)GP7<3j_=9bfNn9_r9Lc)kYXrW<2 zlqgpACf)mWvb8MZaM-g>)=Mu{$;DDtL4frjcgFpk!dd_>85xu?AjK?7=3~TJcg)9J z$gMg940hc0w{2ISTUTA&q#?|!QWq7HmY(wqg#f*~$OB|ra2GmPIjC~88rxW3w6?RV zRPil@sJAII6+_6Yp+PdiO!P?RWMD^q_M1;BLV+FY>pSRB4wEBx;O!%hxQh9Tl?+o6 zu$CT|(-wi$ZVb*Q%RXZHWrJg>)vX?A>N@2-0-h}zcT3f6VdM3H^%;3+VMOw_a3)+$ zY9iR88PwU^+Sew$)@F#)1X@LZk>N(pI~yrvk-qh-7f$h6w4s3M94ZlP(8|J9#36t} z?G=Hc6|3P;#8pEZYDt4tcHd>tF&@2?oB?FiwM>Ls^&W&QzALZ><%l=+`FN|9M#al{ zR4SE)sMdqlx3w>c@t2v`Ac>$}_tYt1{AVMrIluHo_N=%2F0=nzSAWl>= zQ@Iq4jirkmJ(uEgx3XCP=$o<0#aNCMxhz`gw{qN(SFgYzLQvy-c3%M=N8qmwqV%pQ z3Vq6#sfCaaRNUTg=`=K3Z5veq-S?lYpi zPA^a9Le-_TVk}!1N~zhhx_pwMs(8DMIWldFZju@BBElgC(PO^Dt;fvYenttYLq{7# zM*f!he;939UYs2rKd3yyBFD5n1}ja@M_0_%MPaFR z37GlyDbTS=)!{{Niy3Dhk*9XuQ%I1(RiiFxQnOh1g-mrJ(=i467$6~;vziwlgvEoS zPwKh@a#vbyVlb5IQ?T#?XP{69TCqi&79iDT^D#$s31{lo=F9|-VX!#7on|-D)WXwa zW-Z1)H(j|*lcKW4q;#^G^AS@Tp*Pw!QgJbWb%7~UcZ;f662yYh5w_R;JupUq0`6_{ z{$n01J~7=~-4VxB^wBj|Sp0QbHI~LJs7Og!sTJ0-YX~LEq~^V0!G{qFDP54vRLQC= z+`Vg2Ua-V6qH>XyW}KsCCbT*C9YPgI-V*?%IsGqBFvhJ#3~Oa>E{+o~S0jqR>AJFO zO`lPi%ex3wsM;PZ0cD$aX+qe*LSPzW46vzd1PZ*Q4brN${*X;iL4ecNq1fJDwH9#s zL>w4EudP+KaKA6KfS#}{8)BiV6ze8$5``Mg7VFGMPA@U-fH4YYB%eP_GpjheCSUu8 zmBU-dBu1+Nxyu;Ia*6@nEIu-w2(@#W91F56YKQ?6%fzJ#OO7)elgXx~v&>*E#TNq= zfW_%rccrVz%nf!}95pP68?Lc|HLKZ^ePedTVMIcrnK62kH*J@_t0k;>xj zqJ}Fw=@OdFQ*Ga+rmEZr7zInVBOtL#xH?H~DJ;~y)zsR|auxMOnpsCz#tkfnG_d-P z#un{L@S&Q?!RUK*E95TNVugWj$&r%_lDVvwYTy7;(WZAZsw@Sg-fxDJssQN8zq5Jz^?&=tXb3k5JzXn~Jn)({ zfNgt|dr#+nmh2xU3KzwqB-5*tQsBTn9cF`q0%e>4fk0G} z`)KQG9INWCvrx8T@VFZp6{^zKQ5e@kk!#)-VCMx1Kl& z{e3w&jI;Li#x&Vq9y)^`LMuz`T(qTG$>kU))D@08u(@=Gn+6RH8xQKlLQQcg0+t%@ z(l)FOWtMQSvI^_&y~TPS=FAijR84GpmeV;hi7RIx{$X%S-bH>&z&|bpgrD$Uno`rq zS5s@QdUFZMv&ZN+LU z40Vd^D(98dk!7pCqmCq`<0{elT_gh?OPiGEf2 z1pfeoqjGDv{5uY7MVPE6i^?YMT`;oAqGT+9q}b}&mtv=zKt;Dq_ZtkC0dm?)stC0mIISk z(Ieq_-%e;4S?Sk+bc0B$Qoz{CR;_1ECnyF47U|K;T(yZ)9&Lo=t-T=I9b#I!BA_L; zWmZ#WEet_)QI9GB1C93kh>R|sQ^_&EHvJ>Z%gD06l=CqRPDrt78#ZfN;RwZKHKF7a zU63;P%VX?nY;F{1sQ!uyYVjxo19P`v`$i6?Oz*yq8$MUD_U=^9t07vAdNf5&2yoMO zPbEl)Ea;f&)X0kFs-dNB0qam6IyuZ1Du82gbTUTAxs@MlL+hN~Ty+~mEfBS16>7R^ z71&6NSC5c2$%(~l0Hrc#mU8}IzZ;OL^1NP3{z+*?iyoUZgDWN$LD1ZpDb~zy1Eg$S zHPyXbEXhT6biso$_0=}p%zBOEd_PD~I`p4QZ67i%%*F+ER+h?Dy$wc?&0=tP`hk79 zjcbdihQJgPw?))yoHjbfJpEeA2iu~ny#qIfW>JQ^%O6S*hV_nJ*qNn`6u_1=B~rzgQF?K!@ zm_&*RV5)ZRrv2^+2|(3|VniC|Ud1=luaZsL6%-0{DBZ4@={u|{r0SLJGNP6nDPruR z*=K;5f+BX7M5Jn(Le2ESi22X&ft@1fVb_WK7?U#fu=u?+%X)_ik;T$v)T^g#;;CF+ z?2Ec~pJMh=w(=f{IMGaxMR?@dCsP1`O=clx;Zf>RR7>&tj?NFPshF>fYM7XDk`}jJ zvt3osqHGW+9M@!+#GHY-h=BKJZseIw*%-)Es}?%tZCLi&w3}w}2fH0w%wl5A=91*s z#4EjuQ6!iz1vJPqIqO$}bPH2tvsCL#)egUmj9b7K^57GXUQaP@-E%nuD8FTMU7Xi6 z#wAUcBRGX-o7>*w?~g1p$|Y|$1LO|(w)fuS(ALf`0IUc1gA1s2L-H*{NHLeRzBN=W zxhzWT)r^n#(Cwod08g1Xz`YRFK&B>H8;;{G*&7xP!9k63V$YzUs+5X1lG$9HFFlA2 z7SwY#prBeXr1d;{1G#e&%u6$Gw~Km?ofr}OL|Yf z2LJ#7jfvloI_-mc%Vm-q1C?Esnwa3Il9U}~qo&IUGJ4i*X~TbLk}j;dlC?y09zLyN z@z5=X9z|Vo3o+4U8uZ1DAsXu;e@xbu*NEbdq>&6nbpC-Rwqxtoj&{!LYg{NedZ?hS znMtr_Cy_3-DPva*V}z@dW>+x*5*v!q$WTvFLHdy&O#3jPGns5&}z#{HIC z3FeYoZW2(or<(zSYn7->rQy|L$+9GsF-evxUK&S8f=!H%(tem}A50HF89*c@R;$sl zxoq|AEe<9uBpB7O!1>rY7QiX(A~~}Vsa!fqaNA=PHn$T;)^&w&ZO8P~r%2B$Zs7}i zk#GXE`cs|+07jx)K)DpFAQ;;W8x-tcRD=a-i&rshu5xcEQlh0|hE%b|i*Z{xgmNH9 z>_@I6Rx?#>rVtdrYEJbKG}(8mG?yJ#P!C!WR9RjGmuBF~7Nc7TCyO9FJAJv>#~)_j zmiS%|-}~nbtjE*=b%2$Ck_)L4E19z}JIJt_qM2G5)PYmf=utMkgb>t7`Tm7ij|bTyW+!1k$&W&E(x# zj*XJX`N%Gu*IgURhmlGT5^Iho?+natcRhJ$UK`s z^?*oA0`{N2;f#n^T2*SL<|gem`kzW^45jQN<5_5{8c;n@&RVva)eEtvtj#jX(Qa!L z)5&M-*}Qfb*~n@5y^h9Pbi)cO^=!>uY`G`9Whny1cH?6gF~m)}5J^SEkIwh<-Z~w+ zVxrU1Sqs#2H>tlVtK6c413Vk(4i7!+kPx~n}lxU$l3;%`0JQ5b6d6~#_%ND9omG$}&3E@fYOXIiY;zUY zk+l|GUFD5(@r^5jE=`HBRz!1Wbpp0=uQriP3|dCT0h~p0=4Pos+xEnNY{d2XC$M+Ez5S`L|Hbu@sg zxdAgD?zv=ThwAcfqP44!AE>fqxz1xLWAhQ0%j7ZWgsNa@;8~Bc!y71580yq&EcPZ^ zaE8llR(iX!Xs_~orF$6c$IVl79qO-C&BIJYXDEZnLhXXUE1OkXR@)w?0iyv1ZZ^SP zwUx7!sGUcJt%D??Z^P;xLzU8Jk;=AIrCO;^4tA_|wo6LssFg-e;89gK*pgsHt(5ND zR;cZdS2my)kERs?J7@EUpIz%7iI! z8=E6rGB~E$CPb0j%j9ZYsaaii)Y+;7QJC`ns&86u8WW9kQW&51h=^%V|2Aaf@8d%w}KG{D!-xuSl=z0=BzW zvMsn!s9j=+N}nLQ00QK~n`^C8Q8Svqdrw)@wX0c+*YUS{Gjf4h>t8eTS0;*4BXgl6W7dhhP;lM!{x75eOt)J z4wa)#H4&z=I)bJK-D| zG8~?Psr}quRhvm5P0R$qZO?VR3Xzx9g?h!(No6t*wrq*S)k;!S9TV*rArQt6$1bX2JCkd z0QED{`(dCYn2C%1H}l&W>ttvieuf(>So5Ki8;`M!ese#Ftxky<+AKlor8^ss$+1f^ ztTt^`Vq7(UY%$i81HBs3xa_u<^67aH$zj5;r_mXEtjXhXN?T@B7~1iYs4B+V>kQg< zF}KFEpiQ+<=vvA-r>ihlEnKDM24gE&F^r_VI{kKT#ycU7*~b-fS&ZC;#{; z&OPExOH|n|sKWAol&_SxYgE&IS4;#V#y5^+FXWQKfOVd&+)h@`s`Wd-B^9YzVlP*4 zzQ+Pm&%}kQQG*3nyh{_gk3I)5W7gPdLLvo->Np@D_1DuBf8rBcyIN|xlrmUMHA=NJ zb-_7}FKyX7MpynKnotB zt#ts$Y&|=Qk#LYl86t*+j~M!9Ht;#-4IxHvBWj}^R;=W5MP1d5lVodC$~tIo$-;8= z)ilEWQIUf-iw7hu+txo&>J*xniO-``5p7^`dVy-EmE_14KDB$$z#C-)9H4slPBtzo zU*A)eZ|tN9*@)j*9jq z@p)|F`jCdttF4tBc_nQEfh83ar1Wzw#u8{)K=7F})mHB9#F7LKARe3#xx&&QG@F}8 z=4W}@V$-%JyiSY62ms>iAprFGP?GF6?FJw5B2T40!E z%W2JLS-5)|V^RFoc-mDd9BI6@#oVc99BcsRig~50Hl;}~p=Sxx`HMkFyOcd;3GbUPFEu;yF9ByvF+_96dA%)H+ zG1gyPrOsly5+i&aAZ4i|!0Ov}W z8luADNgX53!Z6iSSXi`HOH@$|h02esW<5G*5pd;=a+^63s|l|?ENV;L?7qcZpy^d+Sah~v9Jyynb>`|MAu8Zd>m1}T^wyoprtx4R{wp-T zm36};^60v;hzYGiq3>kHw^nWmJ7)_gDP2MiT_}CxJc6Zv6Vq#DE*A69VEmBI6mQs;r#2>T0&F*nMwDS1pOU?2>C-OPeZPs8In1(P+a zezi4qPL~K7If7gf!Kh{gfFqypz;7WeiD683A{mGgMxip})0qj_qj;H(qB~C9cHTX^ zOh?l{R7UC#)|ryi zBE_%qHIZnzm`t4AQv5sK2VkLr34Wu?A=7H)AM9jg7q;`(|hI=_!$YSof zQBv(&0COB6R#ZpKqiEq0P;f=tVd1>}d(U`}1Q!x77MQmmE-=g>3@RW8(`T}(linmx z)N_ry#1{7)BqasEed0UBbBN>P(BZOsSStFKNKfc6xQXE^9p)p6)O4QFzT0d=yl|M~ z5id2AN-gD6B`lCpn)d>k<1%x%(aUbbF%ds<-h23TA&;k&5b;^^5g~;$p7MKy{c=4C;`@v6zpQZl*pQaPr)6Z+q-q;OwOvQBc7n;V(#1!xqf|k*cuWsA5RuU#L1LQNfbh(ONom;ig=GQv)PC5t2 zn*j?MA`&1a1PpHzCn59`I~UUhmWk9xVtS8L1{A{Yv`a+7V{(o&8}GF26B9qb+i1;4 zQmz|E8Cx4fl{m#!n%0s|h7eH&w#r^G3>FQAv7n-oft`V?IDv=*#;;xdM^BXdP6&+z z2%GLm^0aPxoCg%<2qZ2p%Ym+&P-k82B^bd;85{#9Kq5*^OPGiUVu+HT1n$(?Y(h~u zrLLVz6^?9&ppvZCxZ`OhwNL^wUE%;%Ga?fZBs=&p9ELk#vCgpHVf>>HzoOKshF(IGZLkT8dS;)aM8!~c3 z1v`vKg0i=982l@--z>&hjLs)6N?w)mZx#_=MR56w8h=HQWQ_1A7oolI75d(c05s~m6(PCgpE}GK%POQ1P z+f;G&>?~4;WVGenwfhq>)DM-GBMg#}5?Bd6mf>m_K&PqH0Py#xu-2`@W}2MDC5&Y( zA>)MD6}^z&7y2~mjk1{7A%3Td*#*#Y*6GIv(`5@BK#NYppcap@i?Rq3OrKlGwYs0n zuU3pUl(~=tEFM1Xgq)#EC*y8ii$}P^Al?_`Lej=r(OC-Z69|@x2qW05Fc~~r%ATRq zbm^MaDNXE#h{oy5k~N8C5E-iUDcZEyBI;Y1J7Xw_7BD*9PZ@8!8>k&nQ-;GG!(-~+ zt%RclzR;F)QzE1Jiz+j%^|Vf5fqeSFI@cuQ}wE1?a*IGHI* z`t$O&CyjioAG3xM)2RX@u{?$00uubg6yH-T$3rO*)#+HG0Fo&ZT!Rxz?POXhhB1I} z#=*p#kr>2y!Anx=TxDd}sh)j&dtVKOf`zrcK}_|A;z_^)m)F{Jd zo4so?VZpbWyEIzvn8bpKq$!TYW7Tf)<}czPZ858DdsebFeNZ&z%DIetFAgk%WQ?2D zylaEy`+1&GA+O8%hnGd{^4*iMkEW8ZkiUqk>NrJKqGU`{mr9jPV{A;C*L6Guqlhh| zAaD}hr*b(=!zQ^dj!u<pqJSUk{yKgI3j9YU=|fe!5XD zf)ya9o6Jv(Yr!fR;8j|KAE)vYaoG%ESaM0zlYSG_SgC5%abbmIWO0_3|Z zV1jIK9v8#3yw$bx%#LclM4l?Bj7FTQ7|>iOQzKJ1dsE$X(`at0wi%5O`U~5P0qav!6C{#A7v49GhUcHx4ok`7>n-)*>E|+c7}A0qHQb9~Bm=?gE4A@V zTMz2#42Mp;4BKXHPSfEITT|flv~}!c{{XrHU`*{P*}8d4R=%cnD_6tTtO={YxIh() zP%&aT%`#yOcnQeroo|(^aat2f)xhIdS>3_vOO)s=n)h-HvzTMo(h9Y*(5@#oz`B8 zhHvjYfN6sp#L1YA&7*6Z#v?OVsHeMKGhk1(?mt{Af11}^Zao8ABWEcLMP}wRH^xd& zW-?Zq3a06D*Z?a`%N7WH?kjNyFp!O>KTc`)GI&QO!6rn z(X?|}jLAt&6@02*o~W|LB;6A3h!teySY**DO2P!z6*&<-qK&Lxa-vKYF*3uI-`qz< z=)tEgfL=`#5n_eAEk)EzkLW=Kv>YT(Xv)umtcn58t-`W8Pf+ZHhBpaQ{+HW0g zj!G;*H7>*AEwQ-Z_44D|LPEuQNUc;)k*RA!!dmicfC70i+|rpQO5#dIrzA5Q$;?4` zE5_Tsc#5>8m1)4Kr25r??<&!^?V)YAQ9wlAFi~#Gqnw1pB)5+T6g-0SKDrf`jUQ_< zO%W`6O08(GML=wsxoWF&K-N~621%3)#v}eLE(|2Qz~QYsP$NHu$Ykhd@%bd!!C9k< zsalmz0Ki>|OYzwn@WNR=QUyhWWo?pzHW(B)y`*K6#7C6g#Qd=B0ZfDJJ+0(CqHXVn ztuQ%zIlDBmGo80$sY05}9Wc3*u5OVzfShyf)uzDV4KuZIFvO(L5(PVWInH6jPUNWL zs_2bk{{Wj>T7mhCif(UGTa`;3nwo1JZimViWKS-unQ6CHv1v-C2~1ag8J{&QHzRu; zn9b*?F}S-rnwBFQ>!xVAwN*mxI*6!?3#|lT6^6FKTw<$b018|p&**()rVzbY>_()e z=vQXd+qAH;rVka5f?aP{ISPYcAjz~1lsPdL)CoCJlrBgNJ>h2JU!9%CzqrKlJd24dapeH)ZpYpP^o!pw#ig^9Ec7zU&-G1e5J6JX2~O6;aarZu6C z)j2GnEb5KY#pUyPJZ$h<3zb`!4xdo0TqCZE&}!uH-7!u=~}>MV_L#VAXJ9#ejM7IO_t| zw_6x!oTdy#eKA(y0~G7H%2SdeeT`hpp-x)ItDRjXVK{|##U!?-_Ez&Pt|A!{*j;$5 zb#hsZ$*i%jqm_`fV2Z2C=5tv#C16EjyXSkMN{XH&$q<^(nOyxu3;>n4vO4OhuP<(4 zh>I2IS4$s-zfKpi9jsC`)=toaYXTtbKHTA((uEW?&lpNbW{^S)K%0p$ZD9b!ZNzmG z!IpOtPcyd@e_y_?ZPshbBP(Pz1=K#&b?RWT?XixdP#p7@zmxA}ZF-|jdZpL1LfZ`{ zL`^e@SR{M0^(!YLd3>VeKwK6PTP0@N#Q<=Z8?9lfRq4R?Cso8`q^roZn7JW|J*_}9 zc_!-pMU>Ju4+??D)~$%bPHy&_NU~KXjWegZRckHmKB*YK%rM_C>Y6@`<6}?PX{CUxXQ%R*-CL`21lHr>*RiKp9->K?rhRcf31Vs^QQVRQ z$F+@xx7*g(QmX{HB%U~%Z4uM;I0LV)viTYGISo^q6hH*fvu7m7`tFRM@9s;uY+-CplGHwOPyo zE447gE#%oEH44U9GTMU4Vd~*>80w-&Ws-Rs`rjDZR=1e+^czcBCD~!Dkp(t6P^iaS zhMZOvnx4@x%AgC<_5>1R-+po8#7$*;`^7gVc@K!Ro%D4#hR#X1~ zsK~FC#qm{pEk&wx^4itj(O@*3R9{ z+-6OWHwq9G&b2J29hFVOzLM|PbVpfsp>@DH%#DM?X#W5)ayGCdU;hA3^wyWX>6q^< z+pce9Zj>g%il$vRars+>RUQ#(OSX)6Sxh4JHr5QM;awr}ze_&;p2=$c5O_AQrw2yH zmGdV?X6CpL8H+xHL8iuP(O91MY#3IJn6jlOwTNOef!*PZeHGQr>t@UC)Ro@G+5<~oU@d` zmyAZH40W3(*!h}oU1iHysdQBJ81Xm&gR<<+d9Wi|c~`8UapOU-n6mLqyu*VuU8`Z2g)Qz1jjKR^!+EGVVwS%#5B}zxAu_IIJ5{N=UoLEA?2coIr(hQOT z3}OKNM&kSoCwM^Ea4bE#fr84{w84#w^lFY9CsCVTsjIWvj49rx^Q{ovVPFF&sZU9) z6s0evEhLjV%Ool6ll4uHD{ElQ+BU9VCzP~7IR)mlc2ydBqJ~zfwNlPgD(6;DQ1=Ac zK{CpBCN{AsXT&v$D%xWq==F9NIf1R3Cz59oPaBlCGXw`{A(51?R~yLN0v3?DBYF1h zp`Q=FVdDb0)EzSWc^q`mUDw*p+rw1KG4FBpF=9BY`8!v!RTQN@%ry(JPYV!)lGG;I zNU9n&8xTPs3q|628>s7Tyu9$$p43`?{aX)H>|}Bj}G5(e5jR@Kc}sFPaMnJ;vwP+;;} zWsI)Vb+v>vYrwdTZ>r#wEw>M(w3cM?>u#mbCqG(?V#YHTSaPM8k*_Z`)o!OuV%J_O#j3`BiRh)p;V!>cNN;Zd2vB$<4Dn%k{ zNE^|fk#x>R^8o4q{+IN_WC$e0zz3M~FhJh+KKOUFV^G}5v^5f0t8wjDPKInT_ibe{ zwOaIrJ)2qBd~G6yrgj@R>!uav7cQ3c+74$^PGT4lh}4wrF@&~14Q`a>D?Aq}O@UVqd?Y6_}({{WvF^|9^q4!$cHP-eYrV`7k4`FS9#6=;3-;uN5X zYW*={v9=n9ETt?plE7iwTF$fe6}C99PCC`IWa<&j;d8kf%|hWs+>S=w%IWB|>l6r{ zMxcb67-Gj0*dS`o1Wak&W_3s(wWAIIDJ4LYxr_P#06lRw*Vh+g1&+kl)ia|p%FD9j zaahDgGWVq?wr(s7OKH=)C1i$MR`txKzJW}wg0+&+w3YPkuCJ&T>Uu9yjt`{{b&CwW zUmV(xR_(Kr$Xml=-A2-uM{6S%>)2OLI>G2znC~|i^*{6c+CCmJ(gKi z#|71+7|mdcinTVnn_D{`l%FyTgd`-5(;?^1e#up)jC%CDYq1q7+oy)d+o^7tOsZzp ztD1h=Q(UD|QWdRPs|!(dnkiz`<}F5Wd$lAR6MZ1sV%M?X&~LX$3@#?b3twz2$>yk2 zYw>t{xR;{)D@8jxCm=asu5fcUV>53vIC>RrR;*4WdOS6!*;~}Aqh-SaY?TW3BT~jH zmMc+Z2Fl?$$~Ki&?rE7vb5xaaJawwBktDjrQs^@xAVW8kSix4vml2r6W%8DDH%~0A zoYn;AGIT58@Q90o(NtoQg=PiR$u3V97F=HllIrnV7RDfuTDwBVdWq?+OlfUIjrd=f z87jEj80!Wl9a@@#oo7^Rm@99VIaTh#%pr2|E($6(kpwjJYe)l=&+UaIo0z|y?d8Df z_Hd5f9c@|pT}G^CcEYGHYnLoxg46JBR55Q&%GgOoWs=0=8xKWh9557xLk7r;E&3Vj zbgt+9MQrUzt{~RiuW0VnWB?_V=%E!NnbD@UTbqS18ue1^Ly!PKH*;NUht%zb75#gR zb~YB3ODg5@mMP^T)Whl1qtZNUZrELL>&-xnjhgF<#A1SzmPgq78k-io2WFqaqK567$To|eW|S?gd||IQIfBUJxxq+=L=>I~1f?nQtI=j5eUZMx}!axir-kXabzos}YnIIGUT7AXi>|-5QIKWz> zIIK)UoCvD(T3X2e~71p?dTos~<hy+kuW&X1eTI zkUNoSG7n&p+hb*s3u_x)DA6$KAaAu`A-O696UkDYy2FVwHC3Krzx^wW_eO352<7j;cxU z(t`)Wji^@g=16>8ZK6WZv5_cC5}M&0kqeP$r`@)Y#+<$nl9geN3yTLJCy+%WI(6Xx z0QT!kZG~415wUSMaitjqMS&m?n6hf4UO`8J9c@&ITev%stYcISgBCFj3p0eB0 zmU?xF*N;-;msf?px}k^aqI!^W;GQDqU<3;Rylr@c=l9nfE?~eDWB2D_*A4@9d~7>r zvm~La4nrY{*95YFu%UiAxxrKY2zb@7whn zvt#kzgp@8hhB>UL>#b?S7A%8_Q5kH$h{-IxDvvIakahLfw^T2T873P`ETdeYOK?LP z7ORbklmtb7xLTO$6@vQ82ZnCYL=CPY)(6fwo$oPh6{&-yPNH@r!+R6Vewc;rjXLZL zd1|C36@|%~=ET^40TrnF2!eaySSCyY;|iWmk%Cha+y$1X%Vxo(Dr5{)tQFzVf~rJ? zL<{(ZmP==IY>4q}^$ve#Z~%9k(^WB|zPiz5oS_Y@&>?!xK%UX`$y(aSD#Ae6peO}I zKnDXUXoA~K1zPDHS5U~qTlL?^wyC5A43ptj@C)L+@)&TLf|t}b6q5kFJZ6-^6vACVr;*hGC{Ad$vHj5gO)-2uDsfF ze!e3|8r-+0f`#=a;?Q?c3!W?>v0$ok5DnJ0^Kmm1-D1&9*s3aPIjC<$K)NCxp+e1P z*5X!HQY~ThtMmwDoehCpg=KXlHm+^BFbof!yJ+@Y%*7CwSVp7`PwLghl-cN2jIC1kS&dPyyXF=G=#yS(X5lq9 z7YR^winIIK&ep$-Dvi*Y>@DzcVJ=}BiuX;eOKG;f#Xl5M_OiJkoDd-i-HjuzBGRQz zY7q*nuU$>2CN5Btus8%7j-FzCnCggxgq_IyV+A6_b zs)|@D@s`rM-y4I)U54iI_$&A7pI3`HJ(#YEhkMI z<4hL<3bsLEe5(#>OfShWnOsfHNsje{VK*?^cM8mAno0t|oHc_=j8ne%_?SG7E8a40acz=^?f()(I7o4T7eYvxUW1yQ?%7FH%&* zRWjKbx=DSM)yHA76Rn?KwS+{QvK59clI9z7QXGgz45(nNyb0uk;uZ}a zTknNXY}Wvt_S<=%*MB@A(Dd zU0XZ}UaHeKLtE{p8d%Y}Rn}t0A~sxNvn)T(AL+Dx^2cT)M{2i&mzDo|N+LrmELEhbiT5 zue94VhL)efXzO}@g(_s#)_tcc{{WX69Mf%ML`Ckn8I`84KDD1wRjfn{<0c^+c zolmK9nRgSK$J^4T%e@Spe!ZvFt8gqY9+WAtEyd!gfFUtF<%v;55i;xylcpo51aom8 zv|-H3yLgEI0Q+Xsdu)FB#4YA+ELLwToXga+idH`MZ#vqR=|BGfVk+4zt&0?blk8Tc z*r?8|4Hq_*R!9<|)vK8j!nkIrDGGE?B~LCOCNUz&jLka=hE|gX6E~199Cs3qM6v_r5#M5;7a4l`3IcS*Nf!p<{#G8G+YxF4$50;E z+Sco|;B^=70@qG#%%U0seR<}krda^sBPG3n3=R3p_bHw~vmywO7%`UA__Ds3ErDTA zYy#thW!WGUNWu13MwuD3u}dZb_r zf^0I#$cPI1u@N@~mCzB*gj=B_uG?B;rUImf2G9@fzt;pb?BlG#A;&er#ud!^3xjG7 zxrLWJq>2UUncY(j0U-$pk~oR*qvSYzjnyX_c4=~3K{C;cby~nnW^BQ+(8{356uF`% z(osycQw-P$O6H%`c-i$esas^Epk9$v0>DI(95z(oh+;}Rgz_!VVU73Y4>&DV72ZwE z)v-3$78eitt64>sEWv$x`ZL3(urlw#qn8^N&q`r6o;&-vUhQDgw;6Q@I0M|^%&LK5(BZ;y-02i0_eSdmQz>IoFdbm2Ryc4 zlxJ+U;M`UFwha{GsaQz9we>AFCPi&jx=zB%Od(55x=tcQ(*l@mugIPwQ`xDEv1n_H z+#}3*x#_k?0!9F(Lwbuq$SR|3t__pY2so4KL=YGUOKcbp0KVRPA3NI;K@J;3g97k( z1|~1%27NiZcA?dU<`u`fy6NNXh2~uf(8~y5HGqonHQx9re6@&=Omf~(O_8115`G`( z<#Ltl)E0!bs;re-OJE2dYk^5j@-7X0nEg^SB5M{&a*gM}R#!k;#bjC)uSt3vMJs)Z zr$OyP9t2Zjmr=1<)yZ;PNvvDA6BhuujxG0X=5SfOgBOsnzws@#DUvHSEs3%jUdN`B zD$HD^o5-hB<0U*qxgsVz%s|J{H!jeG0bwvqkS;C1NZg;^6J zEJS*MO_A@^7bqAr6R`2=FbFn}x9&)k?i1K{XDv6Uj>H?WpSv($;F$`L@56ChMan4< zBAJc=CAP!Fj7l=t%jGd5$;n~{&1J!@mT|?p<|CL9>{80+GFuYJY>DyMp?r3q7;0(^ zE<}7-Lfk<8J;FW(umqh21j`DDM>f{y#)UN9#{|&`kZ?H?a)Y* zDqPG}9iTwL+(rn#uHcJ{h=JwG3PwgJVVK{2@D>vx`z9w*TIB`26JgCI&ij7QC)C6a z+X&9a5fM8`?YzIL?JEdsYS>%sEEi#*f+mP6NLMW65x~GFh_h)f8;KN1lpNt0v@MZ< z;Fl+HGa33%ml*qOLU9`jZ#*U4$%jNsq?&Hs^scG#eoS|e4zJ}PY zqbb^BWzO_KmmB-_4m(U3&gI#s&}Ju*^)XJ3jwU~6)Y!I?G1zB#?=j%c z^vhNeB6AzS2ii(zcbVfcw$TwYzi#t08$|aTd5DYw83{=kNF4Sd+-5e7zL|}rw%oZ# zXqb)T$8LU}htKuHN5uz#Bd52Q&-BMherlkmO9w{ql!${t<}({aM|e!Lj2zDX-}6kw zZ85UI)EU*T1aKBqs0O6xtbbETcLMt9hTS=d;VYg+F%VNFF%g3wRdyk(C39ymVD^(J z`<~DoWM`K169u&IBeZQ1GA=v{ngwD^J^2y-)VH0ac!@#s-?T?9wvv&6nc6q;#6^x3 zOy6zo#qb1;M`=l7?Bgvs#WS>%Qf10#>S@PQnel`BY|@YjE)%@?9317`d(~pAVzDi9 z69WRtk|U9xqS-7NCq&7%W(RWr0F-7XW@8tHew#YdJwk{C7=vo^GbteSdjfHhsB;+JS$chU*T;&JkQ2ji$es$ct=aRMp+Gguo;szysrP zNLC|09(jzSdabgXm82vwqwj|ODSWE$X7#m05wYHpbdZKC6xksT*vtV6P z-F3-VuVFI61O>Hk3beiYeMo5(?oh$$vU~`}2CGqO+$KL_nynmtOAKTx9`2Kcjy|KH zl4O{O2xJ@_$&g1GY?F?wrt@iP6^yDj2wAnMyOEp4JBuF-OW0@-IG7@O(#0D(e?UnY zcuP|WTCp{2eV(ezm<@1Jw;$YR8=EwF88%u{NZ>;~0f{w30TqglW04lTN9*r#htvvK zXqh|`Iu54SpImMo;yPrPkD;B%X0kbyF@Zx%>YZ9C4afGb$UN>>tb-u{h+Aq^D~nmm z&a>cI;7aCnRO+_oo>lqaW1=r-nO`tOurn2=trcVKuEdDX*6Y`xH#j3An29o6UcJt! zt)ZB$KX$W-RF>btVx09L*3o3L^-NIOVK!nV?+zsp8^=awBfwrl-bXgYlJYFHu(fNY z3v9lvR}_yV;@t@OlrRED9I;WU5F#Nn69jnWrUmylyo-xm$m#QpSgYzHeSEl^et2@Z ztETcSBQV=lu}P;~m0K5!)0NzJl_JRBg4GyFH@Tu!L%_J05Tqo zl)|fG-8EDBQN)~oj;gIC`+BC04lN8h6(G77sIW$uk|0$K~^tYPK!3)lUp{}`?L&Ra$EWP|}#}O<9f0metCvTjY+sogofo6`Lon+h2IK+N)n!0g* z#s>57&tMQ0YB_qC^eShV#V^@BII18c9T~w;n_|=-W$=C#@p{hoHUc$9*!B$d+ z7AkW^j0Q=ZbYu*n4Cb-WT1ZsG4JVkRPQXS@Y<2)w9 zj!Laqu|d^@2p+e!@d>j5L@?sRb7hg({oD&a-HpH!kv<;T?V_xd;oNkE5zY#`cM3+HeR!Mt(Wz;RbI|_H>9e!l74wmgH ziFwi9U1hDba+zy4@)-u0#dCdWwwoyUm=at(~NCx zg@AH~WF#ePfu2c}plk%kR2jC?S!;QIcp8YmnXLOcoSnj_kF9e48z9@AS(uA44q%#C z)_%~$h?1qrdYfR_>9Rz(l1gm142?OB#A+%|U0Xq!CpNuXQ)%ga>!zw8z08)y1~MCJ z(7LmRNY^6OqRS^swLw!WsBzWJEVX2<(X9HjX~qiz1=qb{mK8(@B+v?7dbLc(WkBY% znI5iYu|E_n3qThZivTP(u&~3{kPkXUb?b0#xc+Adu{W!-_Sc>3%7R>MpsdHptm4f) zYfO5XUR^mj>X|I-;vgW#MEzJm?&UFm8D&spcXQ3`MO8VO!X-m4IVKOw=?qzgiNMdP zhB%~7LQ9EN^%j#*Ic&-erztrMh=Y{HrsK0OllhwH`K!Wvkg}7fRFX-N&`? z#zl#gk@8oE!Qtsyd$KyGSTfWu!a)IGipx+<7Aw}-9L+@8XopOQYSG%cNUyBOD1muQ zx`kzYk0GitSkY-OC1FQj2`;g4Tw}m|vIQ3SRP}MXSVUjICLO8^8 zb;4>K-V-58&XmPd)Jk47DFkKb8I-e5!mbn8_FiT(NZ?dsSOJz8*pU60!k~Nsd55jF zE~3j~*OaGQBvoe0vBPH0LedKJWdi()SGGbd?`-<{#kPD}n)i}&u zn6HiWsR< zayA~-vCLsX7lQ@pZ!ofzSyL67ua$0H2CJCdwxdo7nCLS=M57g{lat7itZPimM!5o_ z2mCA;lP4~l)U$*-uWhuE+BI8tS09CN1Fn&DtAnK0IQPPQXCkN*H36!cpi7dn`nDzzR*F`Khvr^MNd&K97zkYg68 zdX&53^M)~w>CZSx6>T${#o}vxk0+?^WLtS18V$tZyuQQLsneIu!^|@_IVOlTYC|gx zdY9fWhC|Y{nn+b1p=DO_v49Bw01zP9#fgwl>o!(oQ>0i}+jH-K_lDZqDxkX6okNb& zxe>})SQRTdtvRE@z8)9Xm3qxHht28>xh9(+11QwjAX36Du0)m)yHx4CE}dQz9iueg z$niw$4z_+>>&;iGZ!{daFjh*wYZq3TV(qns53zw=Jb*nCabQ9gzXLg3m7IQ{tjyLE z6zxfEW~JJtsHY)zvRT(OaeZw`lbbBKNBcOrkNOTJLRE{D|1-ST{t$v=%r~1h_;5H z$Yg1@tFhXXJq6A$zb~oqSbSpdtELQE!8CzHh#R^<`th z>75Tkl{)g)2CcK1wl&fyG%i*-bYrIvm##-WK1gn4kOOb%l0h*mSHuRDQ6lg}`H7kS zCy|6xr1*}Tz?t4f?Z=)UVy>Ro^l#$yMh{kKyv=*`@<(G1?2Sx*HY_xv^*pJ|a9+OS zpg@q`ofR7SS!CF3Ax`k!37*o=9FA?;moJXTN-QTcV&C_!Yed*n+gUivS(CX~;j0ih zhuT;%MKcUS6B9B})0cd?!!tXP($uvcUk`&8XR}x>UwajH$RRA3o-5VnG|RHHNfX+d zXuO*Xn5$HUXiUZ!{HC_^8&V-vs}1aR+k=mzkJffomW(P*pmH>--^TPX^^8WxH)3iM5(@k84qOjZNJV@BIB2RUqPp8I8O#IW+no6!Z-MYG0%xo27uBz7Z zRWo`|Kcw)MEWx@NcNe0*bD#BDHT7E-8J(%>rDbFiE*2rMrnS*IeJx^d<+Yd0Y^$eU zbnYUJtubEF8XmGk2A-hIxkgeFYP)oxND{zPMUu`*u$Y>XnRXtIKM85OShZsALhZHK zAt8|_GUY6jt%l%261F0^fOWd#AuE|^HF%@}s9NIIp1%J8QGiL*L|b|OKK(hv`}H1- z$Kz7?$Ych<)c~NskY#EOqL%LArE5`Wd$kCp!Xu?~B0$zigKVpemxl`1bt~&L9ZOKf z-6L}xSL00o0DlpVN=y`&j0GAQOm!yLLaRW`Sxs88U9$%hFb#s8Q>g8?1&OY|mAMJv z3x1BAc0SR1WQfB3E-NcBe!JH(2U>9OEJ&Ha84<)h=~K?>O(%}KLsVmQ8W5YzW)ZkQ z?{I}HSD3?_Vx2U+<=m5H(rQhNi>swf5IW^ieH1yq37Bm{06Re6Zalg5!BI?;#7)5y zu^=9?=jUux%v{;k8nEkW$^&9*G%n>4oB4mrDOIZVAw4Ep%{HalMH>&L7aLd{W)%A5 zTxI=GTHghYTQycd+HnGBCBWU&XumZ{g-lSJj2Iacp zTBxz1Fv%M)G3mg%M2O@}FnZ;x$=bLnv8SoBu+gKApqtOSxKq`3y^B?njLEPm*%n12 zJNAh|JWG`IITdR?ZL75|9&!1tLi_keqHNr>>eL0OYJm|)o;~z1_n&G$&Kp1j3OMML zl7wBT)9{rHK^L1rzTEoHwXT{2DJn>SWI+9`w)kfaIjJ=573(R&>K#>x9BjqB-d-0; zZxOK|yGV91lXW%5U{TKfC(s#u$5pV!65p{c!s?~Ig>0eV-*P~!kI(gQ%qg{ELR^>V zQ;8*%le*nIHWu{pF+Bw)%hV_A#O<;~e<dmTaW~hPw%^k6^?EUA>ZKK@B3A2)+FKy&{;Ettx+E()_aEavB#SrnJ6aFM`$=s@$+DyqqKS z>0)W!$z+Ho%^TVK8G7`wuSkPkTGb@6Q&bkDE~6OA)uH=3dq}FA=&ru0ur13i<1};b zdfRCz1f}+(Y+93Y5XOz{fY|D=ZCD^|MW$?PqxBYzpB#Rp(VYgsB6>|puTkTXpjO?qT7$pD$=$TE!nuk#m9R2n(` zKc!TgOUNCpef<(S!<4bg2eP%G#aqXsEJ=*l%GC9bXF}HIt))a(YH_bfQ?ThVHu9PE zz5>9JX_3&x+;8c}*8-ZGP5FNMG~ZiLV(;~rTrbzf>0EXvI);Fk?9VAy%_=uSNpN?F zaMofGl&qpi zp1MWVn&!|IkGHP(o-KR~on!~#+{_SqpD;KV>4!VFloz^V3#jT6+;Xhx=2Kg4G#ICd z++`i>eM^Qhj;Q_GqpU#Qqe>MgVmzkRy1Pw=cy%Y1Rdmx>Rr-48&dooK&I^|+P+7=e zGWXw@6!h1{We{w)0?vRfhskk$e03J7*z8tUD@wU2QtH_qGh@`$70S!@$BP>5#|W_? zqKoE(u3=pyrkL*-a_+0AuGOH+%FEbg8MkEHksNKsi-?qjmM+~L&-Us4vkjKgwK1bF zhtH-1f~}+i70Hurw%FP}WcgnR!XiAQfdCJ^hwQ6fY25Cgze5(CVWYB$x)EoVh169w zl`KVieS~g7Q?9D7x_wZuR%{&eCOTBKkR*`e=<539jD{;EOCfH#SF0H8n`q;50`@u&wH(A* zStJ@_3kUZxfbJNp|G;5G_k|b?=$mu?Oe-b7}wr0LPmvWA)fx6eZQ-xj@^}?{V ztx02%mB&-LfTd|`V{AgtGKJY%+V&31ShFrKJB_v!)s)2rOC~E~PSfmGk(p}YPKdh+ zr7yh(K!*|R0?0z4%VVd)Ohsavj$^Y)xf5QhX)_FTvIwfC$Td{gmkTUQFRo?=QR!mk zWhc5h}@YU zDV?LC;`ZinrOx&Pc?6jzKAkOz2Lo>Sg6q()87f%@1Bh{-;atTObk-em7b4_!mnRnb zb(*c10VC53B3W}#w-a);yZAGVt#db3RzGsfHIkSo7a`sw1xiHdXQ)0 z2yRVl$Qv4ib^4YCh#@d?p(6@<4fUj2m;i3}*$Ok@(q9%gs|*)=`G(q>PV1Wu_Rz^& z#M28N59;0ZE)fUpLA)dx*A$A`>31^;3uTzJL?H%D-faR0@jpxvYsdl&uGfPfS^Y6% zaT!cy)Gd`T?lh*vK5IVnPMw*W&`V6DQ<9VCZUEt!>fL10RfaCFDDh?Xuw)BV1CkG)ewZiH)8X(bmhmsDQ+bZB0LTiE=}#QNg} zojr}eYV6obG+XN>Zgx90Ls(kK3IzfVzQFv(@PT$yM(I3dM=8g3~iUaexDJ5JMm{EVr1dA*ghjk-1xkhf;Saj$0!m5Q+)s97K; zq*V(8X01j^%xjgv=5Z%c3b9lo%huE@50I;usEaGUb*+nLgD;BPTGU(@qbf_?tlUBr z@^6AXkC{5Y!m-ya=Ci0~naNYkVjD`trzfYfnAn!oze6Kk?M>Sh$^zMNE~3|C(2|-f z>4JRzvDDiC03~Bp>YR%5`8?Aq*vMxxLsG5#Tv1xJXS$v}RTgjw4i;S14VKs)hpg%A z_FUqgzr$*C=tij3rb?!CZdK9 zGd0YvCPj^UL>Pg9Xzd;jQW{fRR>;>=D(TH)R4d!BSu<<<4&=^RJ^a`rpjWXaBZbhyjSV*u^)MoPIK<5w>eTL0bm;n$N}LURdk$6>9HP#~g;-KsGlUbxn;J z$Oxr1SrV@7moqt>?m2a}HeLFXJqsL@mp zs72v5%}|+qz4Fh?9az!DXumc!#**_FAG0c9bq<7~s4$sVI~;M7j8e4S+?~FfdX_7l zi)i_!E}eJR$BJZUz;hJ51&G+mfg_6%6V1IoN{&glUAk;fO|e?BI&Q98Drn7mToxcD z?gcDpP{AnVD>6w`G8A*md`J`TC1p%m7T3s#1|>>y&Bmtw@nUc39FS@O)7Q@CDp@q7Z8oTgvIYHk-{-xHZyNE@NrtRHutoT~#fJZux^$Xe9Y_mBb^@CHa+zZHrk^ zURxcbF_}CgarBTd%z|@ekUX=>lk6ecDh$Cj^pe#g-aLllo*h&2qWsp%RVr*g32kLWqv0eCXJsPJ zHZVk79tqkbrVaNUaMgg)pZc+4mZ8-4^`5A)kG{&-?1rMu-NNW>SEa2!zO^iNragD5 z?^6Jd863ty@b#ETOxLee#jPQ&X{2;6T8_2&rerNQsrYnQ zsW#vSYO@_V2~4GeNhAq4j|-Ehrao2!PR^6mcJTHrz1bSCb1N2RaoTCO zM1fH^jpuRp$emW9C5spVoEB>ji3v>T>^7#ha1n{fX&6>>GR8**F1Aw8faMmlc$id! z$TaKMwF|OC)e;cXCY+L?blxmTSrA6taS%Rm^>`5i4UCu&OrMaSrU*55e*sd+P<_{v zDpjvZw95#rk-s9H;l8ZQqP9ZneKaK4%7T!NWmrhdv`08x*g~^7oMjvxyHjoJ$^5ji zHzunqTdwG);$>PyHbLeFx@+YP5H%Mu5tY{Qj?CvHPf_ysRp75=L>osDmQFiN)>6(` zV7a4W%HPu$i+vYB%H@Mm)=yCQr^L-mP5H&;r^@S3mZg#TSbv7gIe4oq$<2|nM5}An zI9FFyn}l_&O0P1tJ*bXP@6Bs}>7z7TIWNEWKf*Nwme4g}A}?(Jhx5GTpY=R7Hf>nNr-k;PpDc(!uO9 zKU~LXowwpre^AdEpQe798Hs_~XU4|0wsgGV$R|(gOfl)*Pm8EH=UU9;G5AXqL#j;? z`F0&RSuFZKRwhn9dt@0;R;N4^9n2hJk#X`Iv@E$n zNfgA0%jM4fj{P2_NX*H96ptE}RyVfu8*#s%@T`zP24`X`m?;xn1k6UL^6CxV4`HAV_@te9;j1Aax=zDX`T7< ziG~q!h?$MK7Td{;M)S0O?Y>>XqXsNX0%M?oz9Tx7YlxAw>}_tJFZ6LwROYFw5_Y<^ z(AB8xTvS>|_)6?VjKhnq0Anyy2sKQUE@DTH^8EK{oV{tBwP?oKEAt5L&kBI*N0JO|)*r�b*s2> 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 OAJAfJ{3qM<$N$-0UGA3v literal 0 HcmV?d00001 diff --git a/samples/data/leuvenB.jpg b/samples/data/leuvenB.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4f281729371437708d6b6af680d97f34703eaab5 GIT binary patch literal 312454 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

vH7hy{e#!#?)O@DU#BTf0h4 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 z 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 z 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 0: + obj_pts.append([obj_pt[0], obj_pt[1], obj_pt[2]]) + obj_pts_per_cam.append(obj_pts) + + best_cam_idx = np.array([len(obj_pts_per_cam[0]),len(obj_pts_per_cam[1]), + len(obj_pts_per_cam[2]),len(obj_pts_per_cam[3])]).argmax() + max_pts = len(obj_pts_per_cam[best_cam_idx]) + print('Number of object points', max_pts) + + # filter object points to have reasonable depth + MAX_DEPTH = 6. + obj_pts = [] + for pt in obj_pts_per_cam[best_cam_idx]: + if pt[2] < MAX_DEPTH: + obj_pts.append(pt) + obj_pts = np.array(obj_pts).reshape(len(obj_pts), 3) + + # visualize image points + for i, (pt1, pt2) in enumerate(zip(pts1, pts2)): + if inliers[i]: + cv.circle(image1, (int(pt1[0]), int(pt1[1])), 7, (255,0,0), -1) + cv.circle(image2, (int(pt2[0]), int(pt2[1])), 7, (255,0,0), -1) + + # concatenate two images + image1 = np.concatenate((image1, image2), axis=1) + # resize concatenated image + new_img_size = 1200. * 800. + image1 = cv.resize(image1, (int(np.sqrt(image1.shape[1] * new_img_size / image1.shape[0])), + int(np.sqrt (image1.shape[0] * new_img_size / image1.shape[1])))) + + # plot object points + fig = plt.figure(figsize=(13.0, 11.0)) + ax = fig.add_subplot(111, projection='3d') + ax.set_aspect('equal') + ax.scatter(obj_pts[:,0], obj_pts[:,1], obj_pts[:,2], c='r', marker='o', s=3) + ax.set_xlabel('x') + ax.set_ylabel('y') + ax.set_zlabel('depth') + ax.view_init(azim=-80, elev=110) + + # save figures + cv.imshow("matches", image1) + cv.imwrite('matches_E.png', image1) + plt.savefig('reconstruction_3D.png') + + cv.waitKey(0) + plt.show() -- 2.7.4