diff options
Diffstat (limited to 'jni/feature_stab/db_vlvm/db_image_homography.h')
-rw-r--r-- | jni/feature_stab/db_vlvm/db_image_homography.h | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/jni/feature_stab/db_vlvm/db_image_homography.h b/jni/feature_stab/db_vlvm/db_image_homography.h new file mode 100644 index 000000000..165447dd7 --- /dev/null +++ b/jni/feature_stab/db_vlvm/db_image_homography.h @@ -0,0 +1,183 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id: db_image_homography.h,v 1.2 2011/06/17 14:03:31 mbansal Exp $ */ + +#ifndef DB_IMAGE_HOMOGRAPHY +#define DB_IMAGE_HOMOGRAPHY + + + +/***************************************************************** +* Lean and mean begins here * +*****************************************************************/ + +#include "db_framestitching.h" +/*! + * \defgroup LMImageHomography (LM) Image Homography Estimation (feature based) + */ +/*\{*/ +/*! +Solve for projective H such that xp~Hx. Prior normalization is not necessary, +although desirable for numerical conditioning +\param H image projective (out) +\param x1 image 1 point 1 +\param x2 image 1 point 2 +\param x3 image 1 point 3 +\param x4 image 1 point 4 +\param xp1 image 2 point 1 +\param xp2 image 2 point 2 +\param xp3 image 2 point 3 +\param xp4 image 2 point 4 +*/ +DB_API void db_StitchProjective2D_4Points(double H[9], + double x1[3],double x2[3],double x3[3],double x4[3], + double xp1[3],double xp2[3],double xp3[3],double xp4[3]); + +/*! +Solve for affine H such that xp~Hx. Prior normalization is not necessary, +although desirable for numerical conditioning +\param H image projective (out) +\param x1 image 1 point 1 +\param x2 image 1 point 2 +\param x3 image 1 point 3 +\param xp1 image 2 point 1 +\param xp2 image 2 point 2 +\param xp3 image 2 point 3 +*/ +DB_API void db_StitchAffine2D_3Points(double H[9], + double x1[3],double x2[3],double x3[3], + double xp1[3],double xp2[3],double xp3[3]); + +/*! +Solve for rotation R such that xp~Rx. +Image points have to be of unit norm for the least squares to be meaningful. +\param R image rotation (out) +\param x1 image 1 point 1 +\param x2 image 1 point 2 +\param xp1 image 2 point 1 +\param xp2 image 2 point 2 +*/ +inline void db_StitchCameraRotation_2Points(double R[9], + /*Image points have to be of unit norm + for the least squares to be meaningful*/ + double x1[3],double x2[3], + double xp1[3],double xp2[3]) +{ + double* x[2]; + double* xp[2]; + double scale,t[3]; + + x[0]=x1; + x[1]=x2; + xp[0]=xp1; + xp[1]=xp2; + db_StitchSimilarity3DRaw(&scale,R,t,xp,x,2,1,0,1,0); +} + +/*! +Solve for a homography H generated by a rotation R with a common unknown focal length f, i.e. +H=diag(f,f,1)*R*diag(1/f,1/f,1) such that xp~Hx. +If signed_disambiguation is true, the points are +required to be in front of the camera. No specific normalization of the homogenous points +is required, although it could be desirable to keep x1,x2,xp1 and xp2 of reasonable magnitude. +If a solution is obtained the function returns 1, otherwise 0. If the focal length is desired +a valid pointer should be passed in f +*/ +DB_API int db_StitchRotationCommonFocalLength_3Points(double H[9],double x1[3],double x2[3],double x3[3], + double xp1[3],double xp2[3],double xp3[3],double *f=0,int signed_disambiguation=1); + +/*! +Find scale, rotation and translation of the similarity that +takes the nr_points inhomogenous 2D points X to Xp, +i.e. for the homogenous equivalents +Xp and X we would have +\code +Xp~ +[sR t]*X +[0 1] +\endcode +If orientation_preserving is true, R is restricted such that det(R)>0. +allow_scaling, allow_rotation and allow_translation allow s,R and t +to differ from 1,Identity and 0 + +Full similarity takes the following on 550MHz: +\code +0.9 microseconds with 2 points +1.0 microseconds with 3 points +1.1 microseconds with 4 points +1.3 microseconds with 5 points +1.4 microseconds with 6 points +1.7 microseconds with 10 points +9 microseconds with 100 points +130 microseconds with 1000 points +1.3 milliseconds with 10000 points +35 milliseconds with 100000 points +350 milliseconds with 1000000 points +\endcode + +Without orientation_preserving: +\code +3 points is minimal for (s,R,t) (R,t) +2 points is minimal for (s,t) (s,R) (R) +1 point is minimal for (s) (t) +\endcode + +With orientation_preserving: +\code +2 points is minimal for (s,R,t) (R,t) (s,t) +1 point is minimal for (s,R) (R) (s) (t) +\endcode +\param scale (out) +\param R 2D rotation (out) +\param t 2D translation (out) +\param Xp (nr_points x 2) pointer to array of image points +\param X (nr_points x 2 ) pointer to array of image points +\param nr_points number of points +\param orientation_preserving +\param allow_scaling compute scale (if 0, scale=1) +\param allow_rotation compute rotation (if 0, R=[I]) +\param allow_translation compute translation (if 0 t = [0,0]') +*/ +DB_API void db_StitchSimilarity2DRaw(double *scale,double R[4],double t[2], + double **Xp,double **X,int nr_points,int orientation_preserving=1, + int allow_scaling=1,int allow_rotation=1,int allow_translation=1); +/*! +See db_StitchRotationCommonFocalLength_3Points(). +\param H Image similarity transformation (out) +\param Xp (nr_points x 2) pointer to array of image points +\param X (nr_points x 2) pointer to array of image points +\param nr_points number of points +\param orientation_preserving +\param allow_scaling compute scale (if 0, scale=1) +\param allow_rotation compute rotation (if 0, R=[I]) +\param allow_translation compute translation (if 0 t = [0,0]') +*/ +inline void db_StitchSimilarity2D(double H[9],double **Xp,double **X,int nr_points,int orientation_preserving=1, + int allow_scaling=1,int allow_rotation=1,int allow_translation=1) +{ + double s,R[4],t[2]; + + db_StitchSimilarity2DRaw(&s,R,t,Xp,X,nr_points,orientation_preserving, + allow_scaling,allow_rotation,allow_translation); + + H[0]=s*R[0]; H[1]=s*R[1]; H[2]=t[0]; + H[3]=s*R[2]; H[4]=s*R[3]; H[5]=t[1]; + db_Zero2(H+6); + H[8]=1.0; +} +/*\}*/ +#endif /* DB_IMAGE_HOMOGRAPHY */ |