根据相机标定模型,创建虚拟数据点进行相机标定实验
dev_close_window ()
read_image (Image, 'calib/calib-3d-coord-01')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, 768, 576, 'black', WindowHandle)
*调节下面四个参数实验
*物距
UVal:=120.0
*像距
VVal:=5
*点间隔
GridVal:=5
*畸变系数(调节畸变系数看畸变情况)
KVal:=-2e-7
*焦距
FVal:=1.0/(1.0/UVal+1.0/VVal[0])
*假设世界坐标系和相机坐标系方向一致,且只在Z轴存在平移关系
WorldX:=Width*0.1
WorldY:=Height*0.1
PixW:=Width*1.0
PixH:=Height*1.0
Sx:=WorldX*FVal/UVal/PixW
Sy:=Sx
tuple_int(WorldX/GridVal,xnum)
tuple_int(WorldY/GridVal,ynum)
NX:=[]
NY:=[]
NZ:=[]
*畸变前后坐标
RowSrc:=[]
ColSrc:=[]
Rows:=[]
Cols:=[]
TotalNum:=xnum*ynum
*生成畸变数据
for i:=0 to ynum-1 by 1
for j:=0 to xnum-1 by 1
*居中
TempNx:=-GridVal*(xnum-1)*0.5+j*GridVal
TempNy:=-GridVal*(ynum-1)*0.5+i*GridVal
NX:=[NX,TempNx]
NY:=[NY,TempNy]
NZ:=[NZ,0]
*注意转换到图像坐标系
TempRow:=TempNy*FVal/UVal/Sy+PixH*0.5
TempCol:=TempNx*FVal/UVal/Sx+PixW*0.5
RowSrc:=[RowSrc,TempRow]
ColSrc:=[ColSrc,TempCol]
*畸变坐标
TempRow:=TempRow-PixH*0.5
TempCol:=TempCol-PixW*0.5
r2:=TempRow*TempRow+TempCol*TempCol
tuple_sqrt(1.0-4.0*KVal*r2,val)
TempRow:=2.0/(1.0+val)*TempRow+PixH*0.5
TempCol:=2.0/(1.0+val)*TempCol+PixW*0.5
Rows:=[Rows,TempRow]
Cols:=[Cols,TempCol]
endfor
endfor
gen_region_points (Region, RowSrc, ColSrc)
gen_region_points (Region1, Rows, Cols)
dilation_circle (Region, RegionDilation, 5)
dilation_circle (Region1, RegionDilation1, 5)
dev_set_color('red')
dev_display (RegionDilation)
dev_set_color('blue')
dev_display (RegionDilation1)
stop()
StartCamPar := [FVal,0,Sx,Sy,PixW*0.5,PixH*0.5,PixW,PixH]
vector_to_pose (NX, NY, NZ, RowSrc, ColSrc, StartCamPar, 'iterative', 'error', NStartPose, Quality)
camera_calibration (NX, NY, NZ, Rows, Cols, StartCamPar, NStartPose, 'all', CamParam, NFinalPose, Errors)
camparaout:=CamParam
camparaout[1]:=0
* 径向畸变映射图
gen_radial_distortion_map (Map, CamParam, camparaout, 'bilinear')
region_to_bin (RegionDilation1, BinImage, 255, 0, Width, Height)
map_image (BinImage, Map, ImageMapped)
dev_display (ImageMapped)
dev_display(RegionDilation)
效果