视觉(3)blepo

把matlab转成c程序有好办法了,从网上下载了一个函数库blepo,转换为c几乎是一行对一行,openCv经常涉及到的内存申请和释放这里都不用管。高兴!
看看这段程序比较一下差别
matlab的

function [A,R,t]=art(P,fsign)
%ART  Factorize camera matrix into intrinsic and extrinsic matrices
%
%   [A,R,t] = art(P,fsign)  factorize the projection matrix P 
%   as P=A*[R;t] and enforce the sign of the focal lenght to be fsign.
%   By defaukt fsign=1.

% Author: A. Fusiello, 1999
%
% fsign tells the position of the image plane wrt the focal plane. If it is
% negative the image plane is behind the focal plane.



% by default assume POSITIVE focal lenght
if nargin == 1
    fsign = 1;
end

s = P(1:3,4);
Q = inv(P(1:3, 1:3));
[U,B] = qr(Q);

% fix the sign of B(3,3). This can possibly change the sign of the resulting matrix,
% which is defined up to a scale factor, however.
sig = sign(B(3,3));
B=B*sig;
s=s*sig;

% if the sign of the focal lenght is not the required one, 
% change it, and change the rotation accordingly.

if fsign*B(1,1) < 0
     E= [-1     0     0
         0    1     0
         0     0     1];
     B = E*B;
     U = U*E;
 end
 
 if fsign*B(2,2) < 0
     E= [1     0     0
         0    -1     0
         0     0     1];
     B = E*B;
     U = U*E;
 end
 
% if U is not a rotation, fix the sign. This can possibly change the sign
% of the resulting matrix, which is defined up to a scale factor, however.
if det(U)< 0 
    U = -U;
    s= - s;
end

  
% sanity check 
if (norm(Q-U*B)>1e-10) & (norm(Q+U*B)>1e-10) 
    error('Something wrong with the QR factorization.'); end

R = U';
t = B*s;
A = inv(B);
A = A ./A(3,3);


% sanity check 
if det(R) < 0 error('R is not a rotation matrix'); end
if A(3,3) < 0 error('Wrong sign of A(3,3)'); end
% this guarantee that the result *is* a factorization of the given P, up to a scale factor
W = A*[R,t];
if (rank([P(:), W(:)]) ~= 1 )
    error('Something wrong with the ART factorization.'); end



c++的:

//P 3*4
//A,R 3*3,T 3*1
void art(MatDbl P,
         OUT MatDbl *A,OUT MatDbl *R,OUT MatDbl *T,
         int fsign=1)
{
    MatDbl s;
    MatDbl Q;

    s=P.GetSubMat(0,3,3,1);
    Q=Inverse(P.GetSubMat(0,0,3,3));
//      Display(s,"s");
//      Display(Q,"Q");

    MatDbl U,B;
    Qr(Q,&U,&B);
//     PrintF(U,"U");
//     PrintF(B,"B");
//     PrintF(U*B-Q,"U*B-Q");
//     PrintF(U*Transpose(U),"U*U'");
    
    if(B(2,2)<0)
    {
        Negate(B,&B);
        Negate(s,&s);
    }

    if(fsign*B(0,0)<0)
    {
        double E[9]={-1 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,1};
        MatDbl _E;
        _E.FromArray(E,3,3);
        B=_E*B;
        U=U*_E;
    }

    if(fsign*B(1,1)<0)
    {
        double E[9]={1 ,0 ,0 ,0 ,-1 ,0 ,0 ,0 ,1};
        MatDbl _E;
        _E.FromArray(E,3,3);
        B=_E*B;
        U=U*_E;
    }

    if(Determinant(U)<0)
    {
        Negate(U,&U);
        Negate(s,&s);
    }

//     if(Norm((Q-U*B))>1e-10 && Norm((Q+U*B).ToVector)>1e-10)
//         printf("'Something wrong with the QR factorization.'\n")    ;

    *R=Transpose(U);
    *T=B*s;
    *A=Inverse(B);
    *A= *A * (1.0 / (*A)(2,2));

//     PrintF(*A,"A");
//     PrintF(*R,"R");
//     PrintF(*T,"T");
//     PrintF((*A) * (*R),"A*R");
//     PrintF((*A) * (*T),"A*T");
}

