球面图形到全景图像的正投影和逆投影

正向投影步骤

1)三维点链接球心投影到单位球面;
2)球面上的投影点根据球面下方的一个新的投影中心投影到一个虚拟的平面上;
3)然后乘上相机矩阵,成为像素点。

反向投影步骤

1)从像素点乘以相机内参逆矩阵恢复到虚拟平面;
2) 然后有一个逆投影公式恢复到球面上。

工作重点

把恢复到球面上的属于一条直线上的点用算法实时提取出来。

matlab正投影

function liftImgPts2Sphere()
%
xi=1.32; fx=373.3;fy=373.3; ux=617; uy=450;%相机参数
img = imread('omni2c.jpg');%读入图片
imgEdge = edge(rgb2gray(img),'canny',[0.1,0.4]);%图片边缘检测
figure%创建窗口
imshow(img);%显示原图
figure
imshow(imgEdge)
%
K = [fx,0,ux;0,fy,uy;0,0,1];%相机参数
[h,w,c] = size(img);%原图大小
edgeVec = reshape(imgEdge,1,h*w);%将图像变成一维序列
%
[x,y]= meshgrid(1:w,1:h);
x = reshape(x,1,h*w);
y = reshape(y,1,h*w);
imgVec = reshape(img,1,h*w,3);
figure
imshow(imgVec)
np = [x;y;ones(1,h*w)];
p = inv(K)* np;%inv()计算逆矩阵
m = p(1,:).^2 + p(2,:).^2 + 1;
x2py2 = p(1,:).^2 + p(2,:).^2;
%
ind = find(1+(1-1.32^2)*x2py2<0 | edgeVec == 0);
x2py2(:,ind) = [];
p(:,ind) = [];
m(:,ind) = [];
imgVec(:,ind,:) = [];
imgVec = [imgVec(:,:,1);imgVec(:,:,2);imgVec(:,:,3)]';%'转置
%
sx = (xi + sqrt(1+(1-1.32^2)*x2py2)).*p(1,:)./m;
sy = (xi + sqrt(1+(1-1.32^2)*x2py2)).*p(2,:)./m;
sz = (xi + sqrt(1+(1-1.32^2)*x2py2))./m - xi;
%
imgThetaPhi = zeros(181,361,3);
%
figure 
hold on;
for i = 1:length(x2py2)
    plot3(sx(i),sy(i),sz(i),'.','Color',imgVec(i,:));
    theta = floor(atan2(sy(i),sx(i))/pi * 180 + 180 ) + 1;%matlab中的floor意思是“向下取整”,即取不大于x的最大整数,
    phi   = floor(acos(sz(i))/pi * 180) + 1;
    imgThetaPhi(phi,theta,:) = imgVec(i,:);
end
plot3(0,0,0,'o','color','r');
%
figure
imshow(imgThetaPhi);
%
return;

在这里插入图片描述在这里插入图片描述在这里插入图片描述

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值