From: <bl...@us...> - 2009-07-09 17:25:44
|
Revision: 4015 http://hugin.svn.sourceforge.net/hugin/?rev=4015&view=rev Author: blimbo Date: 2009-07-09 17:25:41 +0000 (Thu, 09 Jul 2009) Log Message: ----------- Altered mapping code, function to measure 3d point to line dist Modified Paths: -------------- hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/Globals.cpp hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/Globals.h hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/Main.cpp hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/MapPoints.cpp Modified: hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/Globals.cpp =================================================================== --- hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/Globals.cpp 2009-07-08 23:02:12 UTC (rev 4014) +++ hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/Globals.cpp 2009-07-09 17:25:41 UTC (rev 4015) @@ -25,6 +25,8 @@ unsigned int verbose = 0; unsigned int resize_dimension = 800; unsigned int detector = 0; +unsigned int lens_type = 1; +double focal_length = 10; std::string path = ("output/"); //std::string path = (""); std::string format = (".jpg"); Modified: hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/Globals.h =================================================================== --- hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/Globals.h 2009-07-08 23:02:12 UTC (rev 4014) +++ hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/Globals.h 2009-07-09 17:25:41 UTC (rev 4015) @@ -8,6 +8,8 @@ extern unsigned int verbose; extern unsigned int resize_dimension; extern unsigned int detector; +extern unsigned int lens_type; +extern double focal_length; extern std::string path; extern std::string format; extern double sizefactor; Modified: hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/Main.cpp =================================================================== --- hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/Main.cpp 2009-07-08 23:02:12 UTC (rev 4014) +++ hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/Main.cpp 2009-07-09 17:25:41 UTC (rev 4015) @@ -308,8 +308,11 @@ cout << " -l <float> Minimum line length as a fraction of longest dimension. Default 0.3" << endl; cout << " -m <float> Sigma parameter for hourglass filter. Default 1.4" << endl; cout << " -r <float> Rho parameter for hourglass filter. Default 0.4" << endl; - cout << " -y <float> Corner threshold. Default 200" << endl; - cout << " -a <float> Lens HFoV in degrees. Default 140" << endl; + cout << " -y <float> Corner threshold. Default 200" << endl; + cout << " -q <float> Focal length. Default 10" << endl; + cout << " -k <int> Lens type. 1 = Rectilinear (default)" << endl; + cout << " 2 = Equal-area fisheye" << endl; + cout << " 3 = Equal-angle fisheye" << endl; cout << " -i <0|1> Generate intermediate images. Default 1" << endl; cout << " -v <0|1> Verbose. Default 0" << endl; cout << " -h Print usage." << endl; @@ -356,6 +359,8 @@ case 'y' : {corner_threshold = atof(argv[i]); break;} case 'l' : {length_threshold = atof(argv[i]); break;} case 'i' : {generate_images = atoi(argv[i]); break;} + case 'k' : {lens_type = atoi(argv[i]); break;} + case 'q' : {focal_length = atof(argv[i]); break;} case 'm' : {sigma = atof(argv[i]); break;} case 'r' : {rho = atof(argv[i]); break;} } Modified: hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/MapPoints.cpp =================================================================== --- hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/MapPoints.cpp 2009-07-08 23:02:12 UTC (rev 4014) +++ hugin/branches/gsoc2009_lenscalibration/src/lens_calibrate/MapPoints.cpp 2009-07-09 17:25:41 UTC (rev 4015) @@ -17,16 +17,44 @@ * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ - -#include "vigra/diff2d.hxx" + #include <iostream> #include <stdio.h> #include <math.h> #include "Globals.h" - -using namespace vigra; + using namespace std; + +typedef struct { + double x, y, z; +} XYZPoint; + +double magnitude(XYZPoint *Point1, XYZPoint *Point2){ + + XYZPoint Vector; + Vector.x = Point2->x - Point1->x; + Vector.y = Point2->y - Point1->y; + Vector.z = Point2->z - Point1->z; + return (double)sqrt( Vector.x * Vector.x + Vector.y * Vector.y + Vector.z * Vector.z); +} + +double DistancePointLine(XYZPoint *Point, XYZPoint *linestart, XYZPoint *lineend, double LineMag){ + + double U; + XYZPoint intersection; + U = ( ( ( Point->x - linestart->x ) * (lineend->x - linestart->x ) ) + + ( ( Point->y - linestart->y ) * (lineend->y - linestart->y ) ) + + ( ( Point->z - linestart->z ) * (lineend->z - linestart->z ) ) ) / + ( LineMag * LineMag ); + + intersection.x = linestart->x + U * (lineend->x - linestart->x); + intersection.y = linestart->y + U * (lineend->y - linestart->y); + intersection.z = linestart->z + U * (lineend->z - linestart->z); + + return magnitude(Point, &intersection); +} + void map_points(int w, int h){ /* @@ -46,18 +74,63 @@ */ // Covert degrees to radians - a = a / (180/M_PI); + // a is set on the command line + //a = a / (180/M_PI); - cout << "Mapping points..." << endl; - cout << "Width:\t" << w << endl << "Height:\t" << h << endl << "HFov:\t" << a << endl << endl; + string lens_name = ("Rectilinear"); + + double r = 1.5; + double u = r / focal_length; + double p2 = 1; + double p4 = 1; + double k = 2; + double R = u + p2 * (u*u) + p4 * (u*u*u*u); + + if (lens_type == 2){ + a = k * asin( R / k ); // for an equal-area type fisheye (design parameter k) + lens_name = ("Equal-area fisheye"); + }else if (lens_type == 3){ + a = R; // for a true equal-angle fisheye. + lens_name = ("Equal-angle fisheye"); + }else{ + a = atan( R ); // for a rectilinear lens + } + + cout << "Mapping points..." << endl; + cout << "Lens type:\t" << lens_name << endl; + cout << "Width:\t\t" << w << endl << "Height:\t\t" << h << endl << "a:\t\t" << a << endl << endl; - double u,v,z,s,x,y; + double v,z,s,x,y; for (unsigned int l = 0; l < lines.size(); l++){ cout << "Processing line " << l+1 << ":" << endl; + + XYZPoint LineStart, LineEnd; + + u = lines[l][0]->x; + v = lines[l][0]->y; + u += w/2; + v *= -1; + v += h/2; + s = sqrt((1 - z * z) / ( u * u + v * v )); + LineStart.x = -s * u; + LineStart.y = s * v; + LineStart.z = cos(a); - for (unsigned int i = 0; i < lines[l].size(); i++){ + u = lines[l][lines[l].size()]->x; + v = lines[l][lines[l].size()]->y; + u += w/2; + v *= -1; + v += h/2; + s = sqrt((1 - z * z) / ( u * u + v * v )); + LineEnd.x = -s * u; + LineEnd.y = s * v; + LineEnd.z = cos(a); + + double LineMag = magnitude(&LineEnd, &LineStart); + + for (unsigned int i = 1; i < lines[l].size()-1; i++){ u = lines[l][i]->x; v = lines[l][i]->y; @@ -67,13 +140,17 @@ u += w/2; v *= -1; v += h/2; - cout << u << "," << v << "\t=>\t"; + cout << u << "," << v << "\t=>\t"; - z = cos( a ); s = sqrt((1 - z * z) / ( u * u + v * v )); - x = -s * u; - y = s * v; - cout << x << "," << y << "," << z << endl; + XYZPoint Point; + Point.x = -s * u; + Point.y = s * v; + Point.z = cos(a); + + double distance = DistancePointLine(&Point, &LineStart, &LineEnd, LineMag); + + cout << x << "," << y << "," << z << "\tDistance:\t" << distance <<endl; } cout << endl; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |