码迷,mamicode.com
首页 > 编程语言 > 详细

视觉SFM算法

时间:2016-07-19 18:56:39      阅读:633      评论:0      收藏:0      [点我收藏+]

标签:

 

这里采用的是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;

视觉SFM算法

标签:

原文地址:http://www.cnblogs.com/lzwverygood007/p/5685566.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!