视觉SFM算法

这里采用的是Yi Ma , Stefano Soatto. An Invitation to 3-D Vision , From Images to Geometric Models 的算法


%// Algorithm 8.1. also 11.7
%// Rank based factorization algorithm for multiview reconstruction  
%// using point features 
%// as described in Chapter 8, "An introduction to 3-D Vision"
%// by Y. Ma, S. Soatto, J. Kosecka, S. Sastry (MASKS)
%// Code distributed free for non-commercial use
%// Copyright (c) MASKS, 2003

%// Generates multiple synthetic views of a house and computes the 
%// motion and structure, calibrated case, point features only
%// Jana Kosecka, George Mason University, 2002
%// ======================================================================

close all; clear;
FRAMES = 3;
PLOTS  = 3;
%// transformation is expressed wrt to the camera frame

Zinit = 5;

%// cube in the object frame
 XW = [0 1 1 0 0 1 1 0 0.2 0.8 0.2 0.8 ;
       0 0 1 1 0 0 1 1 1.5 1.5 1.5 1.5;
       1 1 1 1 0 0 0 0 0.8 0.8 0.2 0.2 ;
       1 1 1 1 1 1 1 1 1   1   1   1];

NPOINTS = 12; 

XC = zeros(4,NPOINTS,FRAMES);

%// initial displacement摄像机的初始位置
Rinit = rot_matrix([1 1 1],0); 

Tinit = [ Rinit(1,:) -0.5 ;
          Rinit(2,:) -0.5 ;
          Rinit(3,:) Zinit;
          0 0 0 1];
%// first camera coodinates 
XC(:,:,1) = Tinit*XW;

%//画出三维的结构 original motion and 3D structure
figure; hold on;
plot3_struct(XC(1,:,1),XC(2,:,1),XC(3,:,1));
plot3(XC(1,:,1),XC(2,:,1),XC(3,:,1),‘*‘);
draw_frame_scaled([diag([1,1,1]), zeros(3,1)],0.5);
title(‘original motion and 3D structure‘);
view(220,20);
grid on; axis equal;
%// axis off;
pause;


%// image coordinates 计算第一帧时的图像坐标
xim(:,:,1) = project(XC(:,:,1));

Zmax = max(XC(3,:,1));
Zmin = min(XC(3,:,1));
rinc =   pi/30;
rot_axis = [1 0 0; 0 -1 0]‘;
trans_axis = [1 0 0; 0 1 0]‘;

ratio = 1;
rinc = 10;  %// rotation increment 20 degrees
Zmid = (Zmax+Zmin)/2;
tinc = 0.5*ratio*Zmid*rinc*pi/180;

ploting = 1;

for i=2:FRAMES %//计算第i帧的图像坐标xim
    theta = (i-1)*rinc*pi/180;
    r_axis = rot_axis(:,i-1)/norm(rot_axis(:,i-1));
    t_axis = trans_axis(:,i-1)/norm(trans_axis(:,i-1));
    trans = (i-1)*tinc*t_axis;
    R = rot_matrix(r_axis,theta);
    %// translation represents origin of the camera frame
    %// in the world frame 
    T(:,:,i) = ([ R trans;
                 0 0 0 1]);
    %// all transformation with respect to the object frame
    XC(:,:,i) = T(:,:,i)*XC(:,:,1);  %// XW;
    draw_frame_scaled(T(1:3,:,i),0.5); 
    xim(:,:,i) = [XC(1,:,i)./XC(3,:,i); XC(2,:,i)./XC(3,:,i); 
                  ones(1,NPOINTS)];
end;

for j = 2:FRAMES
 T_ini(:,j) = T(1:3,4,j);
end;

%// noise can be added here
for i=1:FRAMES     
  xim_noisy(:,:,i) = xim(:,:,i);
end   

%// pause 以下为SFM算法
%//---------------------------------------------------------------------
%// compute initial \alpha‘s for each point using first two frames only 1)首先用八点算法计算初始的R0,T0(我感觉T0~即1,0帧之间的相对移动~和实际的应该相差常数倍,因此会导致恢复的结构和实际相差常数倍),然后估计lambda。。。
[T0, R0]  = essentialDiscrete(xim_noisy(:,:,1),xim_noisy(:,:,2));
for i = 1:NPOINTS
  alpha(:,i) = -(skew(xim_noisy(:,i,2))*T0)‘*
      (skew(xim_noisy(:,i,2))*R0*xim_noisy(:,i,1))
      /(norm(skew(xim_noisy(:,i,2))*T0))^2;
  lambda(:,i) = 1/alpha(:,i);
end

scale = norm(alpha(:,1));     %// set the global scale
alpha = alpha/scale;          %// normalize everything
scale = norm(lambda(:,1));     %// set the global scale
lambda = lambda/scale;         %// normalize everything

%//---------------------------------------------------------------------
%// Compute initial motion estimates for all frames
%// Here do 3 iterations - in real setting look at the change of scales

iter = 1;
while (iter < 5);
  for j = 2:FRAMES
    P = []; %//  setup matrix P
    for i = 1:NPOINTS
      a = [kron(skew(xim_noisy(:,i,j)),xim(:,i,1)‘) 
       alpha(:,i)*skew(xim_noisy(:,i,j))];
      P = [P; a];
    end;
    %// pause
    [um, sm, vm] = svd(P);
    Ti = vm(10:12,12);
    Ri = transpose(reshape(vm(1:9,12)‘,3,3));
    [uu,ss,vv] =  svd(Ri);
    Rhat(:,:,j) = sign(det(uu*vv‘))*uu*vv‘;
    Ti = sign(det(uu*vv‘))*Ti/((det(ss))^(1/3));
    That(:,j) = Ti;
    True = T(1:3,4,j);
  end

  %// recompute alpha‘s based on all views
  lambda_prev = lambda;
  for i = 1:NPOINTS
    M = [];  %// setup matrix M
    for j=2:FRAMES       %// set up Hl matrix for all m views
      a = [ skew(xim(:,i,j))*That(:,j) 
        skew(xim(:,i,j))*Rhat(:,:,j)*xim(:,i,1)];
      M = [M; a];
    end;
    a1 = -M(:,1)‘*M(:,2)/norm(M(:,1))^2;
    lambda(:,i) = 1/a1;
  end;
  scale = norm(lambda(:,1));   %// set the global scale
  lambda = lambda/scale;     %// normalize everything
  iter = iter + 1
end %// end while iter

%// final structure with respect to the first frame
XF = [lambda.*xim(1,:,1);
      lambda.*xim(2,:,1);
      lambda.*xim(3,:,1)];

figure; hold on;
plot3(XF(1,:,1),XF(2,:,1),XF(3,:,1),‘r*‘);
plot3_struct(XF(1,:,1), XF(2,:,1), XF(3,:,1));
title(‘recovered structure‘);
view(220,20);
grid on; axis equal;
%// axis off;
pause;

时间: 2024-08-07 14:12:56

视觉SFM算法的相关文章

视觉SLAM算法框架解析(1) PTAM

版权声明:本文为博主原创文章,未经博主允许不得转载. 本系列文章旨在总结主流视觉SLAM算法的框架,对比各个算法在子模块的差异,最终提炼出融合各个算法优点的架构. PTAM[1]是视觉SLAM领域里程碑式的项目.在此之前,MonoSLAM[2]为代表的基于卡尔曼滤波的算法架构是主流,它用单个线程逐帧更新相机位置姿态和地图.地图更新的计算复杂度很高,为了做到实时处理(30Hz),MonoSLAM每帧图片只能用滤波的方法处理约10~12个最稳定的特征点.PTAM最大的贡献是提出了tracking.m

TLD视觉跟踪算法(转)

源:TLD视觉跟踪算法 TLD算法好牛逼一个,这里有个视频,是作者展示算法的效果,http://www.56.com/u83/v_NTk3Mzc1NTI.html.下面这个csdn博客里有人做的相关总结,感觉挺好的,收藏了!下面有个Compressive Tracking的网址,提供的代码很少,但实时性很好,matlab代码下下来就能用. 以下博文转自:http://blog.csdn.net/windtalkersm/article/details/8018980 TLD是一种算法的简称,原作

TLD视觉跟踪算法

