视觉(3)blepo

视觉(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");
}

时间: 2024-10-21 21:05:51

视觉(3)blepo的相关文章

Multimodal —— 看图说话(Image Caption)任务的论文笔记(三)引入视觉哨兵的自适应attention机制

在此前的两篇博客中所介绍的两个论文,分别介绍了encoder-decoder框架以及引入attention之后在Image Caption任务上的应用. 这篇博客所介绍的文章所考虑的是生成caption时的与视觉信息无关的词的问题,如"the"."of"这些词其实和图片内容是没什么关系的:而且,有些貌似需要视觉特征来生成的词,其实也可以直接通过语言模型来预测出来,例如"taking on a cell"后生成"phone".

如何快速生成视觉需求?

不少产品经理认为画视觉稿是视觉设计师的事情,所以偷懒也不整理视觉需求给到对方,最后验收发现缺少部分视觉稿,或者画出的视觉稿和PM要求的差异很大.介绍我自己研究出来的快速交付视觉需求的方法论,绝对值得学一学. 只有当PM将所有的视觉需求一一交付给视觉设计师,才能保证视觉设计师全面了解PM的设计思想,以及不会漏做相应的线框图. 一.需要交付的内容 刚入门的PM可能简单的把所有原型一股脑丢给视觉设计师,可能连当前版本还是所有版本都不区分.也不会区分线框图和交互图.视觉设计师只能自己琢磨,以及主动来问你

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

卷积神经网络是第一个被成功训练的多层神经网络结构,具有较强的容错.自学习及并行处理能力. 一.基本原理 1.CNN算法思想 卷积神经网络可以看作为前馈网络的特例,主要在网络结构上对前馈网络进行简化和改进,从理论上讲,反向传播算法可以用于训练卷积神经网络.卷积神经网络被广泛用于语音识别和图像分类等问题. 2.CNN网络结构 卷积神经网络是一种多层前馈网络,每层由多个二维平面组成.每个平面由多个神经元组成. 网络输入为二维视觉模式,作为网络中间层的卷积层(C)和抽样层(S)交替出现.网络输出层为前馈

有关“视觉神经系统是怎么形成的?”的思考

视觉信息的处理是一个非常复杂的过程,这不由得让我想到了同样位于人们大脑中的新大脑皮层,作为人类智能的起始之地,它的运作也不简单,但是在婴儿时期,它的各部分单元并没有什么不同,不同的功能是在婴儿接受了外界的各种刺激后产生的.我个人倾向于这样一种原创观点:生物感知和处理外界信息的绝大部分的器官或组织都是在出生后才进行完善的,在此之前只是一个具有很强可塑性的存在,这或许是为了帮助生物更好地适应各种环境亦或是绝大部分生物还没有发育这种复杂系统的功能? 那么能不能说视神经的发育在婴儿时期也有可能未发育完全

人类的视觉能力基本上是出生后逐渐习得的

人类的视觉能力基本上是出生后逐渐习得的,婴儿不是眼睛发育不足,而是头脑暂时还不会很好运用眼睛去观察世界,就好比蹩脚的摄影师,拿着顶级单反也拍不出好片. 婴儿开始看世界的过程,就是对视觉处理神经元网络进行训练的过程.初生婴儿需要学习的第一课是分辨物体轮廓,最初他们看到的世界只是各种颜色和明暗的块块,经过学习才知道其中一些总是在一起运动,这部分色彩和明暗变化形成一个固定模式,而另一些则没有这种模式,当这种情况一再重复,最终神经元网络会演化出识别这种模式的算法,于是世界不再是色块,而是一个个物体了,以

机器人学 —— 机器人视觉(估计)

之前说到,机器人视觉的核心是Estimation.求取特征并配准,也是为了Estimation做准备.一旦配准完成,我们就可以从图像中估计机器人的位置,姿态.有了位置,姿态,我们可以把三维重建的东西进行拼接.从视觉信息估计机器人位姿的问题可以分为三个大类:1.场景点在同一平面上.2.场景点在三维空间中.3.两幅点云的配准. 所有问题有一个大前提就是知道相机内部矩阵K. 1.由单应矩阵进行位姿估计 单应矩阵原指从 R2--R2 的映射关系.但在估计问题中,如果我们能获得这种映射关系,就可以恢复从世

机器人学 —— 机器人视觉(基础)

机器人视觉是一种处理问题的研究手段.经过长时间的发展,机器人视觉在定位,识别,检测等多个方面发展出来各种方法.其以常见的相机作为工具,以图像作为处理媒介,获取环境信息. 1.相机模型 相机是机器人视觉的主要武器,也是机器人视觉和环境进行通信的媒介.相机的数学模型为小孔模型,其核心在于相似三角形的求解.其中有三个值得关注的地方: 1.1 1/f = 1/a + 1/b 焦距等于物距加上像距.此为成像定理,满足此条件时才能成清晰的像. 1.2 X  = x * f/Z 如果连续改变焦距f ,并同时移

paper 27 :图像/视觉显著性检测技术发展情况梳理(Saliency Detection、Visual Attention)

1. 早期C. Koch与S. Ullman的研究工作. 他们提出了非常有影响力的生物启发模型. C. Koch and S. Ullman . Shifts in selective visual attention: Towards the underlying neural circuitry. Human Neurobiology, 4(4):219-227, 1985. C. Koch and T. Poggio. Predicting the Visual World: Silenc

视觉感知测试

随着互联网第二春的到来以及Web2.0的盛行,Web应用程序开发已经成为了当前软件开发的主力军.现在无论是企业级应用,社交应用还是移动应用,Web已经成为标准配置,而且很多企业正在逐步的将自己的企业级本地应用进行互联网Web化.但是Web 的界面布局测试,多浏览器测试,CSS/JavsScript的重构等都成为界面测试的痛中之痛,特别是大型Web应用的回归测试量太大,从而导致回归测试很多时候根本无法完成,所以很少会有团队能完成全方位的界面布局回归测试,特别是对于使用Agile流程开发的团队就更加