前几天在做一个摄像头的程序,由于镜头本身是超广角的,所以出来的图像畸变很严重,影像了识别,所以查阅了一番资料,写了一个简单的畸变处理算法,如下:
class procedure TPic.CorrectLensDistortion(const ABitmap: TBitmap; const k1, k2: Single);
var
x, y, cx, cy: Integer;
u, v, r2, r4, radial_distortion: Double;
SrcColor: TAlphaColor;
CorrectedBitmap: TBitmap;
DistortionCache: array of TPointF;
SrcData, DstData: TBitmapData;
begin
if not Assigned(ABitmap) then exit;
CorrectedBitmap := TBitmap.Create(ABitmap.Width, ABitmap.Height);
try
cx := ABitmap.Width div 2;
cy := ABitmap.Height div 2;
SetLength(DistortionCache, ABitmap.Width * ABitmap.Height);
// 预计算畸变缓存
for y := 0 to ABitmap.Height - 1 do
begin
for x := 0 to ABitmap.Width - 1 do
begin
u := (x - cx) / cx;
v := (y - cy) / cy;
r2 := u * u + v * v;
r4 := r2 * r2;
radial_distortion := 1 &