Hello everyone,
I was looking for a Julia package with a function to undistort image points like Matlab’s undistortPoints(), and since I couldn’t find any, I am currently trying to code a function myself.I already have a intrinsic matrix and distortion coefficients.
From Park et al, I got that:
[Xu] = [Xd][1+R^2k1 + R^4*k2] with R = sqrt(xd^2 + yd^2)
Xu are the undistorted points;
Xd are the distorted points.
I realize that the coordinates Xd must be normalized as:
Xn = (Xd-pp)/f
pp are the principal point coordinates;
f is the focal length.
And that the Xu results must be unnormalized later.
I wrote the code below, but results are not ok. I don’t know what is wrong, or maybe I got this completly wrong and it is much complicated than this. Any help or pointing to a more in depth documentation of how to do this is appreciated.
points = [10 23; 100 100.3; 23.1 20.5] #distorted points
nPoints = 3
fx = 517.3 #focal point
fy = 516.5
ppx = 318.6 #principal point
ppy = 244.3
k1 = 0.2624 #distortion coefficients
k2 = -0.9531
function Normalise(x,y,ppx,ppy,fx,fy)
xn = (x-ppx)/fx
yn = (y-ppy)/fy
return xn,yn
end
function UndistortPoints(points,k1,k2)
XYu = Array{Float64,2}(undef,nPoints,2) #initialize empty undistorted points array
for i in 1:nPoints
xd = points[i,1] #distorted points
yd = points[i,2]
xdn,ydn = Normalise(xd,yd,ppx,ppy,fx,fy) #normalized distorted points
Rd = sqrt(xdn^2+ydn^2) #distance from point to principal point
xun = xdn*(1 + (Rd^2)*k1 + (Rd^4)*k2) #undistorted points
yun = ydn*(1 + (Rd^2)*k1 + (Rd^4)*k2)
XYu[i,1] = xun*fx + ppx #unnormalized undistorted points
XYu[i,2] = yun*fy + ppy
end
return XYu
end
UndistortPoints(points,k1,k2)
Results are:
3×2 Matrix{Float64}:
51.9125 53.0559
98.9849 99.6313
57.6659 46.6789