TLD算法好牛逼一个,这里有个视频,是作者展示算法的效果,http://www.56.com/u83/v_NTk3Mzc1NTI.html.下面这个csdn博客里有人做的相关总结,感觉挺好的,收藏了!下面有个Compressive Tracking的网址,提供的代码很少,但实时性很好,matlab代码下下来就能用. 以下博文转自:http://blog.csdn.net/windtalkersm/article/details/8018980 TLD是一种算法的简称,原作者把它叫做Trackin

视觉SLAM算法框架解析(3) SVO

版权声明:本文为博主原创文章,未经博主允许不得转载. SVO(Semi-direct Visual Odometry)[1]顾名思义是一套视觉里程计(VO)算法.相比于ORB-SLAM,它省去了回环检测和重定位的功能,不追求建立.维护一个全局地图,更看重tracking的效果,追求高计算速度.低CPU占用率,所以SVO非常适合在计算资源有限的移动设备上使用.SVO对PTAM的改进主要在两个方面:1)高效的特征匹配:2)鲁棒的深度滤波器.SVO比PTAM.ORB-SLAM计算速度快很多的最主要原因

电子助视仪 视觉增强算法

电子助视仪 是一种将原始图像转换为某种对比度很高的图片,比如  转化为黑底白字,红底白字,白底红字,蓝底黄字,黄字蓝底等等. 主要的应用场景为为老人或者特殊弱视人群提供便捷的阅读.国内国外有公司是专门做这样设备的,比如诺基亚,zoomax.UEMAX等等.zoomax的效果尤其好,颜色对比度强烈,色彩饱和,做得很细腻.为此决定做一个类似于他们的效果的算法,并将至应用到手机app中或者移植到硬件中.经过半个多月的研发,终于做出了效果和zoomax一样. 对宽高为1280*1024视频,处理速度>1

视觉SLAM算法框架解析(2) ORB-SLAM

版权声明:本文为博主原创文章,未经博主允许不得转载. ORB-SLAM[1]完全继承了PTAM(http://www.cnblogs.com/zonghaochen/p/8442699.html)的衣钵,并做出了两点巨大改进:1)实时回环检测:2)很鲁棒的重定位.为了实现这两点改进,ORB-SLAM把PTAM的mapping线程基于局部BA和全局BA拆分成了local mapping和loop closing两个线程,用ORB描述子替换了patch匹配,并且设计了非常优秀的地图管理策略. 在tr

自动驾驶中高精地图的大规模生产:视觉惯导技术在高德的应用

导读:导航.驾驶辅助.自动驾驶等技术的不断发展对地图的精细程度提出了更高的要求.常规的道路级地图对于智能交通系统存在很多不足,针对自动驾驶应用的需求,我们提出了利用视觉惯导技术制作高精地图的方法. 本文将首先介绍视觉和惯导的主流设备,视觉惯导融合的框架和关键技术,高德在基于视觉方式生成高精地图道路标志和地面标识要素的计算方案,最后总结了这项技术在高精地图精度上所面临的挑战和未来发展方向.   视觉惯导技术具有广泛前景 高精地图是自动驾驶的核心技术之一,精准的地图对无人车定位.导航与控制,以及安全

3D重建算法原理

三维重建(3D Reconstruction)技术一直是计算机图形学和计算机视觉领域的一个热点课题.早期的三维重建技术通常以二维图像作为输入,重建出场景中的三维模型.但是,受限于输入的数据,重建出的三维模型通常不够完整,而且真实感较低.随着各种面向普通消费者的深度相机(depth camera)的出现,基于深度相机的三维扫描和重建技术得到了飞速发展.以微软的Kinect,华硕的XTion以及因特尔的RealSense等为代表的深度相机造价低廉,体积适当,操作方便,并且易于研究者和工程师进行开发.

SIFT算法详解(转)

http://blog.csdn.net/zddblog/article/details/7521424 目录(?)[-] 尺度不变特征变换匹配算法详解 Scale Invariant Feature TransformSIFT Just For Fun zdd  zddmailgmailcom or zddhubgmailcom SIFT综述 高斯模糊 1二维高斯函数 2 图像的二维高斯模糊 3分离高斯模糊 1 尺度空间理论 2 尺度空间的表示 3 高斯金字塔的构建 尺度空间在实现时使用高斯金