关于鱼眼图像的校正算法,本人已经得出算法. (42分)

  • 主题发起人 主题发起人 amakusa
  • 开始时间 开始时间
A

amakusa

Unregistered / Unconfirmed
GUEST, unregistred user!
使用鱼眼镜头拍摄的鱼眼图像的校正算法,或者具体原理.
我过年喝多了,一高兴把分都发了,分数不够暂欠!
//----------------------------------------
1.鱼眼镜头产生的鱼眼图像的水平视距达183度,这样保证校正后的图像可以有重叠的部分.
2.对鱼眼图像按象素宽度被180度除后,所得到的数值为每条弧线的角度,再对每条弧线拉伸为直线后缩放为目标图像高度后排列,这样可实现对鱼眼图像的校正.
原理分析图


现在知道原理了,但是基础算法我忘差不多了.
希望高手指点!
卷哥哥,给个答案啊~
//-------------------------------------
根据上面的原理图生成的校正图再次错误 看来还是停留再理论研究阶段 :(
//-------------------------------------
2002.3.22
再次更新,理论方面完全通过 即日即可产生算法
2002.3.27
经过尽三个月的研究(三个月内几乎没学别的),在今天上午我的第七个算法成立了.
谢谢大家不关心我的问题,以至于只有靠我自己独立解决问题,再次感谢.
 
提供给你图象鱼眼算法,自己看了。。。。。。

procedure FishEye(var Bmp, Dst: TBitmap; Amount: Extended);
var
xmid,ymid : Single;
fx,fy : Single;
r1, r2 : Single;
ifx, ify : integer;
dx, dy : Single;
rmax : Single;
ty, tx : Integer;
weight_x, weight_y : array[0..1] of Single;
weight : Single;
new_red, new_green : Integer;
new_blue : Integer;
total_red, total_green : Single;
total_blue : Single;
ix, iy : Integer;
sli, slo : PByteArray;
begin
xmid := Bmp.Width/2;
ymid := Bmp.Height/2;
rmax := Dst.Width * Amount;
for ty := 0 to Dst.Height - 1 do begin
for tx := 0 to Dst.Width - 1 do begin
dx := tx - xmid;
dy := ty - ymid;
r1 := Sqrt(dx * dx + dy * dy);
if r1 = 0 then begin
fx := xmid;
fy := ymid;
end
else begin
r2 := rmax / 2 * (1 / (1 - r1/rmax) - 1);
fx := dx * r2 / r1 + xmid;
fy := dy * r2 / r1 + ymid;
end;
ify := Trunc(fy);
ifx := Trunc(fx);
// Calculate the weights.
if fy >= 0 then begin
weight_y[1] := fy - ify;
weight_y[0] := 1 - weight_y[1];
end else begin
weight_y[0] := -(fy - ify);
weight_y[1] := 1 - weight_y[0];
end;
if fx >= 0 then begin
weight_x[1] := fx - ifx;
weight_x[0] := 1 - weight_x[1];
end else begin
weight_x[0] := -(fx - ifx);
Weight_x[1] := 1 - weight_x[0];
end;
if ifx < 0 then
ifx := Bmp.Width-1-(-ifx mod Bmp.Width)
else if ifx > Bmp.Width-1 then
ifx := ifx mod Bmp.Width;
if ify < 0 then
ify := Bmp.Height-1-(-ify mod Bmp.Height)
else if ify > Bmp.Height-1 then
ify := ify mod Bmp.Height;
total_red := 0.0;
total_green := 0.0;
total_blue := 0.0;
for ix := 0 to 1 do begin
for iy := 0 to 1 do begin
if ify + iy < Bmp.Height then
sli := Bmp.scanline[ify + iy]
else
sli := Bmp.scanline[Bmp.Height - ify - iy];
if ifx + ix < Bmp.Width then begin
new_red := sli[(ifx + ix)*3];
new_green := sli[(ifx + ix)*3+1];
new_blue := sli[(ifx + ix)*3+2];
end
else begin
new_red := sli[(Bmp.Width - ifx - ix)*3];
new_green := sli[(Bmp.Width - ifx - ix)*3+1];
new_blue := sli[(Bmp.Width - ifx - ix)*3+2];
end;
weight := weight_x[ix] * weight_y[iy];
total_red := total_red + new_red * weight;
total_green := total_green + new_green * weight;
total_blue := total_blue + new_blue * weight;
end;
end;
slo := Dst.scanline[ty];
slo[tx*3] := Round(total_red);
slo[tx*3+1] := Round(total_green);
slo[tx*3+2] := Round(total_blue);
end;
end;
end;
 
我是想把一张鱼眼图片转换成正方图片哦请求算法
 
没辙了。
就象一幅马赛克图片一样, 你想要消除马赛克,是很难的;反之为其加载马赛克倒是简单的很!
一样的道理哦。
 
我印象上有一种算法是 求校正后的图象上的象素在鱼眼图像上的位置 可惜公式不会啊
 
我也记得,就是想不起来了;
等我找找。
 
我觉得不太可行,因为变成鱼眼后的图像,再变回来,图像的上边缘部分和下边缘,
几乎都是空白的。
 
接受答案了.
 
这个问题怎么还没有答案呢

哪位大侠给出答案,我也出150分数
 
已经有答案了 我自己做出来了
 
老兄,制作出来也不共享一下,你要多少分,能给一份看看吗,研究一下;

或许我有更好的创意呢

aohoo@163.com
 
呵呵
要有职业道德
 
这也真是的,那你说源码要多少人民币呢

在论坛上人家为你出谋划策,也是交流
 

Similar threads

D
回复
0
查看
926
DelphiTeacher的专栏
D
D
回复
0
查看
880
DelphiTeacher的专栏
D
D
回复
0
查看
853
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
I
回复
0
查看
634
import
I
后退
顶部