8 #ifndef LENS_DISTORTION_PROCEDURE_H
9 #define LENS_DISTORTION_PROCEDURE_H
11 #include "../ami_primitives/point2d.h"
12 #include "../ami_lens_distortion/lens_distortion_model.h"
13 #include "../ami_primitives/line_points.h"
14 #include "../ami_image/image.h"
19 vector< line_points > &lines ,
22 int build_l1r_quotient_vector(std::vector<double> &l1r,
23 double max_distance_corner,
double *a,
int Na);
41 const double &image_amplification_factor
44 int width0=input_image.width();
45 int height0=input_image.height();
46 int size =width0*height0;
47 int width=width0,height=height0;
60 double max_distance_corner= (ldm_centre-corner).norm();
62 double distance_corner=(ldm_centre-corner).norm();
63 if(distance_corner>max_distance_corner) max_distance_corner=distance_corner;
65 distance_corner=(ldm_centre-corner).norm();
66 if(distance_corner>max_distance_corner) max_distance_corner=distance_corner;
68 distance_corner=(ldm_centre-corner).norm();
69 if(distance_corner>max_distance_corner) max_distance_corner=distance_corner;
77 vector<double> d1=d.
get_d();
79 if(d1.size()<2) {output_image=input_image;
return(output_image);}
80 a=(
double*)malloc(
sizeof(
double)*(Na+1));
82 for(
int i=1;i<(int)d1.size();i++){a[2*i-1]=0.; a[2*i]=d1[i]; }
84 while(a[cont2]==0){ cont2--;
if (cont2 == 0)
break;}
89 max_distance_corner=max_distance_corner/(d1[0]+d1[1]*max_distance_corner*max_distance_corner);
92 max_distance_corner=max_distance_corner/(d1[0]+d1[1]*max_distance_corner*max_distance_corner+
93 d1[2]*max_distance_corner*max_distance_corner*max_distance_corner*max_distance_corner);
97 if(build_l1r_quotient_vector(l1r,max_distance_corner,a,Na)<0){
98 output_image=input_image;
103 l1r.
resize((
int)(max_distance_corner+1.5));
106 for(
int m=1;m<(int)l1r.size();m++){
109 for(
int i=0;i<1000;i++){
113 for(
int k=1;k<(int)d1.size();k++){
121 for(
int k=1;k<(int)d1.size();k++){
125 double f_r0_h=(r0+h)/sum;
126 double derivative=(f_r0_h-f_r0)/h;
128 double r1=r0-(f_r0-m)/derivative;
129 if(fabs(r0-r1)<fabs(r0)*1e-5){
144 if(image_amplification_factor==1.){
146 scale=(temp2-ldm_centre ).norm()/ldm_centre.norm();
149 double scale2=(temp2-ldm_centre ).norm()/ldm_centre.norm();
151 if(scale2<scale) scale=scale2;
154 scale2=(temp2-ldm_centre ).norm()/ldm_centre.norm();
156 if(scale2<scale) scale=scale2;
159 scale2=(temp2-ldm_centre ).norm()/ldm_centre.norm();
161 if(scale2<scale) scale=scale2;
164 printf(
"scale=%lf\n",scale);
167 t.
x=(scale*ldm_centre.
x-ldm_centre.
x);
168 t.
y=(scale*ldm_centre.
y-ldm_centre.
y);
170 else if(image_amplification_factor==2.){
172 scale=(temp2-ldm_centre ).norm()/(ldm_centre.
x);
175 double scale2=(temp2-ldm_centre ).norm()/(ldm_centre.
x);
177 if(scale2<scale) scale=scale2;
179 printf(
"scale=%lf\n",scale);
182 t.
x=(scale*ldm_centre.
x-ldm_centre.
x);
183 t.
y=(scale*ldm_centre.
y-ldm_centre.
y);
187 scale=(temp2-ldm_centre ).norm()/(ldm_centre.
y);
190 double scale2=(temp2-ldm_centre ).norm()/(ldm_centre.
y);
192 if(scale2<scale) scale=scale2;
194 printf(
"scale=%lf\n",scale);
197 t.
x=(scale*ldm_centre.
x-ldm_centre.
x);
198 t.
y=(scale*ldm_centre.
y-ldm_centre.
y);
203 #pragma omp parallel for \
204 shared(width,height,width0,height0,output_image,input_image,size)\
210 for(i=0;i<height;i++){
211 for(j=0;j<width;j++){
213 double distance_centre= (ldm_centre-temp).norm();
216 int ind=(int)distance_centre;
217 if(ind>=(
int)l1r.size())
continue;
218 double dl1r=l1r[ind]+(distance_centre-ind)*(l1r[ind+1]-l1r[ind]);
221 p.
x=ldm_centre.
x+(temp.x-ldm_centre.
x)*dl1r;
222 p.
y=ldm_centre.
y+(temp.y-ldm_centre.
y)*dl1r;
228 if(0<=m && m<height0 && 0<=n && n<width0)
233 unsigned int k=i*width+j;
234 unsigned int k0=m*width0+n;
237 double w=((1.-di)*(1.-dj));
239 accum+=(double)w*input_image[k0+n2];
243 if( (di*(1.-dj))>0. && (m+1)<height0)
247 accum+=(double)w*input_image[k0+n2];
250 if( ((1-di)*(dj))>0. && (n+1)<width0)
254 accum+=(double)w*input_image[k0+n2];
257 if( ((di)*(dj))>0. && (n+1)<width0 && (m+1)<height0)
261 accum+=(double)w*input_image[k0+n2];
264 if(w_accum>0.) output_image[k+n2]=(U) (accum/w_accum);
270 return(output_image);
class to store together a collection of aligned points and line equation and basic method ...
Definition: line_points.h:40
image< T > const resize(const int width, const int height) const
Definition: image.h:871
point2d< double > & get_distortion_center()
This function returns the center of the lens distortion model.
Definition: lens_distortion_model.h:82
Class to store distortion model and basic methods.
Definition: lens_distortion_model.h:38
T x
Definition: point2d.h:37
T y
Definition: point2d.h:38
std::vector< double > & get_d()
This function returns the vector with the lens distortion model parameters.
Definition: lens_distortion_model.h:52
Class to store multiChannel images and basic methods.
Definition: image.h:65