//[T1,T2,Pn1,Pn2] = rectify(Po1,Po2,d1,d2)
void Rectify(MatDbl Po1,MatDbl Po2,
             OUT MatDbl &T1,OUT MatDbl &T2,OUT MatDbl &Pn1,OUT MatDbl &Pn2
             /*double d1=0,double d2=0*/)
{
    MatDbl A1,R1,t1;
    MatDbl A2,R2,t2;
    art(Po1,&A1,&R1,&t1);
    art(Po2,&A2,&R2,&t2);

    MatDbl c1,c2;
    c1=-Transpose(R1)*Inverse(A1)*Po1.GetSubMat(0,3,3,1);
    c2=-Transpose(R2)*Inverse(A2)*Po2.GetSubMat(0,3,3,1);
//     PrintF(c1,"c1");
//     PrintF(c2,"c2");

    MatDbl v1,v2,v3;
    v1=c2-c1;
    v2=CrossProduct(Transpose(R1.GetSubMat(2,0,1,3)),v1);
    v3=CrossProduct(v1,v2);
//      Display(v1,"v1");
//      Display(v2,"v2");
//     Display(v3,"v3");
    
    v1=(v1 * (1.0/Norm(v1)));
    v2=(v2 * (1.0/Norm(v2)));
    v3=(v3 * (1.0/Norm(v3)));
    double r[9]={v1(0),v1(1),v1(2),
        v2(0),v2(1),v2(2),
        v3(0),v3(1),v3(2)};
    MatDbl R;
    R.FromArray(r,3,3);
    //Display(R,"R");

    MatDbl An1=A2;
    An1(1,0)=0;
    MatDbl An2=An1;
    //PrintF(An1,"An1");

//    Display(An1 *(-1.0) * R * c1,"An1 *(-1.0) * R * c1");
    Pn1=An1 * PackX(R, (-1.0) * R * c1);
    Pn2=An2 * PackX(R, (-1.0) * R * c2);
    PrintF(Pn1,"Pn1");
    PrintF(Pn2,"Pn2");

    T1=Pn1.GetSubMat(0,0,3,3) * Inverse(Po1.GetSubMat(0,0,3,3));
    T2=Pn2.GetSubMat(0,0,3,3) * Inverse(Po2.GetSubMat(0,0,3,3));
    PrintF(T1,"T1");
    PrintF(T2,"T2");
}

视觉(3)blepo的更多相关文章

  1. 理解CSS视觉格式化

    前面的话   CSS视觉格式化这个词可能比较陌生,但说起盒模型可能就恍然大悟了.实际上,盒模型只是CSS视觉格式化的一部分.视觉格式化分为块级和行内两种处理方式.理解视觉格式化,可以确定得到的效果是应 ...

  2. CSS学习笔记——视觉格式化模型 visual formatting model

    CSS 视觉格式化模型(visual formatting model)是用来处理文档并将它显示在视觉媒体上的机制.他有一套既定的规则(也就是W3C规范),规定了浏览器该怎么处理每一个盒子.以下内容翻 ...

  3. 【原】为什么选择iPhone5的分辨率作为H5视觉稿尺寸

    [20160105更新:可以用iPhone6分辨率为视觉稿尺寸啦] 又是一年的520网络情人节,深圳这边却下了大雨,这雨只能是单身汉的泪,而对于我来说这一天具有特别的意义,一来怀念父亲,二来对我这种结 ...

  4. 怪物AI之发现玩家(视觉范围发现系列)

    在网上找到一些资料参考,然后写写自己的想法. 这里感谢MOMO等大神. 我们用玩家检测怪物的方法来测,这样比较试用与弱联网游戏,每次在同步玩家的时候来判断玩家与怪物的位置. 这里给出两个处理方式: 1 ...

  5. 【转】Caffe初试(五)视觉层及参数

    本文只讲解视觉层(Vision Layers)的参数,视觉层包括Convolution, Pooling, Local Response Normalization (LRN), im2col等层. ...

  6. 视觉机器学习笔记------CNN学习

    卷积神经网络是第一个被成功训练的多层神经网络结构,具有较强的容错.自学习及并行处理能力. 一.基本原理 1.CNN算法思想 卷积神经网络可以看作为前馈网络的特例,主要在网络结构上对前馈网络进行简化和改 ...

  7. 视觉机器学习------K-means算法

    K-means(K均值)是基于数据划分的无监督聚类算法. 一.基本原理       聚类算法可以理解为无监督的分类方法,即样本集预先不知所属类别或标签,需要根据样本之间的距离或相似程度自动进行分类.聚 ...

  8. MG--滚动的视觉差效果

    #几句代码完成tableView滚动的视觉差 - 效果图 (失帧严重)![](http://upload-images.jianshu.io/upload_images/1429890-f2c8577 ...

  9. 大前端学习笔记整理【二】CSS视觉格式化模型

    1. 概念 在视觉格式化模型中,文档树中的每个元素都将会根据盒模型产生零到多个盒子.这些盒子的布局由如下因素决定: 盒子的尺寸和类型 定位策略(正常文档流,浮动或者绝对定位) 和文档树中其他元素的关系 ...

随机推荐

  1. 创建第一个MVC

    创建第一个MVC(asp.net)和默认路由设置 Asp.net的MVC已经出到了4.0,我用的是visual studio2013,接下来努力学下MVC,学之前的话我建议大家先去学下三层(分别是DA ...

  2. MySQL 5.7 虚拟列 (virtual columns)

    参考资料: Generated Columns in MySQL 5.7.5 MySQL 5.7新特性之Generated Column(函数索引) MySQL 5.7原生JSON格式支持 Gener ...

  3. 全面认识JVM技术

    本文向大家描述一下JVM的概念,JVM(Java虚拟机)是可运行Java代码的假想计算机.只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行. J ...

  4. 在JavaScript中判断整型的N种方法

    原文:http://www.cnblogs.com/YcYYcY/p/3759184.html 整数类型(Integer)在JavaScript经常会导致一些奇怪的问题.在ECMAScript的规范中 ...

  5. mysql存储过程和函数使用实例

    1.需求:根据输入的年份,月份,和当前系统的年份比较,不满1年按1年计算,多出1年11个月也按1年计算. 2.计算得出来的使用年份,计算车辆残值. 3.存储过程 DELIMITER $$ USE `d ...

  6. linux gcc++漏洞:普通用户获得root权限

    linux gcc++漏洞:普通用户获得root权限 2012-02-06 10:22:38|  分类: linux安全|举报|字号 订阅       经我测试在RHEL5 / CentOS5 / F ...

  7. 动态修改 NodeJS 程序中的变量值

    如果一个 NodeJS 进程正在运行,有办法修改程序中的变量值么?答案是:通过 V8 的 Debugger 接口可以!本文将详细介绍实现步骤. 启动一个 HTTP Server 用简单的 Hello ...

  8. HDU 4576 Robot(概率dp)

    题目 /*********************复制来的大致题意********************** 有N个数字,M个操作, 区间L, R. 然后问经过M个操作后落在[L, R]的概率. * ...

  9. java反射机制浅谈

    一.Java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...

  10. Android 非Activity类引用getResources()方法问题的解决方法

    在进行Android开发的过程中,在一个非Activity类(此处假设类名为MyNewClass)中引用了getResources()方法,如下: Bitmap bmp = BitmapFactory ...