for i=1:h %从理想图像矩阵出发处理
for j=1:w
x=[1,j-og(1),i-og(2),(j-og(1))^2,(i-og(2))*(j-og(1)),(i-og(2))^2]
u=x*a0+og(2) % 逆向映射(j,i)到畸变图像矩阵(v,u)
v=x*b0+og(1)
if (u>1)&&(u<w)&&(v>1)&&(v<h) %处理在图像大小范围内的像素点
uu=floor(u) %对u取整
vv=floor(v) %对v取整
arf=u-uu%计算上面提到的
bta=v-vv%计算上面提到的
for k=1:3 %进行灰度双线性插值
ft1=(1-bta)*b(vv,uu,k)+bta*b(vv+1,uu,k)
ft2=(1-bta)*b(vv,uu+1,k)+bta*b(vv+1,uu+1,k)
sp(i,j,k)=(1-arf)*ft1+arf*ft2
end
end
imshow(uint8(sp)) %显示校正图像
3个for加一个if,可只有2个end,程序都没写完当然出错。
——————————————————————————————————
然后还有这一段
for k=1:n%转换到以对称点为原点的空间关系并构造矩阵A
A(k)=[1,gm(k,1)-og(1),gm(k,2)-og(2),(gm(k,1)-og(1)^2), (gm(k,1)-og(1))*(gm(k,2)-og(2)),(gm(k,2)-og(2) ^2)]
end
A(k)是一个元素,可你却把它定义为一个数组,肯定也要出错。
————————————————————————————————
你要我改,我只能保证程序能运行,但对不对我无法保证。
function gmodify(pic,uv,gm,og) %pic表示要处理的图像的路径文件名
%uv是一个二维矩阵,uv(:,1)代表上面提到的,uv(:,2)表示
%gm是一个二维矩阵,gm(j,:)代表在校正图空间上与uv(j,:)一一应的点
%og 代表对称中心,它是一个二维向量
a=imread(pic)
b=double(a)
n=size(gm(:,1))
for k=1:n%转换到以对称点为原点的空间关系并构造矩阵A
A(k,:)=[1,gm(k,1)-og(1),gm(k,2)-og(2),(gm(k,1)-og(1)^2), (gm(k,1)-og(1))*(gm(k,2)-og(2)),(gm(k,2)-og(2) ^2)]
end
[h,w]=size(b(:,:,1))
sp=zeros(h,w,3)+255
a0=pinv(A)* uv(:,2) %计算上面提到的地址映射的系数估计a
b0=pinv(A)* uv(:,1) %计算上面中提到的地址映射的系数估计b
for i=1:h %从理想图像矩阵出发处理
for j=1:w
x=[1,j-og(1),i-og(2),(j-og(1))^2,(i-og(2))*(j-og(1)),(i-og(2))^2]
u=x*a0+og(2) % 逆向映射(j,i)到畸变图像矩阵(v,u)
v=x*b0+og(1)
if (u>1)&&(u<w)&&(v>1)&&(v<h) %处理在图像大小范围内的像素点
uu=floor(u) %对u取整
vv=floor(v) %对v取整
arf=u-uu%计算上面提到的
bta=v-vv%计算上面提到的
for k=1:3 %进行灰度双线性插值
ft1=(1-bta)*b(vv,uu,k)+bta*b(vv+1,uu,k)
ft2=(1-bta)*b(vv,uu+1,k)+bta*b(vv+1,uu+1,k)
sp(i,j,k)=(1-arf)*ft1+arf*ft2
end
end
end
end
imshow(uint8(sp)) %显示校正图像
0. A4纸打印出来(或直接在手机上)并用尺子测量一个格的边长。
1.用想要标定的相机拍摄各种角度的照片。(我用的是电脑相机拍摄手机上的图片,手机上全屏的图片用尺子测量的是小格子的边长为7mm),15到20张即可。
2.打开matlab命令行输入cameraCalibrator回车。点Add images,导入所拍的照片,改为7mm,确定。
3.点击Options,勾选如图所示。点击Calibrate。
4,最后点击。Export Camera Parameters导出参数。
5,回到matlab工作区。
IntrinsicMatrix对应内参,注意这个和程序中是转置的关系,注意不要搞错。
RadiaDistortion即为相机的畸变矩阵对应k1,k2,k3。
TangentialDistortion对应p1,p2。
畸变参数,总共有五个,径向畸变3个(k1,k2,k3)和切向畸变2个(p1,p2)。
RotationMatrices为16张图片的外参矩阵translationVectors 为16张图片的转移矩阵。因为每张图片对应一个世界坐标系(旋转矩阵和平移矩阵是世界坐标系相对于摄像机坐标系的,而算法中规定世界坐标系是标定板为z=0的平面,对于不同位置的标定板,其世界坐标系的定义是不同的,这也就不难解释为什么有多个旋转矩阵和平移矩阵了),所以实际情况时,内参矩阵,畸变矩阵确定后,选一个合适的世界坐标系,将其对应的外参矩阵和平移矩阵带入即可用于相机的坐标系转换。
至此,相机标定结束。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)