| /* |
| * 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 */ |