三维空间变换

三维空间变换


操作系统:ubuntu18.04
显卡:GTX1080ti
python版本:3.68
QQ群加入深度学习交流群 获取更多环境配置细节和学习资料 (147960154)


参考博客


这里先直接上代码
  • 复合矩阵(包括旋转,缩放,平移)
# 1. params
rx = torch.tensor(r[0] * np.pi / 180)
ry = torch.tensor(r[1] * np.pi / 180)
rz = torch.tensor(r[2] * np.pi / 180)
s_x,s_y,s_z = s[0],s[1],s[2]
tx, ty, tz = t[0], t[1], t[2]
cx, sx, cy, sy, cz, sz = torch.cos(rx), torch.sin(rx), torch.cos(ry), torch.sin(ry), torch.cos(rz), torch.sin(rz)
# 2. compound matrix
rst_xyz = torch.tensor(
	[[ s_x * (cy * cz),  -cx * cy * sz + sx * sy,       cx * sy + cy * sx * sz, 0],
	 [              sz,          s_y * (cx * cz),                     -cz * sx, 0],
	 [        -cz * sy,   cx * sy * sz + cy * sx, s_z*(cx * cy - sx * sy * sz), 0],
	 [              tx,                       ty,                           tz, 1]])
draw_hand2(uvd,Stn(uvd).rst([0,0,45],[1,1,1],[-0.2,-0.2,0]), [1,1,1])

result:
ad

完整类

class Stn():
    def __init__(self,uvd):
        self.uvd = torch.from_numpy(np.insert(uvd.numpy(),3,values=1, axis=1)) # [5,4]
    def t(self,tx, ty, tz):
        t_xyz = torch.tensor([[ 1., 0,  0, 0],
                              [ 0,  1,  0, 0],
                              [ 0,  0,  1, 0],
                              [tx, ty, tz, 1],
                             ])
        return self.uvd@t_xyz
    def s(self,sx, sy, sz):
        s_xyz = torch.tensor([[sx,  0.,  0, 0],
                              [ 0, sy,  0, 0],
                              [ 0,  0, sz, 0],
                              [ 0,  0,  0, 1],
                             ])
        return self.uvd@s_xyz
    def r(self,rx,ry,rz):
        rx = torch.tensor(rx * np.pi / 180)
        ry = torch.tensor(ry * np.pi / 180)
        rz = torch.tensor(rz * np.pi / 180)
        cx, sx, cy, sy, cz, sz = torch.cos(rx), torch.sin(rx),torch.cos(ry), torch.sin(ry), torch.cos(rz), torch.sin(rz)
        print(cz,sz)
        r_x = torch.tensor([[ 1,  0,  0, 0],
                            [ 0, cx, sx, 0],
                            [ 0,-sx, cx, 0],
                            [ 0,  0,  0, 1]])

        r_y = torch.tensor([[cy,  0,-sy, 0],
                            [ 0,  1,  0, 0],
                            [sy,  0, cy, 0],
                            [ 0,  0,  0, 1]])

        r_z = torch.tensor([[ cz, sz,  0, 0],
                            [-sz, cy,  0, 0],
                            [  0,  0,  1, 0],
                            [  0,  0,  0, 1]])
        r_xyz = torch.tensor([[ cy * cz,  -cx * cy * sz + sx * sy,  cx * sy + cy * sx * sz, 0],
                              [      sz,                  cx * cz,                -cz * sx, 0],
                              [-cz * sy,   cx * sy * sz + cy * sx,  cx * cy - sx * sy * sz, 0],
                              [       0,                        0,                       0, 1]])
        return self.uvd @ r_xyz
    def rst(self,r,s,t):
        rx = torch.tensor(r[0] * np.pi / 180)
        ry = torch.tensor(r[1] * np.pi / 180)
        rz = torch.tensor(r[2] * np.pi / 180)
        s_x,s_y,s_z = s[0],s[1],s[2]
        tx, ty, tz = t[0], t[1], t[2]
        cx, sx, cy, sy, cz, sz = torch.cos(rx), torch.sin(rx), torch.cos(ry), torch.sin(ry), torch.cos(rz), torch.sin(rz)
        rst_xyz = torch.tensor(
            [[ s_x * (cy * cz),  -cx * cy * sz + sx * sy,       cx * sy + cy * sx * sz, 0],
             [              sz,          s_y * (cx * cz),                     -cz * sx, 0],
             [        -cz * sy,   cx * sy * sz + cy * sx, s_z*(cx * cy - sx * sy * sz), 0],
             [              tx,                       ty,                           tz, 1]])

        return self.uvd @ rst_xyz
在 MATLAB 中,可以使用矩阵变换来实现三维空间中的变换。常见的三维空间变换包括平移、旋转、缩放等。 平移变换可以通过以下方式实现: 1. 定义平移向量 t = [tx, ty, tz] 2. 构造平移矩阵 T = [1 0 0 tx; 0 1 0 ty; 0 0 1 tz; 0 0 0 1] 3. 将需要平移的点或向量表示为齐次坐标形式,即 [x; y; z; 1] 4. 进行矩阵乘法运算,得到平移后的点或向量 例如,将点 P = [1, 2, 3] 沿 x 轴正方向平移 2 个单位长度,可以按照以下方式实现: ``` t = [2, 0, 0]; T = [1, 0, 0, t(1); 0, 1, 0, t(2); 0, 0, 1, t(3); 0, 0, 0, 1]; P = [1; 2; 3; 1]; P_translated = T * P; ``` 旋转变换可以通过以下方式实现: 1. 定义旋转角度和旋转轴 2. 构造旋转矩阵 R 3. 将需要旋转的点或向量表示为齐次坐标形式,即 [x; y; z; 1] 4. 进行矩阵乘法运算,得到旋转后的点或向量 例如,将点 P = [1, 2, 3] 绕 y 轴逆时针旋转 30 度,可以按照以下方式实现: ``` theta = 30 * pi / 180; % 将角度转换为弧度 axis = [0, 1, 0]; % 旋转轴为 y 轴 R = axang2rotm([axis, theta]); % 使用 MATLAB 自带函数计算旋转矩阵 P = [1; 2; 3; 1]; P_rotated = R * P; ``` 缩放变换可以通过以下方式实现: 1. 定义缩放因子 s = [sx, sy, sz] 2. 构造缩放矩阵 S = [sx 0 0 0; 0 sy 0 0; 0 0 sz 0; 0 0 0 1] 3. 将需要缩放的点或向量表示为齐次坐标形式,即 [x; y; z; 1] 4. 进行矩阵乘法运算,得到缩放后的点或向量 例如,将点 P = [1, 2, 3] 沿 x 轴、y 轴、z 轴分别缩放 2 倍、3 倍、4 倍,可以按照以下方式实现: ``` s = [2, 3, 4]; S = [s(1), 0, 0, 0; 0, s(2), 0, 0; 0, 0, s(3), 0; 0, 0, 0, 1]; P = [1; 2; 3; 1]; P_scaled = S * P; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值