二维坐标系空间变换(详细解读,附MATLAB代码)

您所在的位置:网站首页 坐标系平移 二维坐标系空间变换(详细解读,附MATLAB代码)

二维坐标系空间变换(详细解读,附MATLAB代码)

2023-10-07 19:48| 来源: 网络整理| 查看: 265

基于https://blog.csdn.net/wxc_1998/article/details/118853843 的修改/完善(无需初试估值,直接最小二乘迭代求解转换参数)

本质是因为,求坐标系转换参数是一个非线性的最小二乘优化问题,所以需要进行迭代求解

二维坐标系转换

包含平移,缩放,旋转

convert.m:

%% wys 2023/5/30 % 二维坐标转换 4参数计算 最小二乘优化 clc clear close all %% 读取数据 xoy = load('imgcoord.txt'); % 读取坐标 XOY_C = load('showcoord.txt'); % XOY_C数据,变换后的坐标系 xoy_p1 = [xoy(1,1), xoy(1,2)]; % xoy 点1 xoy_p2 = [xoy(2,1), xoy(2,2)]; % xoy 点2 XOY_C_p1 = [XOY_C(1,1), XOY_C(1,2)]; % XOY_C 点1 XOY_C_p2 = [XOY_C(2,1), XOY_C(2,2)]; % XOY_C 点2 [init_x, init_y, init_xita, scale] = init_cal(xoy_p1,xoy_p2,XOY_C_p1,XOY_C_p2) % 直接法计算参数初值 %% 最小二乘法优化 需要迭代 % dx = init_x; % dy = init_y; % s = scale; % xita = init_xita; % 参数赋初值 dx = 0;% 不使用估值 dy = 0; s = 1; xita = 0; % 参数赋初值 for k = 1:1000 B=[1,0,cos(xita)*xoy(1,1)-sin(xita)*xoy(1,2),s*(-sin(xita)*xoy(1,1)-cos(xita)*xoy(1,2)); 0,1, sin(xita)*xoy(1,1)+cos(xita)*xoy(1,2),s*(cos(xita)*xoy(1,1)-sin(xita)*xoy(1,2))]; rotation = [cos(xita), -sin(xita); sin(xita), cos(xita)]; xoy_trans = s*rotation*[xoy(1,1);xoy(1,2)] + [dx; dy]; %计算出的真值 L = [XOY_C(1,1); XOY_C(1,2)] - xoy_trans; for i = 2:length(xoy) B = [B; 1,0,cos(xita)*xoy(i,1)-sin(xita)*xoy(i,2),s*(-sin(xita)*xoy(i,1)-cos(xita)*xoy(i,2)); 0,1, sin(xita)*xoy(i,1)+cos(xita)*xoy(i,2),s*(cos(xita)*xoy(i,1)-sin(xita)*xoy(i,2))]; rotation = [cos(xita), -sin(xita); sin(xita), cos(xita)]; xoy_trans = s*rotation*[xoy(i,1);xoy(i,2)] + [dx; dy]; tL = [XOY_C(i,1); XOY_C(i,2)] - xoy_trans; L = [L;tL]; end BB = (B'*B)\B'; % (B'*B)\B' 等同于 inv(B'*B)* B' para = BB * L; if (abs(para(1))


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3