1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 /* $Id: db_rob_image_homography.h,v 1.3 2011/06/17 14:03:31 mbansal Exp $ */
18 
19 #ifndef DB_ROB_IMAGE_HOMOGRAPHY
20 #define DB_ROB_IMAGE_HOMOGRAPHY
21 
22 #include "db_utilities.h"
23 #include "db_robust.h"
24 #include "db_metrics.h"
25 
26 #include <stdlib.h> // for NULL
27 
28 
29 /*****************************************************************
30 *    Lean and mean begins here                                   *
31 *****************************************************************/
32 /*!
33  * \defgroup LMRobImageHomography (LM) Robust Image Homography
34  */
35 /*\{*/
36 
37 #define DB_HOMOGRAPHY_TYPE_DEFAULT           0
38 #define DB_HOMOGRAPHY_TYPE_PROJECTIVE        0
39 #define DB_HOMOGRAPHY_TYPE_AFFINE            1
40 #define DB_HOMOGRAPHY_TYPE_SIMILARITY        2
41 #define DB_HOMOGRAPHY_TYPE_SIMILARITY_U      3
42 #define DB_HOMOGRAPHY_TYPE_TRANSLATION       4
43 #define DB_HOMOGRAPHY_TYPE_ROTATION          5
44 #define DB_HOMOGRAPHY_TYPE_ROTATION_U        6
45 #define DB_HOMOGRAPHY_TYPE_SCALING           7
46 #define DB_HOMOGRAPHY_TYPE_S_T               8
47 #define DB_HOMOGRAPHY_TYPE_R_T               9
48 #define DB_HOMOGRAPHY_TYPE_R_S              10
49 #define DB_HOMOGRAPHY_TYPE_CAMROTATION      11
50 #define DB_HOMOGRAPHY_TYPE_CAMROTATION_F    12
51 #define DB_HOMOGRAPHY_TYPE_CAMROTATION_F_UD 13
52 
53 /*!
54 Solve for homography H such that xp~Hx
55 \param H    best homography
56 
57 2D point to 2D point constraints:
58 
59 \param im           first image points
60 \param im_p         second image points
61 \param nr_points    number of points
62 
63 Calibration matrices:
64 
65 \param K    first camera
66 \param Kp   second camera
67 
68  Temporary space:
69 
70  \param temp_d      pre-allocated space of size 12*nr_samples+10*nr_points doubles
71  \param temp_i      pre-allocated space of size max(nr_samples,nr_points) ints
72 
73  Statistics for this estimation
74 
75  \param stat        NULL - do not compute
76 
77  \param homography_type see DB_HOMOGRAPHY_TYPE_* definitions above
78 
79  Estimation parameters:
80 
81  \param max_iterations  max number of polishing steps
82  \param max_points      only use this many points
83  \param scale           Cauchy scale coefficient (see db_ExpCauchyReprojectionError() )
84  \param nr_samples      number of times to compute a hypothesis
85  \param chunk_size      size of cost chunks
86 */
87 DB_API void db_RobImageHomography(
88                               /*Best homography*/
89                               double H[9],
90                               /*2DPoint to 2DPoint constraints
91                               Points are assumed to be given in
92                               homogenous coordinates*/
93                               double *im,double *im_p,
94                               /*Nr of points in total*/
95                               int nr_points,
96                               /*Calibration matrices
97                               used to normalize the points*/
98                               double K[9],
99                               double Kp[9],
100                               /*Pre-allocated space temp_d
101                               should point to at least
102                               12*nr_samples+10*nr_points
103                               allocated positions*/
104                               double *temp_d,
105                               /*Pre-allocated space temp_i
106                               should point to at least
107                               max(nr_samples,nr_points)
108                               allocated positions*/
109                               int *temp_i,
110                               int homography_type=DB_HOMOGRAPHY_TYPE_DEFAULT,
111                               db_Statistics *stat=NULL,
112                               int max_iterations=DB_DEFAULT_MAX_ITERATIONS,
113                               int max_points=DB_DEFAULT_MAX_POINTS,
114                               double scale=DB_POINT_STANDARDDEV,
115                               int nr_samples=DB_DEFAULT_NR_SAMPLES,
116                               int chunk_size=DB_DEFAULT_CHUNK_SIZE,
117                               ///////////////////////////////////////////////////
118                               // flag for the outlier removal
119                               int outlierremoveflagE = 0,
120                               // if flag is 1, then the following variables
121                               // need to input
122                               ///////////////////////////////////////////////////
123                               // 3D coordinates
124                               double *wp=NULL,
125                               // its corresponding stereo pair's points
126                               double *im_r=NULL,
127                               // raw image coordinates
128                               double *im_raw=NULL, double *im_raw_p=NULL,
129                               // final matches
130                               int *final_NumE=0);
131 
132 DB_API double db_RobImageHomography_Cost(double H[9],int point_count,double *x_i,
133                                                 double *xp_i,double one_over_scale2);
134 
135 
136 DB_API void db_RobCamRotation_Polish(double H[9],int point_count,double *x_i,
137                                      double *xp_i, double one_over_scale2,
138                                      int max_iterations=DB_DEFAULT_MAX_ITERATIONS,
139                                      double improvement_requirement=DB_DEFAULT_IMP_REQ);
140 
141 
142 DB_API void db_RobCamRotation_Polish_Generic(double H[9],int point_count,int homography_type,
143                                              double *x_i,double *xp_i,double one_over_scale2,
144                                              int max_iterations=DB_DEFAULT_MAX_ITERATIONS,
145                                              double improvement_requirement=DB_DEFAULT_IMP_REQ);
146 
147 
148 #endif /* DB_ROB_IMAGE_HOMOGRAPHY */
149