From 7e637c134fa3aba40f82124e4283ac8075261cd0 Mon Sep 17 00:00:00 2001 From: Eduard Trulls Date: Tue, 4 Feb 2020 07:28:07 +0000 Subject: [PATCH] Expose maxIters in findFundamentalMat Lets the user choose the maximum number of iterations the robust estimator runs for, similary to findHomography. This can significantly improve performance (at a computational cost). --- modules/calib3d/include/opencv2/calib3d.hpp | 6 ++++++ modules/calib3d/src/fundam.cpp | 18 ++++++++++++------ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/modules/calib3d/include/opencv2/calib3d.hpp b/modules/calib3d/include/opencv2/calib3d.hpp index 42761967db..e986c1458c 100644 --- a/modules/calib3d/include/opencv2/calib3d.hpp +++ b/modules/calib3d/include/opencv2/calib3d.hpp @@ -1905,6 +1905,7 @@ point localization, image resolution, and the image noise. @param confidence Parameter used for the RANSAC and LMedS methods only. It specifies a desirable level of confidence (probability) that the estimated matrix is correct. @param mask +@param maxIters The maximum number of robust method iterations. The epipolar geometry is described by the following equation: @@ -1938,6 +1939,11 @@ stereoRectifyUncalibrated to compute the rectification transformation. : findFundamentalMat(points1, points2, FM_RANSAC, 3, 0.99); @endcode */ +CV_EXPORTS_W Mat findFundamentalMat( InputArray points1, InputArray points2, + int method, double ransacReprojThreshold, double confidence, + int maxIters, OutputArray mask = noArray() ); + +/** @overload */ CV_EXPORTS_W Mat findFundamentalMat( InputArray points1, InputArray points2, int method = FM_RANSAC, double ransacReprojThreshold = 3., double confidence = 0.99, diff --git a/modules/calib3d/src/fundam.cpp b/modules/calib3d/src/fundam.cpp index ef09feb3ab..ebfd3af992 100644 --- a/modules/calib3d/src/fundam.cpp +++ b/modules/calib3d/src/fundam.cpp @@ -809,7 +809,7 @@ public: cv::Mat cv::findFundamentalMat( InputArray _points1, InputArray _points2, int method, double ransacReprojThreshold, double confidence, - OutputArray _mask ) + int maxIters, OutputArray _mask ) { CV_INSTRUMENT_REGION(); @@ -861,7 +861,7 @@ cv::Mat cv::findFundamentalMat( InputArray _points1, InputArray _points2, confidence = 0.99; if( (method & ~3) == FM_RANSAC && npoints >= 15 ) - result = createRANSACPointSetRegistrator(cb, 7, ransacReprojThreshold, confidence)->run(m1, m2, F, _mask); + result = createRANSACPointSetRegistrator(cb, 7, ransacReprojThreshold, confidence, maxIters)->run(m1, m2, F, _mask); else result = createLMeDSPointSetRegistrator(cb, 7, confidence)->run(m1, m2, F, _mask); } @@ -872,11 +872,17 @@ cv::Mat cv::findFundamentalMat( InputArray _points1, InputArray _points2, return F; } -cv::Mat cv::findFundamentalMat( InputArray _points1, InputArray _points2, - OutputArray _mask, int method, - double ransacReprojThreshold , double confidence) +cv::Mat cv::findFundamentalMat( cv::InputArray points1, cv::InputArray points2, + int method, double ransacReprojThreshold, double confidence, + cv::OutputArray mask ) +{ + return cv::findFundamentalMat(points1, points2, method, ransacReprojThreshold, confidence, 1000, mask); +} + +cv::Mat cv::findFundamentalMat( cv::InputArray points1, cv::InputArray points2, cv::OutputArray mask, + int method, double ransacReprojThreshold, double confidence ) { - return cv::findFundamentalMat(_points1, _points2, method, ransacReprojThreshold, confidence, _mask); + return cv::findFundamentalMat(points1, points2, method, ransacReprojThreshold, confidence, 1000, mask); }