/*M///////////////////////////////////////////////////////////////////////////////////////1//2// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.3//4// By downloading, copying, installing or using the software you agree to this license.5// If you do not agree to this license, do not download, install,6// copy or use the software.7//8//9// License Agreement10// For Open Source Computer Vision Library11//12// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.13// Copyright (C) 2009, Willow Garage Inc., all rights reserved.14// Third party copyrights are property of their respective owners.15//16// Redistribution and use in source and binary forms, with or without modification,17// are permitted provided that the following conditions are met:18//19// * Redistribution's of source code must retain the above copyright notice,20// this list of conditions and the following disclaimer.21//22// * Redistribution's in binary form must reproduce the above copyright notice,23// this list of conditions and the following disclaimer in the documentation24// and/or other materials provided with the distribution.25//26// * The name of the copyright holders may not be used to endorse or promote products27// derived from this software without specific prior written permission.28//29// This software is provided by the copyright holders and contributors "as is" and30// any express or implied warranties, including, but not limited to, the implied31// warranties of merchantability and fitness for a particular purpose are disclaimed.32// In no event shall the Intel Corporation or contributors be liable for any direct,33// indirect, incidental, special, exemplary, or consequential damages34// (including, but not limited to, procurement of substitute goods or services;35// loss of use, data, or profits; or business interruption) however caused36// and on any theory of liability, whether in contract, strict liability,37// or tort (including negligence or otherwise) arising in any way out of38// the use of this software, even if advised of the possibility of such damage.39//40//M*/41#ifndef __OPENCV_PRECOMP_H__42#define __OPENCV_PRECOMP_H__4344#include "opencv2/core/utility.hpp"4546#include "opencv2/core/private.hpp"4748#include "opencv2/calib3d.hpp"49#include "opencv2/imgproc.hpp"50#include "opencv2/features2d.hpp"515253#include "opencv2/core/ocl.hpp"5455#define GET_OPTIMIZED(func) (func)565758namespace cv59{6061/**62* Compute the number of iterations given the confidence, outlier ratio, number63* of model points and the maximum iteration number.64*65* @param p confidence value66* @param ep outlier ratio67* @param modelPoints number of model points required for estimation68* @param maxIters maximum number of iterations69* @return70* \f[71* \frac{\ln(1-p)}{\ln\left(1-(1-ep)^\mathrm{modelPoints}\right)}72* \f]73*74* If the computed number of iterations is larger than maxIters, then maxIters is returned.75*/76int RANSACUpdateNumIters( double p, double ep, int modelPoints, int maxIters );7778class CV_EXPORTS LMSolver : public Algorithm79{80public:81class CV_EXPORTS Callback82{83public:84virtual ~Callback() {}85virtual bool compute(InputArray param, OutputArray err, OutputArray J) const = 0;86};8788virtual void setCallback(const Ptr<LMSolver::Callback>& cb) = 0;89virtual int run(InputOutputArray _param0) const = 0;90};9192CV_EXPORTS Ptr<LMSolver> createLMSolver(const Ptr<LMSolver::Callback>& cb, int maxIters);9394class CV_EXPORTS PointSetRegistrator : public Algorithm95{96public:97class CV_EXPORTS Callback98{99public:100virtual ~Callback() {}101virtual int runKernel(InputArray m1, InputArray m2, OutputArray model) const = 0;102virtual void computeError(InputArray m1, InputArray m2, InputArray model, OutputArray err) const = 0;103virtual bool checkSubset(InputArray, InputArray, int) const { return true; }104};105106virtual void setCallback(const Ptr<PointSetRegistrator::Callback>& cb) = 0;107virtual bool run(InputArray m1, InputArray m2, OutputArray model, OutputArray mask) const = 0;108};109110CV_EXPORTS Ptr<PointSetRegistrator> createRANSACPointSetRegistrator(const Ptr<PointSetRegistrator::Callback>& cb,111int modelPoints, double threshold,112double confidence=0.99, int maxIters=1000 );113114CV_EXPORTS Ptr<PointSetRegistrator> createLMeDSPointSetRegistrator(const Ptr<PointSetRegistrator::Callback>& cb,115int modelPoints, double confidence=0.99, int maxIters=1000 );116117template<typename T> inline int compressElems( T* ptr, const uchar* mask, int mstep, int count )118{119int i, j;120for( i = j = 0; i < count; i++ )121if( mask[i*mstep] )122{123if( i > j )124ptr[j] = ptr[i];125j++;126}127return j;128}129130static inline bool haveCollinearPoints( const Mat& m, int count )131{132int j, k, i = count-1;133const Point2f* ptr = m.ptr<Point2f>();134135// check that the i-th selected point does not belong136// to a line connecting some previously selected points137// also checks that points are not too close to each other138for( j = 0; j < i; j++ )139{140double dx1 = ptr[j].x - ptr[i].x;141double dy1 = ptr[j].y - ptr[i].y;142for( k = 0; k < j; k++ )143{144double dx2 = ptr[k].x - ptr[i].x;145double dy2 = ptr[k].y - ptr[i].y;146if( fabs(dx2*dy1 - dy2*dx1) <= FLT_EPSILON*(fabs(dx1) + fabs(dy1) + fabs(dx2) + fabs(dy2)))147return true;148}149}150return false;151}152153} // namespace cv154155int checkChessboard(const cv::Mat & img, const cv::Size & size);156int checkChessboardBinary(const cv::Mat & img, const cv::Size & size);157158#endif159160161