I managed to understand the code from math.c (this is what I call 
unreadable code), but all the other questions are still open.

понедельник, 15 октября 2012 г., 19:15:37 UTC+6 пользователь lireful 
написал:
>
> Hello,
>
> I've read a lot on the PanoTools lens correction model in this user group 
> and over the Internet, however I still have a lot of questions. All its 
> disadvantages were discussed several times, but I could not a detailed 
> description of the mechanism itself.
>
> I have calibrated a fisheye lens using Kannala model, which is basically a 
> polynomial R(theta), where R is the polar coordinates radius of current 
> point. Now I have a need to work with this calibration in PTGui. We use 
> Canon APS-C matrix crop-factor 1.62, 4272x2848 matrix in the landscape 
> mode, 8 mm Sigma fisheyes.
>
> I need to express PanoTools model as a function R(theta). To accomplish 
> this, I can iterate all possible thetas in the [0, pi/2] range and find the 
> radius R, corresponding to it. This is how I do it:
> 1) calculate undistorted equidistant radius (used both by Panotools and 
> PTGui, not by Hugin, right?) R_undist = f*theta*m  as undistorted radius in 
> pixels. I take m as a mm-to-pixel conversion factor from camera 
> specification: matrix width is 22.2 mm = 4272 pixels.
> 2) convert it to PTGui units using the condition r=1 when r=width/2 (this 
> is taken from PTGui documentation). r = R_undist  / (width/2).
> 3) solve quartic equation in PTGui units: a*r^4 + b*r^3 + c*r^2 + 
> (1-a-b-c)*r - Rundist = 0 , which gives us r - the distorted radius
> 4) convert distorted radius to pixels: r_dist_px = r_dist*(width/2), so we 
> have a r(theta) mapping.
>
> For backprojection theta(R) we have to do the same it the opposite 
> direction:
> 1) Convert R to PTGui units: r = R/(width/2)
> 2) Apply the undistorting polynomial: r_undist = 
> a*r^4+b*r^3+c^r*2+(1-a-b-c)*r
> 3) Convert r_undist back to pixels, and then to mm : r_undist_mm = 
> r_undist*(width/2)/m
> 4) Taking f*theta model into account, return r_undist_mm / f as a 
> backprojection angle theta.
>
> This looks logical, but doesn't work. The radiuses don't get distorted and 
> undistorted as expected. I've also found this intriguing code in math.c of 
> libpano13. Why are the coefficients used with r, and not polynomially? The 
> same thing can be found in "inv_radial" function, where the polynomial is 
> solved. Maybe I misunderstand the whole model?
>
> int radial( double x_dest, double y_dest, double* x_src, double* y_src, 
>> void* params)
>> {
>> // params: double coefficients[4], scale, correction_radius
>> register double r, scale;
>> r = (sqrt( x_dest*x_dest + y_dest*y_dest )) / ((double*)params)[4]; // r 
>> = r_px/scale
>> if( r < ((double*)params)[5] )
>> {
>> scale = ((((double*)params)[3] * r + ((double*)params)[2]) * r + 
>> ((double*)params)[1]) * r + ((double*)params)[0];                // scale 
>> = a*r+b*r+c*r+d
>> }
>> else
>> scale = 1000.0;
>>
>> *x_src = x_dest * scale  ;                                            
>> *y_src = y_dest * scale  ;
>>     return 1;
>> }
>
>
>
> I've also tried to understand the conversion from fov to f and back. This 
> is what Joost, the author of PTGui, exactly told me:
>
>> Yes PTGui still uses the f*theta projection.
>> This is how PTGui calculates the horz fov:
>>         hfov=4*RAD2DEG*asin(cropwidth_**mm/4.0/focallength);
>> cropwidth_mm is the diameter of the cropping circle, or the width of the 
>> image.
>> I realize that this is not consistent with the equidistant formula but it 
>> does match the fov for practical lenses.
>
>
> However, when I use the diameter of crop circle as cropwidth_**mm (4500 
> px in my case), it doesn't work correctly. I empirically found, that the 
> mistake is linear, and the correct conversion formula is  f = 
> 0.967555562*D/(4*m*sin(radians(fov)/4)) or 
> hfov=4*asin(0.967555562*D/(4*m*focallength)), 
> where D is the crop width in pixels, m the scale coefficient desribed 
> earlier. The fact that the mistake is linear makes me think I use a 
> different value of m? Or maybe it's more complicated.
>
> I've contacted the author of PTGui himself, he has answered some of my 
> questions, but was not willing to solve the problems, so I decided to try 
> to get advice in this group. 
>
> Thanks in advance for any help, 
> Lire
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Hugin and other free panoramic software" group.
A list of frequently asked questions is available at: 
http://wiki.panotools.org/Hugin_FAQ
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at http://groups.google.com/group/hugin-ptx

Reply via email to