From: <bl...@us...> - 2009-09-04 10:52:23
|
Revision: 4319 http://hugin.svn.sourceforge.net/hugin/?rev=4319&view=rev Author: blimbo Date: 2009-09-04 10:52:14 +0000 (Fri, 04 Sep 2009) Log Message: ----------- Clean up Removed Paths: ------------- hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/DSC_0675.JPG hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/LineParamEstimator.cpp hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/LineParamEstimator.h hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/MatrixDeterminant.h hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/NewtonRaphson.h hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/PointLineDist.cpp hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/PointLineDist.h hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/PolynomialEstimator.cpp hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/PolynomialEstimator.h hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/Ransac.h hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/SplineEstimator.cpp hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/SplineEstimator.h hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/dsc_0040.jpg hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/dsc_0040.pto hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/dsc_0163.jpg hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/dsc_0163.pto hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/vertical_rotate_test_7.3.jpg Deleted: hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/DSC_0675.JPG =================================================================== (Binary files differ) Deleted: hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/LineParamEstimator.cpp =================================================================== --- hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/LineParamEstimator.cpp 2009-09-04 00:19:00 UTC (rev 4318) +++ hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/LineParamEstimator.cpp 2009-09-04 10:52:14 UTC (rev 4319) @@ -1,111 +0,0 @@ -#include <math.h> -#include "LineParamEstimator.h" -#include "Globals.h" -#include "vigra/diff2d.hxx" -#include <iostream> //cout used in the debugTest method -#include <algorithm> - -using namespace vigra; - -bool compare (const vigra::Point2D * i,const vigra::Point2D * j) { - return (i->x<j->x); -} - -LineParamEstimator::LineParamEstimator(int min, double delta){ - minForEstimate = min; - deltaSquared = delta*delta; -} -/*****************************************************************************/ -/* - * Compute the line parameters [n_x,n_y,a_x,a_y] - */ -bool LineParamEstimator::estimate(std::vector<const Point2D *> &data, - std::vector<double> ¶meters) -{ - parameters.clear(); - if(data.size()<this->minForEstimate) - return(false); - double nx = data[1]->y - data[0]->y; - double ny = data[0]->x - data[1]->x; - double norm = sqrt(nx*nx + ny*ny); - - parameters.push_back(nx/norm); - parameters.push_back(ny/norm); - parameters.push_back(data[0]->x); - parameters.push_back(data[0]->y); - return(true); -} -/*****************************************************************************/ -/* - * Compute the line parameters [n_x,n_y,a_x,a_y] - */ -void LineParamEstimator::leastSquaresEstimate(std::vector<const Point2D *> &data, - std::vector<double> ¶meters) -{ - double meanX, meanY, nx, ny, norm; - double covMat11, covMat12, covMat21, covMat22; // The entries of the symmetric covarinace matrix - int i, dataSize = data.size(); - - parameters.clear(); - if(data.size()<this->minForEstimate) - return; - - meanX = meanY = 0.0; - covMat11 = covMat12 = covMat21 = covMat22 = 0; - for(i=0; i<dataSize; i++) { - meanX +=data[i]->x; - meanY +=data[i]->y; - - covMat11 +=data[i]->x * data[i]->x; - covMat12 +=data[i]->x * data[i]->y; - covMat22 +=data[i]->y * data[i]->y; - } - - meanX/=dataSize; - meanY/=dataSize; - - covMat11 -= dataSize*meanX*meanX; - covMat12 -= dataSize*meanX*meanY; - covMat22 -= dataSize*meanY*meanY; - covMat21 = covMat12; - - if(covMat11<1e-12) { - nx = 1.0; - ny = 0.0; - } - else { //lamda1 is the largest eigen-value of the covariance matrix - //and is used to compute the eigne-vector corresponding to the smallest - //eigenvalue, which isn't computed explicitly. - double lamda1 = (covMat11 + covMat22 + sqrt((covMat11-covMat22)*(covMat11-covMat22) + 4*covMat12*covMat12)) / 2.0; - nx = -covMat12; - ny = lamda1 - covMat22; - norm = sqrt(nx*nx + ny*ny); - nx/=norm; - ny/=norm; - } - parameters.push_back(nx); - parameters.push_back(ny); - parameters.push_back(meanX); - parameters.push_back(meanY); - - cout << endl << "Inliers:" << endl; - sort(data.begin(), data.end(), compare); - for (int i = 0; i < data.size(); i++){ - //inliers.push_back(data[i]); - cout << data[i]->x << "," << data[i]->y << endl; - } - cout << endl; - -} -/*****************************************************************************/ -/* - * Given the line parameters [n_x,n_y,a_x,a_y] check if - * [n_x, n_y] dot [data.x-a_x, data.y-a_y] < m_delta - */ -bool LineParamEstimator::agree(std::vector<double> ¶meters, const Point2D &data) -{ - double signedDistance = parameters[0]*(data.x-parameters[2]) + parameters[1]*(data.y-parameters[3]); - return ((signedDistance*signedDistance) < this->deltaSquared); -} -/*****************************************************************************/ - Deleted: hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/LineParamEstimator.h =================================================================== --- hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/LineParamEstimator.h 2009-09-04 00:19:00 UTC (rev 4318) +++ hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/LineParamEstimator.h 2009-09-04 10:52:14 UTC (rev 4319) @@ -1,72 +0,0 @@ -#ifndef _LINE_PARAM_ESTIMATOR_H_ -#define _LINE_PARAM_ESTIMATOR_H_ - -#include "vigra/diff2d.hxx" -#include <vector> -using namespace std; -using namespace vigra; - -/** - * This class estimates the parameters of 2D lines. - * A 2D line is represented as: (*) dot(n,p-a)=0 - * where n is the line normal (|n| = 1) and 'a' is a - * point on the line. - * All points 'p' which satisfy equation (*) are on the line. - * - * The reason for choosing this line parametrization is that it can represent - * all lines, including vertical and horizontal, unlike the slope intercept (y=ax+b) - * parametrization. - * - * Author: Ziv Yaniv - */ - -class LineParamEstimator { -public: - LineParamEstimator(int min, double delta); - - /** - * Compute the line defined by the given data points. - * @param data A vector containing two 2D points. - * @param This vector is cleared and then filled with the computed parameters. - * The parameters of the line passing through these points [n_x,n_y,a_x,a_y] - * where ||(n_x,ny)|| = 1. - * If the vector contains less than two points then the resulting parameters - * vector is empty (size = 0). - */ - bool estimate(std::vector<const Point2D *> &data, std::vector<double> ¶meters); - - /** - * Compute a least squares estimate of the line defined by the given points. - * This implementation is of an orthogonal least squares error. - * - * @param data The line should minimize the least squares error to these points. - * @param parameters This vector is cleared and then filled with the computed parameters. - * Fill this vector with the computed line parameters [n_x,n_y,a_x,a_y] - * where ||(n_x,ny)|| = 1. - * If the vector contains less than two points then the resulting parameters - * vector is empty (size = 0). - */ - virtual void leastSquaresEstimate(std::vector<const Point2D *> &data, std::vector<double> ¶meters); - - /** - * Return true if the distance between the line defined by the parameters and the - * given point is smaller than 'delta' (see constructor). - * @param parameters The line parameters [n_x,n_y,a_x,a_y]. - * @param data Check that the distance between this point and the line is smaller than 'delta'. - */ - virtual bool agree(std::vector<double> ¶meters, const Point2D &data); - - /** - * Test the class methods, output to specified stream. - */ - //static void debugTest(ostream &out); - - unsigned int numForEstimate() const {return minForEstimate;} -protected: - unsigned int minForEstimate; - -private: - double deltaSquared; //given line L and point P, if dist(L,P)^2 < m_delta^2 then the point is on the line -}; - -#endif //_LINE_PARAM_ESTIMATOR_H_ Deleted: hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/MatrixDeterminant.h =================================================================== --- hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/MatrixDeterminant.h 2009-09-04 00:19:00 UTC (rev 4318) +++ hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/MatrixDeterminant.h 2009-09-04 10:52:14 UTC (rev 4319) @@ -1,32 +0,0 @@ -#ifndef MATRIX_DETERMINANT_H -#define MATRIX_DETERMINANT_H - -#include <boost/numeric/ublas/lu.hpp> - -namespace ublas = boost::numeric::ublas; - -template<class matrix_T> -double determinant(ublas::matrix_expression<matrix_T> const& mat_r){ - - double det = 1.0; - - matrix_T mLu(mat_r() ); - ublas::permutation_matrix<std::size_t> pivots(mat_r().size1() ); - - int is_singular = lu_factorize(mLu, pivots); - - if(!is_singular){ - - for (std::size_t i=0; i < pivots.size(); ++i){ - if (pivots(i) != i){ - det *= -1.0; - } - det *= mLu(i,i); - } - }else{ - det = 0.0; - } - - return det; -} -#endif Deleted: hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/NewtonRaphson.h =================================================================== --- hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/NewtonRaphson.h 2009-09-04 00:19:00 UTC (rev 4318) +++ hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/NewtonRaphson.h 2009-09-04 10:52:14 UTC (rev 4319) @@ -1,37 +0,0 @@ -// Newton-Raphson method of finding roots // -// Passing references to functions f(x) and f'(x) as function parameters // -// also demonstrates use of a function template // - -#include <iostream> -#include <iomanip> -#include <math.h> -#include <complex> - -using namespace std; - -//----------------------------------------------------------------------------// -// Function template: Newton-Raphson method find a root of the equation f(x) // -// see http://en.wikipedia.org/wiki/Newton's_method // -// Parameters in: &x reference to first approximation of root // -// (&f)(x) reference to function f(x) // -// (fdiv)(x) reference to function f'(x) // -// max_loop maxiumn number of itterations // -// accuracy required accuracy // -// out: &x return root found // -// function result: > 0 (true) if root found, 0 (false) if max_loop exceeded // -template <class T1> - int newton(T1 &x, T1 (&f)(T1), T1 (&fdiv)(T1), - int max_loop, const double accuracy) - { - T1 term; - do - { - // calculate next term f(x) / f'(x) then subtract from current root - term = (f)(x) / (fdiv)(x); - x = x - term; // new root - } - // check if term is within required accuracy or loop limit is exceeded - while ((abs(term / x) > accuracy) && (--max_loop)); - return max_loop; - } - Deleted: hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/PointLineDist.cpp =================================================================== --- hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/PointLineDist.cpp 2009-09-04 00:19:00 UTC (rev 4318) +++ hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/PointLineDist.cpp 2009-09-04 10:52:14 UTC (rev 4319) @@ -1,52 +0,0 @@ -#include <cmath> -#include "vigra/diff2d.hxx" -#include <stdlib.h> - -// Compute the dot product AB . BC -int dot(const vigra::Point2D A, const vigra::Point2D B, const vigra::Point2D C){ - - int AB[2]; - int BC[2]; - AB[0] = B->x-A->x; - AB[1] = B->y-A->y; - BC[0] = C->x-B->x; - BC[1] = C->y-B->y; - int dot = AB[0] * BC[0] + AB[1] * BC[1]; - return dot; - -} -// Compute the cross product AB x AC -int cross(const vigra::Point2D A, const vigra::Point2D B, const vigra::Point2D C){ - - int AB[2]; - int AC[2]; - AB[0] = B->x-A->x; - AB[1] = B->y-A->y; - AC[0] = C->x-A->x; - AC[1] = C->y-A->y; - int cross = AB[0] * AC[1] - AB[1] * AC[0]; - return cross; -} - - -// Compute the distance from A to B -double PointPointDist(const vigra::Point2D A, const vigra::Point2D B){ - int d1 = A->x - B->x; - int d2 = A->y - B->y; - return sqrt(d1*d1+d2*d2); -} - -// Compute the distance from AB to C -// If isSegment is true, AB is a segment, not a line. -double LinePointDist(const vigra::Point2D A, const vigra::Point2D B, const vigra::Point2D C, bool isSegment){ - - double dist = cross(A,B,C) / PointPointDist(A,B); - if(isSegment){ - int dot1 = dot(A,B,C); - if(dot1 > 0)return PointPointDist(B,C); - int dot2 = dot(B,A,C); - if(dot2 > 0)return PointPointDist(A,C); - } - return fabs(dist); -} - Deleted: hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/PointLineDist.h =================================================================== --- hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/PointLineDist.h 2009-09-04 00:19:00 UTC (rev 4318) +++ hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/PointLineDist.h 2009-09-04 10:52:14 UTC (rev 4319) @@ -1,9 +0,0 @@ -#ifndef POINTLINEDIST_H -#define POINTLINEDIST_H - -int dot(const vigra::Point2D A, const vigra::Point2D B, const vigra::Point2D C); -int cross(const vigra::Point2D A, const vigra::Point2D B, const vigra::Point2D C); -double PointPointDist(const vigra::Point2D A, const vigra::Point2D B); -double LinePointDist(const vigra::Point2D A, const vigra::Point2D B, const vigra::Point2D C, bool isSegment); - -#endif Deleted: hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/PolynomialEstimator.cpp =================================================================== --- hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/PolynomialEstimator.cpp 2009-09-04 00:19:00 UTC (rev 4318) +++ hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/PolynomialEstimator.cpp 2009-09-04 10:52:14 UTC (rev 4319) @@ -1,220 +0,0 @@ -#include <cmath> -#include "PolynomialEstimator.h" -#include <iostream> -#include "vigra/diff2d.hxx" -#include <boost/numeric/ublas/matrix.hpp> -#include <boost/numeric/ublas/io.hpp> -#include <levmar/lm.h> -#include "MatrixDeterminant.h" -#include "Globals.h" - -using namespace boost::numeric::ublas; -using namespace std; - -bool compare (const vigra::Point2D * i,const vigra::Point2D * j) { - return (i->x<j->x); -} - -ParameterEstimator::ParameterEstimator(unsigned int m, double delta){ - - // Number of data objects required for an exact - // estimate (e.g. 2 for a line where the data objects are points) - minForEstimate = m; - deltasquared = delta*delta; -} - -bool ParameterEstimator::estimate(std::vector<const vigra::Point2D *> &data, std::vector<double> ¶meters){ - - parameters.clear(); - if(data.size()<this->minForEstimate) - return(false); - - /* Quadratic: ax^2 + bx + c = y - Need to estimate a, b and c - - Using Cramer's Rule - http://en.wikipedia.org/wiki/Cramer%27s_rule - [x_1^2, x_1, 1] [a] [y_1] - [x_2^2, x_2, 1]*[b]=[y_2] - [x_3^2, x_3, 1] [c] [y_3] - - Divisions below are using the determinants of - the matrices - - [ y_1 , x_1, 1] - [ y_2 , x_2, 1] - [ y_3 , x_3, 1] - a = --------------- - [x_1^2, x_1, 1] - [x_2^2, x_2, 1] - [x_3^2, x_3, 1] - - [x_1^2, y_1, 1] - [x_2^2, y_2, 1] - [x_3^2, y_3, 1] - b = --------------- - [x_1^2, x_1, 1] - [x_2^2, x_2, 1] - [x_3^2, x_3, 1] - - [x_1^2, x_1, y_1] - [x_2^2, x_2, y_2] - [x_3^2, x_3, y_3] - c = ----------------- - [x_1^2, x_1, 1] - [x_2^2, x_2, 1] - [x_3^2, x_3, 1] - */ - - matrix<double> m1 (3, 3), m2 (3, 3); - m1 (0,0) = data[0]->x*data[0]->x; - m1 (0,1) = data[0]->x; - m1 (0,2) = 1; - m1 (1,0) = data[1]->x*data[1]->x; - m1 (1,1) = data[1]->x; - m1 (1,2) = 1; - m1 (2,0) = data[2]->x*data[2]->x; - m1 (2,1) = data[2]->x; - m1 (2,2) = 1; - - double d_m1 = determinant(m1); - //std::cout << "Matrix m1:\t" << m1 << std::endl; - //std::cout << "m1 determinant:\t" << d_m1 << std::endl; - - m2 = m1; - m2 (0,0) = data[0]->y; - m2 (1,0) = data[1]->y; - m2 (2,0) = data[2]->y; - - /* - std::cout << "Matrix m2:\t" << m2 << std::endl; - double d_m2_a = determinant(m2); - std::cout << "(a) m2 determinant:\t" << d_m2_a << std::endl; - double a = d_m2_a/d_m1; - */ - double a = determinant(m2)/d_m1; - - m2 = m1; - m2 (0,1) = data[0]->y; - m2 (1,1) = data[1]->y; - m2 (2,1) = data[2]->y; - - /* - std::cout << "Matrix m2:\t" << m2 << std::endl; - double d_m2_b = determinant(m2); - std::cout << "(b) m2 determinant:\t" << d_m2_b << std::endl; - double b = d_m2_b/d_m1; - */ - double b = determinant(m2)/d_m1; - - m2 = m1; - m2 (0,2) = data[0]->y; - m2 (1,2) = data[1]->y; - m2 (2,2) = data[2]->y; - - /* - std::cout << "Matrix m2:\t" << m2 << std::endl; - double d_m2_c = determinant(m2); - std::cout << "(c) m2 determinant:\t" << d_m2_c << std::endl; - double c = d_m2_c/d_m1; - */ - double c = determinant(m2)/d_m1; - - /* - std::cout << "Parameter estimates:" << std::endl; - std::cout << "a:\t" << a << std::endl; - std::cout << "b:\t" << b << std::endl; - std::cout << "c:\t" << c << std::endl << std::endl; - */ - - parameters.push_back(a); - parameters.push_back(b); - parameters.push_back(c); - return(true); - - -} - - -void ParameterEstimator::leastSquaresEstimate(std::vector<const vigra::Point2D *> &data, std::vector<double> ¶meters) -{ - - - - cout << endl << "Inliers:" << endl; - sort(data.begin(), data.end(), compare); - for (int i = 0; i < data.size(); i++){ - inliers.push_back(data[i]); - cout << data[i]->x << "," << data[i]->y << endl; - } - cout << endl; - - - /* - - std::cout << "Least squares estimate..." << std::endl; - const int n= data.size(), m = 3; // n measurements, 3 parameters - double p[m], x[n], opts[LM_OPTS_SZ], info[LM_INFO_SZ]; - register int i; - int ret; - - for(i=0; i < n; ++i){ - x[i]= 1; - } - - // initial parameters estimate: (1.0, 1.0, 1.0) - p[0]=1.0; p[1]=1.0; p[2]=1.0; - - // optimization control parameters; passing to levmar NULL instead of opts reverts to defaults - opts[0]=LM_INIT_MU; opts[1]=1E-15; opts[2]=1E-15; opts[3]=1E-20; - opts[4]=LM_DIFF_DELTA; // relevant only if the finite difference Jacobian version is used - - // invoke the optimization function - ret=dlevmar_der(func, jacfunc, p, x, m, n, 1000, opts, info, NULL, NULL, &data); // with analytic Jacobian - - printf("Levenberg-Marquardt returned in %g iter, reason %g, sumsq %g [%g]\n", info[5], info[6], info[1], info[0]); - printf("Best fit parameters: %.7g %.7g %.7g\n", p[0], p[1], p[2]); - - parameters.push_back(p[0]); - parameters.push_back(p[1]); - parameters.push_back(p[2]); - */ - -} - -bool ParameterEstimator::agree(std::vector<double> ¶meters, const vigra::Point2D &data){ - - double p = data->x; - double q = data->y; - double a = parameters[0]; - double b = parameters[1]; - double c = parameters[2]; - double a2 = a*a; - double a3 = a2*a; - double a4 = a2*a2; - double b2 = b*b; - - double x = - -(b/(2*a)) - - (6*a2 - 3*a2*b2 + 12*a3*c - 12*a3*q) - /(3*pow(2,(2.0/3.0))*a2*pow((54*a3*b + 108*a4*p + - sqrt(pow((54*a3*b + 108*a4*p),2) + 4*pow((6*a2 - 3*a2*b2 + 12*a3*c - 12*a3*q),3)) - ),(1.0/3.0))) - + (1/(6*pow(2,(1.0/3.0))*a2)) - * pow( - (54*a3*b + 108*a4*p + sqrt(pow((54*a3*b + 108*a4*p),2) - + 4*pow((6*a2 - 3*a2*b2 + 12*a3*c - 12*a3*q),3))) - ,(1.0/3.0)); - - double y = (a*(x*x)) + (b*x) + c; - - int d1 = p - x; - int d2 = q - y; - - double distancesquared = (d1*d1 + d2*d2); - - return (distancesquared < this->deltasquared); - -} - - Deleted: hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/PolynomialEstimator.h =================================================================== --- hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/PolynomialEstimator.h 2009-09-04 00:19:00 UTC (rev 4318) +++ hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/PolynomialEstimator.h 2009-09-04 10:52:14 UTC (rev 4319) @@ -1,66 +0,0 @@ -#ifndef _PARAMETER_ESTIMATOR_H_ -#define _PARAMETER_ESTIMATOR_H_ - -#include <vector> -#include <iostream> -#include "vigra/diff2d.hxx" - -/** - * This class defines the interface for parameter estimators. - * Classes which inherit from it can be used by the Ransac class to perform robust - * parameter estimation. - * The interface includes three methods: - * 1.estimate() - Estimation of the parameters using the minimal - * amount of data (exact estimate). - * 2.leastSquaresEstimate() - Estimation of the parameters using - * overdetermined data, so that the estimate - * minimizes a least squres error criteria. - * 3.agree() - Does the given data agree with the model parameters. - * - * Author: Ziv Yaniv - */ - -class ParameterEstimator { -public: - - /** - * Constructor which takes the number of data objects required for an exact - * estimate (e.g. 2 for a line where the data objects are points - */ - ParameterEstimator(unsigned int minForEstimate, double delta); - - /** - * Exact estimation of parameters. - * @param data The data used for the estimate. - * @param parameters This vector is cleared and then filled with the computed parameters. - */ - virtual bool estimate(std::vector<const vigra::Point2D *> &data, std::vector<double> ¶meters); - - /** - * Least squares estimation of parameters. - * @param data The data used for the estimate. - * @param parameters This vector is cleared and then filled with the computed parameters. - */ - virtual void leastSquaresEstimate(std::vector<const vigra::Point2D *> &data, std::vector<double> ¶meters); - - /** - * This method tests if the given data agrees with the given model parameters. - */ - virtual bool agree(std::vector<double> ¶meters, const vigra::Point2D &data); - - static void debugTest(std::ostream &out); - - /** - * Returns the number of data objects required for an exact - * estimate (e.g. 2 for a line where the data objects are points) - */ - unsigned int numForEstimate() const {return minForEstimate;} -protected: - unsigned int minForEstimate; - -private: - double deltasquared; //given line L and point P, if dist(L,P)^2 < m_delta^2 then the point is on the line - -}; - -#endif //_PARAMETER_ESTIMATOR_H_ Deleted: hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/Ransac.h =================================================================== --- hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/Ransac.h 2009-09-04 00:19:00 UTC (rev 4318) +++ hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/Ransac.h 2009-09-04 10:52:14 UTC (rev 4319) @@ -1,440 +0,0 @@ -// -*- c-basic-offset: 4 -*- -/** @file RemappedPanoImage.h - * - * Generic implementation of the RanSaC algorithm. - * - * @author Ziv Yaniv - * - * Some minor changes by Pablo d'Angelo <pab...@we...> - * - * $Id: ransac.h 2894 2008-02-18 22:22:26Z brunopostle $ - * - * This is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ - -#ifndef _RANSAC_H_ -#define _RANSAC_H_ - -#include <set> -#include <vector> -#include <stdlib.h> -#include <cstring> -#include <math.h> -#include <ctime> - -#include <boost/random/mersenne_twister.hpp> -#include <boost/random/uniform_int.hpp> -#include <boost/random/variate_generator.hpp> -//#include "SplineEstimator.h" -#include "LineParamEstimator.h" -//#include "PolynomialEstimator.h" - -using namespace std; - - -/** - * This class implements the Random Sample Consensus (RanSac) framework, - * a framework for robust parameter estimation. - * Given data containing outliers we estimate the model parameters using sub-sets of - * the original data: - * 1. Choose the minimal subset from the data for computing the exact model parameters. - * 2. See how much of the input data agrees with the computed parameters. - * 3. Goto step 1. This can be done up to (m choose N) times, where m is the number of - * data objects required for an exact estimate and N is the total number of data objects. - * 4. Take the largest subset of objects which agreed on the parameters and compute a - * least squares fit using them. - * - * This is based on: - * Fischler M.A., Bolles R.C., - * ``Random Sample Consensus: A Paradigm for Model Fitting with Applications to Image Analysis and Automated Cartography'', - * Communications of the ACM, Vol. 24(6), 1981. - * - * Hartely R., Zisserman A., "Multiple View Geometry in Computer Vision" - * - * The class template parameters are T - objects used for the parameter estimation - * (e.g. Point2D in line estimation, - * std::pair<Point2D,Point2D> in homography estimation). - * S - type of parameters (e.g. std::vector<double>). - * - * Author: Ziv Yaniv - * - * Small modifications by Pablo d'Angelo: - * * allow arbitrary parameters, not just vector<S> - */ -class Ransac { - -public: - /** - * Estimate the model parameters using the RanSac framework. - * @param parameters A vector which will contain the estimated parameters. - * If there is an error in the input then this vector will be empty. - * Errors are: 1. Less data objects than required for an exact fit. - * 2. The given data is in a singular configuration (e.g. trying to fit a circle - * to a set of colinear points). - * @param paramEstimator An object which can estimate the desired parameters using either an exact fit or a - * least squares fit. - * @param data The input from which the parameters will be estimated. - * @param numForEstimate The number of data objects required for an exact fit. - * @param desiredProbabilityForNoOutliers The probability that at least one of the selected subsets doesn't contains an - * outlier. - * @param maximalOutlierPercentage The maximal expected percentage of outliers. - * @return Returns the percentage of data used in the least squares estimate. - */ - template<class Estimator, class S, class T> - static int compute(S & parameters, - const Estimator & paramEstimator , - const std::vector<T> &data, - double desiredProbabilityForNoOutliers, - double maximalOutlierPercentage); - - - /** - * Estimate the model parameters using the maximal consensus set by going over ALL possible - * subsets (brute force approach). - * Given: n - data.size() - * k - numForEstimate - * We go over all n choose k subsets n! - * ------------ - * (n-k)! * k! - * @param parameters A vector which will contain the estimated parameters. - * If there is an error in the input then this vector will be empty. - * Errors are: 1. Less data objects than required for an exact fit. - * 2. The given data is in a singular configuration (e.g. trying to fit a circle - * to a set of colinear points). - * @param paramEstimator An object which can estimate the desired parameters using either an exact fit or a - * least squares fit. - * @param data The input from which the parameters will be estimated. - * @param numForEstimate The number of data objects required for an exact fit. - * @return Returns the percentage of data used in the least squares estimate. - * - * NOTE: This method should be used only when n choose k is small (i.e. k or (n-k) are approximatly equal to n) - * - */ - template<class Estimator, class S, class T> - static int compute(S ¶meters, - const Estimator & paramEstimator , - const std::vector<T> &data); - -private: - - /** - * Compute n choose m [ n!/(m!*(n-m)!)] - */ - static unsigned int choose(unsigned int n, unsigned int m); - - template<class Estimator, class T> - static void computeAllChoices(const Estimator & paramEstimator, - const std::vector<T> &data, - int numForEstimate, - short *bestVotes, short *curVotes, - int &numVotesForBest, int startIndex, - int n, int k, int arrIndex, int *arr); - - - template<class Estimator, class T, class S> - static void estimate(const Estimator & paramEstimator, const std::vector<T> &data, - int numForEstimate, - short *bestVotes, short *curVotes, - int &numVotesForBest, int *arr); - - class SubSetIndexComparator - { - private: - int m_length; - public: - SubSetIndexComparator(int arrayLength) : m_length(arrayLength) - {} - - bool operator()(const int *arr1, const int *arr2) const - { - for(int i=0; i<m_length; i++) - if(arr1[i] < arr2[i]) - return true; - return false; - } - }; - -}; - - -/*******************************RanSac Implementation*************************/ - -template<class Estimator, class S, class T> -int Ransac::compute(S ¶meters, - const Estimator & paramEstimator, - const std::vector<T> &data, - double desiredProbabilityForNoOutliers, - double maximalOutlierPercentage) -{ - - unsigned int numDataObjects = (int) data.size(); - unsigned int numForEstimate = paramEstimator->numForEstimate(); - - //there are less data objects than the minimum required for an exact fit, or - //all the data is outliers? - if(numDataObjects < numForEstimate || maximalOutlierPercentage>=1.0){ - cout << "Less data objects than the minimum required for an exact fit" << endl; - cout << "numDataObjects = " << numDataObjects << " < numForEstimate = " << numForEstimate << endl; - cout << "or maximalOutlierPercentage = " << maximalOutlierPercentage << " >= 1.0" << endl; - return 0; - } - - std::vector<const T *> exactEstimateData; - std::vector<const T *> leastSquaresEstimateData; - S exactEstimateParameters; - int i, j, k, l, numVotesForBest, numVotesForCur, maxIndex, numTries; - short *bestVotes = new short[numDataObjects]; //one if data[i] agrees with the best model, otherwise zero - short *curVotes = new short[numDataObjects]; //one if data[i] agrees with the current model, otherwise zero - short *notChosen = new short[numDataObjects]; //not zero if data[i] is NOT chosen for computing the exact fit, otherwise zero - SubSetIndexComparator subSetIndexComparator(numForEstimate); - std::set<int *, SubSetIndexComparator > chosenSubSets(subSetIndexComparator); - int *curSubSetIndexes; - double outlierPercentage = maximalOutlierPercentage; - double numerator = log(1.0-desiredProbabilityForNoOutliers); - double denominator = log(1- pow((double)(1.0-maximalOutlierPercentage), (double)(numForEstimate))); - int allTries = choose(numDataObjects,numForEstimate); - - numVotesForBest = 0; //initalize with 0 so that the first computation which gives any type of fit will be set to best - - // intialize random generator - boost::mt19937 rng; - // start with a different seed every time. - rng.seed(static_cast<unsigned int>(std::time(0))); - // randomly sample points. - maxIndex = numDataObjects-1; - boost::uniform_int<> distribIndex(0, maxIndex); - boost::variate_generator<boost::mt19937&, boost::uniform_int<> > - randIndex(rng, distribIndex); // glues randomness with mapping - -// srand((unsigned)time(NULL)); //seed random number generator - numTries = (int)(numerator/denominator + 0.5); - - //there are cases when the probablistic number of tries is greater than all possible sub-sets - numTries = numTries<allTries ? numTries : allTries; - - for(i=0; i<numTries; i++) { - - //std::cout << "Try " << i << std::endl; - - //randomly select data for exact model fit ('numForEstimate' objects). - memset(notChosen,'1',numDataObjects*sizeof(short)); - curSubSetIndexes = new int[numForEstimate]; - - exactEstimateData.clear(); - - maxIndex = numDataObjects-1; - for(l=0; l<(int)numForEstimate; l++) { - //selectedIndex is in [0,maxIndex] - unsigned int selectedIndex = randIndex(); -// unsigned int selectedIndex = (unsigned int)(((float)rand()/(float)RAND_MAX)*maxIndex + 0.5); - for(j=-1,k=0; k<(int)numDataObjects && j<(int)selectedIndex; k++) { - if(notChosen[k]) - j++; - } - k--; - exactEstimateData.push_back(&(data[k])); - notChosen[k] = 0; - maxIndex--; - } - //get the indexes of the chosen objects so we can check that this sub-set hasn't been - //chosen already - for(l=0, j=0; j<(int)numDataObjects; j++) { - if(!notChosen[j]) { - curSubSetIndexes[l] = j+1; - l++; - } - } - - //check that the sub set just chosen is unique - std::pair< std::set<int *, SubSetIndexComparator >::iterator, bool > res = chosenSubSets.insert(curSubSetIndexes); - - if(res.second == true) { //first time we chose this sub set - //use the selected data for an exact model parameter fit - if (!paramEstimator->estimate(exactEstimateData,exactEstimateParameters)) - //selected data is a singular configuration (e.g. three colinear points for - //a circle fit) - continue; - //see how many agree on this estimate - numVotesForCur = 0; - memset(curVotes,'\0',numDataObjects*sizeof(short)); - for(j=0; j<(int)numDataObjects; j++) { - if(paramEstimator->agree(exactEstimateParameters, data[j])) { - curVotes[j] = 1; - numVotesForCur++; - } - } - if(numVotesForCur > numVotesForBest) { - numVotesForBest = numVotesForCur; - memcpy(bestVotes,curVotes, numDataObjects*sizeof(short)); - } - //update the estimate of outliers and the number of iterations we need - outlierPercentage = 1 - (double)numVotesForCur/(double)numDataObjects; - if(outlierPercentage < maximalOutlierPercentage) { - maximalOutlierPercentage = outlierPercentage; - denominator = log(1- pow((double)(1.0-maximalOutlierPercentage), (double)(numForEstimate))); - numTries = (int)(numerator/denominator + 0.5); - //there are cases when the probablistic number of tries is greater than all possible sub-sets - numTries = numTries<allTries ? numTries : allTries; - } - } - else { //this sub set already appeared, don't count this iteration - delete [] curSubSetIndexes; - i--; - } - } - - //release the memory - std::set<int *, SubSetIndexComparator >::iterator it = chosenSubSets.begin(); - std::set<int *, SubSetIndexComparator >::iterator chosenSubSetsEnd = chosenSubSets.end(); - while(it!=chosenSubSetsEnd) { - delete [] (*it); - it++; - } - chosenSubSets.clear(); - - //compute the least squares estimate using the largest sub set - if(numVotesForBest > 0) { - for(j=0; j<(int)numDataObjects; j++) { - if(bestVotes[j]) - leastSquaresEstimateData.push_back(&(data[j])); - } - paramEstimator->leastSquaresEstimate(leastSquaresEstimateData,parameters); - } - delete [] bestVotes; - delete [] curVotes; - delete [] notChosen; - - return numVotesForBest; - -} -/*****************************************************************************/ -template<class Estimator, class S, class T> -int Ransac::compute(S ¶meters, - const Estimator & paramEstimator, - const std::vector<T> &data) -{ - unsigned int numForEstimate = paramEstimator->numForEstimate(); - std::vector<T *> leastSquaresEstimateData; - int numDataObjects = data.size(); - int numVotesForBest = 0; - int *arr = new int[numForEstimate]; - short *curVotes = new short[numDataObjects]; //one if data[i] agrees with the current model, otherwise zero - short *bestVotes = new short[numDataObjects]; //one if data[i] agrees with the best model, otherwise zero - - //parameters.clear(); - - //there are less data objects than the minimum required for an exact fit - if(numDataObjects < numForEstimate) - return 0; - - computeAllChoices(paramEstimator,data,numForEstimate, - bestVotes, curVotes, numVotesForBest, 0, data.size(), numForEstimate, 0, arr); - - //compute the least squares estimate using the largest sub set - if(numVotesForBest > 0) { - for(int j=0; j<numDataObjects; j++) { - if(bestVotes[j]) - leastSquaresEstimateData.push_back(&(data[j])); - } - paramEstimator->leastSquaresEstimate(leastSquaresEstimateData,parameters); - } - - delete [] arr; - delete [] bestVotes; - delete [] curVotes; - - return numVotesForBest; -} -/*****************************************************************************/ -template<class Estimator, class T> -void Ransac::computeAllChoices(const Estimator ¶mEstimator, const std::vector<T> &data, - int numForEstimate,short *bestVotes, short *curVotes, - int &numVotesForBest, int startIndex, int n, int k, - int arrIndex, int *arr) -{ - //we have a new choice of indexes - if(k==0) { - estimate(paramEstimator, data, numForEstimate, bestVotes, curVotes, numVotesForBest, arr); - return; - } - - //continue to recursivly generate the choice of indexes - int endIndex = n-k; - for(int i=startIndex; i<=endIndex; i++) { - arr[arrIndex] = i; - computeAllChoices(paramEstimator, data, numForEstimate, bestVotes, curVotes, numVotesForBest, - i+1, n, k-1, arrIndex+1, arr); - } - -} -/*****************************************************************************/ -template<class Estimator, class T, class S> -void Ransac::estimate(const Estimator & paramEstimator, const std::vector<T> &data, - int numForEstimate, short *bestVotes, short *curVotes, - int &numVotesForBest, int *arr) -{ - std::vector<T *> exactEstimateData; - std::vector<S> exactEstimateParameters; - int numDataObjects; - int numVotesForCur;//initalize with -1 so that the first computation will be set to best - int j; - - numDataObjects = data.size(); - memset(curVotes,'\0',numDataObjects*sizeof(short)); - numVotesForCur=0; - - for(j=0; j<numForEstimate; j++) - exactEstimateData.push_back(&(data[arr[j]])); - paramEstimator->estimate(exactEstimateData,exactEstimateParameters); - //singular data configuration - if(exactEstimateParameters.size()==0) - return; - - for(j=0; j<numDataObjects; j++) { - if(paramEstimator->agree(exactEstimateParameters, data[j])) { - curVotes[j] = 1; - numVotesForCur++; - } - } - if(numVotesForCur > numVotesForBest) { - numVotesForBest = numVotesForCur; - memcpy(bestVotes,curVotes, numDataObjects*sizeof(short)); - } -} -/*****************************************************************************/ -inline unsigned int Ransac::choose(unsigned int n, unsigned int m) -{ - unsigned int denominatorEnd, numeratorStart, numerator,denominator; - if((n-m) > m) { - numeratorStart = n-m+1; - denominatorEnd = m; - } - else { - numeratorStart = m+1; - denominatorEnd = n-m; - } - - unsigned int i; - for(i=numeratorStart, numerator=1; i<=n; i++) - numerator*=i; - for(i=1, denominator=1; i<=denominatorEnd; i++) - denominator*=i; - return numerator/denominator; - -} - - -#endif //_RANSAC_H_ Deleted: hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/SplineEstimator.cpp =================================================================== --- hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/SplineEstimator.cpp 2009-09-04 00:19:00 UTC (rev 4318) +++ hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/SplineEstimator.cpp 2009-09-04 10:52:14 UTC (rev 4319) @@ -1,278 +0,0 @@ -#include <cmath> -#include <iomanip> -#include <algorithm> -#include <iostream> -#include "vigra/diff2d.hxx" -#include "SplineEstimator.h" -#include "Globals.h" -#include "Spline.h" -#include "PointLineDist.h" - -using namespace std; - -bool compare (const vigra::Point2D * i,const vigra::Point2D * j) { - return (i->x<j->x); -} - -ParameterEstimator::ParameterEstimator(unsigned int m, double delta){ - - minForEstimate = m; - distance = delta; - distancesquared = delta*delta; -} - -bool ParameterEstimator::estimate(std::vector<const vigra::Point2D *> &data, std::vector<double> ¶meters){ - - parameters.clear(); - if(data.size()<this->minForEstimate){ - return(false); - } - - sort(data.begin(), data.end(), compare); - for (int t = 0; t < data.size()-1; t++){ - if (data[t]->x == data[t+1]->x){ - return(false); - } - } - - /* - Cubic splines have 2n+2 parameters, where n is the number of - data points. The first n parameters are the x-values. The next - n parameters are the y-values. The last two parameters are - the values of the derivative at the first and last point. For natural - splines, these parameters are unused. - - http://www.extremeoptimization.com/QuickStart/CubicSplinesVB.aspx - - */ - - // Load the x values in to parameters vector - for(int i = 0; i < data.size(); i++){ - parameters.push_back(data[i]->x); - } - // Load the y values in to parameters vector - for(int i = 0; i < data.size(); i++){ - parameters.push_back(data[i]->y); - } - -// - - int N = data.size(); - int i; - int ibcbeg; - int ibcend; - int j; - int jhi; - int k; - - double tval; - - double ybcbeg; - double ybcend; - double *ypp; - double yppval; - double ypval; - double yval; - - //double t[N]; - //double y[N]; - - double * t = new double[N]; - double * y = new double[N]; - - /* - cout << "SPLINE_CUBIC_SET sets up a cubic spline;\n"; - cout << "SPLINE_CUBIC_VAL evaluates it.\n"; - cout << "\n"; - cout << "Runge's function, evenly spaced knots.\n\n"; - */ - - // Points (knots?) are not evenly spaced - is this important? - //cout << "I\tT\tY\n\n"; - for ( i = 0; i < N; i++ ) { - t[i] = data[i]->x; - y[i] = data[i]->y; - //cout << i << "\t" << t[i] << "\t" << y[i] << "\n"; - } - - - ibcbeg = 1; - ybcbeg = fprunge ( t[0] ); - - ibcend = 1; - ybcend = fprunge ( t[N-1] ); - - /* - cout << "\nBoundary condition 1 at both ends:\n"; - cout << "Y'(left) = " << ybcbeg << "\n"; - cout << "Y'(right) = " << ybcend << "\n"; - */ - - // Set up the cubic spline with this data - ypp = spline_cubic_set ( N, t, y, ibcbeg, ybcbeg, ibcend, ybcend ); - - /* - cout << "\n"; - cout << "SPLINE''(T)\tF''(T):\n"; - cout << "\n"; - for ( i = 0; i < N; i++ ){ - cout << ypp[i] << "\t" << fpprunge (t[i]) << "\n"; - } - - cout << "\n"; - cout << "T\tSPLINE(T)\tF(T)\n"; - cout << "\n"; - - for ( i = 0; i <= N; i++ ){ - - if ( i == 0 ){ - jhi = 1; - }else if ( i < N ){ - jhi = 2; - }else{ - jhi = 2; - } - - for ( j = 1; j <= jhi; j++ ){ - if ( i == 0 ){ - tval = t[0] - 1.0; - }else if ( i < N ){ - tval = ( - ( double ) ( jhi - j + 1 ) * t[i-1] - + ( double ) ( j - 1 ) * t[i] ) - / ( double ) ( jhi ); - }else{ - if ( j == 1 ){ - tval = t[N-1]; - }else{ - tval = t[N-1] + 1.0; - } - } - - yval = spline_cubic_val ( N, t, tval, y, ypp, &ypval, &yppval ); - cout << tval << "\t" << yval << "\t\t" << frunge (tval) << "\n"; - - } - } - */ - - // Add the values of the derivative at the first and last point - yval = spline_cubic_val ( N, t, data[0]->x, y, ypp, &ypval, &yppval ); - parameters.push_back(ypval); - yval = spline_cubic_val ( N, t, data[N-1]->x, y, ypp, &ypval, &yppval ); - parameters.push_back(ypval); - - /* - cout << endl << "Spline Parameters:" << endl << endl; - for ( i = 0; i < parameters.size(); i++ ) { - cout << i << ":\t" << parameters[i] << endl; - } - cout << endl << "====================================" << endl << endl; - */ - - delete [] ypp; - delete [] t; - delete [] y; - - return(true); - -} - -void ParameterEstimator::leastSquaresEstimate(std::vector<const vigra::Point2D *> &data, std::vector<double> ¶meters){ - - cout << endl << "Inliers:" << endl; - sort(data.begin(), data.end(), compare); - for (int i = 0; i < data.size(); i++){ - inliers.push_back(data[i]); - cout << data[i]->x << "," << data[i]->y << endl; - } - cout << endl; - - int NTERMS = this->minForEstimate; - int POINT_NUM = data.size(); - - double * b = new double[NTERMS]; - double * c = new double[NTERMS]; - double * d = new double[NTERMS]; - double * f = new double[POINT_NUM]; - double * fp = new double[POINT_NUM]; - int i; - int nterms2; - double px; - double * w = new double[POINT_NUM]; - double * x = new double[POINT_NUM]; - - for ( i = 0; i < POINT_NUM; i++ ){ - w[i] = 1.0; // weight - x[i] = data[i]->x; // abscissas of the data points - f[i] = x[i] * x[i] - x[i] - 6.0; // data values at the points X(*) ?? - fp[i] = 2.0 * x[i] - 1.0; // ?? - } - - least_set ( POINT_NUM, x, f, w, NTERMS, b, c, d ); - - cout << " LEAST_SET sets a least squares polynomial,\n"; - cout << " LEAST_VAL evaluates it.\n"; - cout << "\n"; - cout << " X, F(X), P(X), Error\n"; - cout << "\n"; - //for ( nterms2 = 1; nterms2 <= 3; nterms2++ ){ - - nterms2 = 3; - cout << "\n"; - cout << " Using polynomial order = " << nterms2 << "\n"; - cout << "\n"; - for ( i = 0; i < POINT_NUM; i++ ){ - px = least_val ( nterms2, b, c, d, x[i] ); - cout << " " << setw(12) << x[i] - << " " << setw(12) << f[i] - << " " << setw(12) << px - << " " << setw(12) << px - f[i] << "\n"; - } - //} - - cout << endl; - for ( i = 0; i < NTERMS; i++ ){ - cout << "b:\t" << b[i] << setw(12) << "c:\t" << c[i] << setw(12) << "d:\t" << d[i] << endl; - } - cout << endl; - - delete [] b; - delete [] c; - delete [] d; - delete [] f; - delete [] fp; - delete [] w; - delete [] x; - - -} - -bool ParameterEstimator::agree(std::vector<double> ¶meters, const vigra::Point2D &data){ - - vector<vigra::Point2D> agree_coords; - double min_distance = this->distance; - - for (int i = 0; i < this->minForEstimate; i++ ){ - agree_coords.push_back(vigra::Point2D((int)parameters[i],(int)parameters[i+this->minForEstimate])); - } - - // Use distance between point and line between spline control points - for (int i = 0; i < agree_coords.size()-1; i++ ){ - double this_distance = LinePointDist(agree_coords[i],agree_coords[i+1],data,true); - if(this_distance < min_distance) min_distance = this_distance; - } - - /* - // Use distance between point and spline control points - for (int i = 0; i < agree_coords.size(); i++ ){ - double this_distance = PointPointDist(agree_coords[i],data); - //cout << "thisDistance:\t" << this_distance << endl; - if(this_distance < min_distance) min_distance = this_distance; - } - */ - //cout << "Distance:\t" << min_distance << endl; - - return(min_distance < this->distance); - -} Deleted: hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/SplineEstimator.h =================================================================== --- hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/SplineEstimator.h 2009-09-04 00:19:00 UTC (rev 4318) +++ hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/SplineEstimator.h 2009-09-04 10:52:14 UTC (rev 4319) @@ -1,66 +0,0 @@ -#ifndef _PARAMETER_ESTIMATOR_H_ -#define _PARAMETER_ESTIMATOR_H_ - -#include <vector> -#include <iostream> -#include "vigra/diff2d.hxx" - -/** - * This class defines the interface for parameter estimators. - * Classes which inherit from it can be used by the Ransac class to perform robust - * parameter estimation. - * The interface includes three methods: - * 1.estimate() - Estimation of the parameters using the minimal - * amount of data (exact estimate). - * 2.leastSquaresEstimate() - Estimation of the parameters using - * overdetermined data, so that the estimate - * minimizes a least squres error criteria. - * 3.agree() - Does the given data agree with the model parameters. - * - * Author: Ziv Yaniv - */ - -class ParameterEstimator { -public: - - /** - * Constructor which takes the number of data objects required for an exact - * estimate (e.g. 2 for a line where the data objects are points - */ - ParameterEstimator(unsigned int minForEstimate, double delta); - - /** - * Exact estimation of parameters. - * @param data The data used for the estimate. - * @param parameters This vector is cleared and then filled with the computed parameters. - */ - virtual bool estimate(std::vector<const vigra::Point2D *> &data, std::vector<double> ¶meters); - - /** - * Least squares estimation of parameters. - * @param data The data used for the estimate. - * @param parameters This vector is cleared and then filled with the computed parameters. - */ - virtual void leastSquaresEstimate(std::vector<const vigra::Point2D *> &data, std::vector<double> ¶meters); - - /** - * This method tests if the given data agrees with the given model parameters. - */ - virtual bool agree(std::vector<double> ¶meters, const vigra::Point2D &data); - - static void debugTest(std::ostream &out); - - /** - * Returns the number of data objects required for an exact - * estimate (e.g. 2 for a line where the data objects are points) - */ - unsigned int numForEstimate() const {return minForEstimate;} -protected: - unsigned int minForEstimate; - -private: - double distance,distancesquared; //given line L and point P, if dist(L,P)^2 < m_delta^2 then the point is on the line - -}; - -#endif //_PARAMETER_ESTIMATOR_H_ Deleted: hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/dsc_0040.jpg =================================================================== (Binary files differ) Deleted: hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/dsc_0040.pto =================================================================== --- hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/dsc_0040.pto 2009-09-04 00:19:00 UTC (rev 4318) +++ hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/dsc_0040.pto 2009-09-04 10:52:14 UTC (rev 4319) @@ -1,38 +0,0 @@ -# hugin project file -#hugin_ptoversion 2 -p f0 w3000 h3000 v179 E10.3056 R0 n"TIFF_m c:NONE r:CROP" -m g1 i0 f0 m2 p0.00784314 - -# image lines -#-hugin cropFactor=1.5 -i w2000 h1328 f3 Eb1 Eev10.3056342190224 Er1 Ra0 Rb0 Rc0 Rd0 Re0 Va1 Vb0 Vc0 Vd0 Vx0 Vy0 a0 b0 c0 d0 e0 g0 p0 r0 t0 v137.679087101882 y0 Vm5 u10 n"dsc_0040.jpg" -#-hugin cropFactor=1.5 -i w2000 h1328 f3 Eb1 Eev10.3056342190224 Er1 Ra0 Rb0 Rc0 Rd0 Re0 Va1 Vb0 Vc0 Vd0 Vx0 Vy0 a0 b0 c0 d0 e0 g0 p0 r0 t0 v137.679087101882 y0 Vm5 u10 n"dsc_0040.jpg" - - -# specify variables that should be optimized -v b0 -v - -# control points - -#hugin_optimizeReferenceImage 0 -#hugin_blender enblend -#hugin_remapper nona -#hugin_enblendOptions -#hugin_enfuseOptions -#hugin_hdrmergeOptions -#hugin_outputLDRBlended true -#hugin_outputLDRLayers false -#hugin_outputLDRExposureRemapped false -#hugin_outputLDRExposureLayers false -#hugin_outputLDRExposureBlended false -#hugin_outputHDRBlended false -#hugin_outputHDRLayers false -#hugin_outputHDRStacks false -#hugin_outputLayersCompression PACKBITS -#hugin_outputImageType tif -#hugin_outputImageTypeCompression NONE -#hugin_outputJPEGQuality 100 -#hugin_outputImageTypeHDR exr -#hugin_outputImageTypeHDRCompression Deleted: hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/dsc_0163.jpg =================================================================== (Binary files differ) Deleted: hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/dsc_0163.pto =================================================================== --- hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/dsc_0163.pto 2009-09-04 00:19:00 UTC (rev 4318) +++ hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/dsc_0163.pto 2009-09-04 10:52:14 UTC (rev 4319) @@ -1,39 +0,0 @@ -# hugin project file -#hugin_ptoversion 2 -p f0 w3000 h3000 v179 E0 R0 n"TIFF_m c:NONE r:CROP" -m g1 i0 f0 m2 p0.00784314 - -# image lines -#-hugin cropFactor=1.5 -i w1318 h2000 f3 Eb1 Eev0 Er1 Ra0 Rb0 Rc0 Rd0 Re0 Va1 Vb0 Vc0 Vd0 Vx0 Vy0 a0 b0 c0 d0 e0 g0 p0 r0 t0 v90.939505324643 y0 Vm5 u10 n"dsc_0163.jpg" -#-hugin cropFactor=1.5 -i w1318 h2000 f3 Eb1 Eev0 Er1 Ra0 Rb0 Rc0 Rd0 Re0 Va1 Vb0 Vc0 Vd0 Vx0 Vy0 a0 b0 c0 d0 e0 g0 p0 r0 t0 v90.939505324643 y0 Vm5 u10 n"dsc_0163.jpg" - - -# specify variables that should be optimized -v b0 -v b1 -v - -# control points - -#hugin_optimizeReferenceImage 0 -#hugin_blender enblend -#hugin_remapper nona -#hugin_enblendOptions -#hugin_enfuseOptions -#hugin_hdrmergeOptions -#hugin_outputLDRBlended true -#hugin_outputLDRLayers false -#hugin_outputLDRExposureRemapped false -#hugin_outputLDRExposureLayers false -#hugin_outputLDRExposureBlended false -#hugin_outputHDRBlended false -#hugin_outputHDRLayers false -#hugin_outputHDRStacks false -#hugin_outputLayersCompression PACKBITS -#hugin_outputImageType tif -#hugin_outputImageTypeCompression NONE -#hugin_outputJPEGQuality 100 -#hugin_outputImageTypeHDR exr -#hugin_outputImageTypeHDRCompression Deleted: hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/vertical_rotate_test_7.3.jpg =================================================================== (Binary files differ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |