相机校参及C-arm校参 07 - 根据2D图像计算相机的相对位姿

已知条件为:

 

1.calibrated camera 校准后相机的intrisic parameters (K)

2. Model geometry 模型中特征点(有些文献中成为标记物Tag)的3D Coordinate, noted as "X"

3. 图像中的位置坐标, noted as "x"

4.计算求解的速度和initial guess有关

求:Model(或者说是Model上的特征点)相对于相机的pose (位姿)

方法:根据最小二乘法预估图像中的位置直至收敛(supposing E<0.00001 )

(supposing \deltax is a very small value)

 根据公式我们可以列出以下等式:

p = K.M_{ext}._{}^{W}\textrm{P}

小p为图像中的坐标(x,y)

大P为Model坐标系下的坐标(X,Y,Z)

K为instric parameters(focal point (xc,yc); image center (ximg,yimg))\begin{bmatrix} f_{x}& 0& c_{x}\\ 0& f_{y}& c_{y}\\ 0& 0& 1 \end{bmatrix}

需要优化的参数就是旋转和平移矩阵\begin{bmatrix} r& r& r& t\\ r& r& r& t\\ r& r& r& t\\ 0& 0& 0& 1 \end{bmatrix}

%matlab

function p = fProject (x, P_M; K)

ax = x(1);
ay = x(2);
az = x(3);
tx = x(4);
ty = x(5);
tz = x(6);

Rx = [ 1 0 0; 0 cos(ax) -sin(ay); 0, sin(ax) cos(ax)];
Ry = [cos(ay) 0 sin(ay); 0 1 0; -sin(ay) 0 cos(ay)];
Rz = [cos(az) -sin(az) 0; sin(az) cos(az) 0; 0 0 1];
R = Rx*Ry*Rz

Mext = [R [tx; ty; tz]];

ph = K*Mext*P_M;

%divide through 3rd element of each column to get rid of 3rd row%
ph(1,:) = ph(1,:)./ph(3,:);
ph(2,:) = ph(2,:)./ph(3,:);
ph = ph(1:2,:);

p = reshape(ph, [], 1);

return


I = imread("XXX.png");
imshow(I,[]);

%the position of feature in Model coordinate%
P_M = [ 0 0 2  0 0 2;
       10 2 0 10 2 0;
        6 6 6  2 2 2;
        1 1 1  1 1 1 ];
f = 715; cx =354; cy = 245;
K = [ f 0 cx;
      0 f cy;
      0 0  1 ];
%y0 is a 6X1 matrix by [x0;y0;x1;y1;...]%
y0 = [ 183, 147; 
       350; 133;
       454; 144;
       176; 258;
       399, 275;
       444; 286];
%initial guess%
x = [1.5; -10.0; 0.0; 0.0; 0.0; 30.0];

y = fProject (x, P_M; K);

for i =1:2:length(y)
    rectangle('Position', [y(i)-8 y(i+1)-8, 16, 16]); 'FaceColor', 'r');
end 


for i = 1:10
    fprinf('\nIteration %d\nCurrent pose:\n', i);
    disp(x);

    y = fproject(x, P_M, K);
    
    imshow(I, []);

    for i =1:2:length(y)
    rectangle('Position', [y(i)-8 y(i+1)-8, 16, 16]); 'FaceColor', 'r');
    end

    pause(1);
    
    e = 0.00001;
    dy = y0 -y;
    fprintf('Residual error: %f \n', norm(dy));

    J(:,1) = (fProject(x+[e;0,0,0,0,0],P_M,K)-y)/e;
    J(:,2) = (fProject(x+[0;e,0,0,0,0],P_M,K)-y)/e;
    J(:,3) = (fProject(x+[0;0,e,0,0,0],P_M,K)-y)/e;
    J(:,4) = (fProject(x+[0;0,0,e,0,0],P_M,K)-y)/e;
    J(:,5) = (fProject(x+[0;0,0,0,e,0],P_M,K)-y)/e;
    J(:,6) = (fProject(x+[0;0,0,0,0,e],P_M,K)-y)/e;
    
    dx = pinv(J)*dy;
    
    if abs (norm(dx)/norm(x)) <1e-6
        break;
    end
    
    x = x+dx;
end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: gcc-arm-10.3-2021.07-mingw-w64-i686-arm-none-linux-gnueabihf 是一个针对 ARM 架构的 GNU 编译器集合。它的名称包含了一些关键信息: - gcc:代表 GNU Compiler Collection,是一个开源的编程语言编译器。 - arm:代表 ARM 架构,是一种广泛使用的嵌入式处理器架构。 - 10.3:代表 GCC 的版本号,这里是 10.3 版本。 - 2021.07:代表编译器的发布日期,这里是 2021 年 7 月。 - mingw-w64:代表 Minimalist GNU for Windows,是一个在 Windows 平台上使用 GCC 工具链的开发环境。 - i686:代表针对 32 位 x86 架构的编译器。 - arm-none-linux-gnueabihf:代表针对 ARM 架构、使用 Linux 环境的非嵌入式 ABI 编译器。 这个编译器集合旨在为使用 ARM 架构的开发者提供在 Linux 环境下进行交叉编译的能力。它可以生成针对 ARM 架构的可执行文件,可以在嵌入式系统或其他 ARM 设备上运行。 gcc-arm-10.3-2021.07-mingw-w64-i686-arm-none-linux-gnueabihf 是一个强大的开发工具,可以帮助开发者在 ARM 架构上构建高效、可靠的应用程序。它提供了丰富的编译选项和库,使开发者能够更轻松地开发、调试和优化 ARM 架构的代码。 总而言之,这个编译器集合是专门为 ARM 架构下的开发者准备的,提供一套完整的工具链,方便开发者在 Linux 环境下进行 ARM 应用程序的交叉编译。 ### 回答2: gcc-arm-10.3-2021.07-mingw-w64-i686-arm-none-linux-gnueabihf 是一个用于ARM架构的GNU编译器。它是基于10.3版本的GCC,可用于在Windows系统上交叉编译ARM架构的应用程序。 这个编译器是基于Mingw-w64项目,该项目旨在为Windows提供可用于移植的开发环境。它使用了W64工具链,这是一个支持32位和64位Windows的工具链。 "-i686"指明了使用32位的x86架构,用于生成在ARM平台上运行的32位应用程序。"arm-none-linux-gnueabihf"是一个目标平台说明符,指明了编译器生成的代码将在Linux环境下的ARM处理器上运行。 该编译器具有优秀的交叉编译能力,可以将在Windows系统上开发的应用程序编译成在ARM Linux上运行的可执行文件。它提供了一套完整的开发工具,包括编译器、链接器、库等,以支持用户在Windows环境下进行ARM开发。 总之,gcc-arm-10.3-2021.07-mingw-w64-i686-arm-none-linux-gnueabihf 是一个用于在Windows系统上交叉编译ARM架构应用程序的跨平台编译器。它为开发者提供了在Windows环境中进行ARM开发的便利性,并能够生成在ARM Linux上运行的可执行文件。 ### 回答3: gcc-arm-10.3-2021.07-mingw-w64-i686-arm-none-linux-gnueabihf 是一款编译器软件,主要用于在基于ARM架构的嵌入式linux系统上进行编译。这个编译器是基于GCC(GNU Compiler Collection)的ARM版本,在Windows平台下通过MINGW-W64进行交叉编译,可在32位的i686架构的处理器上运行。它的编译目标平台是ARM架构的嵌入式linux系统,使用的是ARM的硬浮ABI(Application Binary Interface)。这个版本的编译器是在2021年7月发布的,并使用了GCC 10.3版本作为基础。 使用这个编译器,开发人员可以方便地编译ARM架构的嵌入式linux应用程序。它允许开发人员在Windows环境下进行交叉编译,生成可在ARM架构的嵌入式linux系统上运行的可执行文件。同时,该编译器还支持ARM的硬浮ABI,可以提高运行效率和精度,特别适用于需要处理浮运算的应用程序。 总之,gcc-arm-10.3-2021.07-mingw-w64-i686-arm-none-linux-gnueabihf 是一款用于在基于ARM架构的嵌入式linux系统上进行编译的编译器软件,它提供了在Windows平台下进行交叉编译的能力,并支持ARM的硬浮ABI,可方便地开发ARM架构的嵌入式linux应用程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值