计算机视觉深度学习人工智能图像处理【免费下载链接】kornia 空间人工智能的几何计算机视觉库项目地址https://gitcode.com/kornia/kornia点击查看免费下载Kornia 的kornia.geometry.conversions模块是一套基于 PyTorch 张量的几何表示互转工具集覆盖角度/弧度、极坐标、齐次坐标、像素坐标、单应矩阵、四元数、旋转矩阵、轴角、欧拉角与相机位姿Rt/extrinsics等几乎所有常用几何表示之间的转换。本文以 docs/source/geometry.conversions.rst 为骨架结合 kornia/geometry/conversions.py 源码与 tests/geometry/test_conversions.py 测试逐函数展开读完你将掌握每个 API 的输入输出约定、形状规则、边界行为以及它们在 SLAM、三维重建、图像配准等场景中的正确用法。模块概览一个函数集合两套核心约定该模块没有类定义全部由纯函数组成通过 kornia/geometry/init.py 中的from .conversions import *统一导出因此所有函数都可以直接通过kornia.geometry命名空间访问例如import kornia from kornia.geometry.conversions import rad2deg, quaternion_to_rotation_matrix源码文件在开头通过__all__显式声明了 44 个公开符号见 conversions.py。在使用前必须理解贯穿全模块的两套核心约定四元数分量顺序为(w, x, y, z)实部在前。这是模块内quaternion_*系列函数quaternion_to_rotation_matrix、rotation_matrix_to_quaternion、axis_angle_to_quaternion等的统一输入输出格式。如果传入(x, y, z, w)顺序函数不会报错但会静默地返回一个看似合法的旋转矩阵——这是文档明确警告过的最大陷阱之一见 conversions.py。像素坐标按(x, y)组织x 索引列、y 索引行但函数位置参数按(height, width)传递。例如normalize_pixel_coordinates(coords, height, width)位置参数顺序与坐标分量顺序相反极易写反见 conversions.py。按照文档的分类模块可划分为八个功能区。下面逐一展开。角度换算Anglesrad2deg/deg2rad弧度与角度互转这两个函数是逐元素的纯缩放操作任意形状张量均可输入输出形状、设备与浮点类型保持不变见 conversions.pyimport torch from kornia.geometry.conversions import rad2deg, deg2rad rad2deg(torch.tensor(3.1415926535)) # tensor(180.) deg2rad(torch.tensor(180.)) # tensor(3.1416)源码实现极其简单rad2deg即tensor * (180.0 / math.pi)deg2rad即tensor * (math.pi / 180.0)。非torch.Tensor输入会抛出TypeError。pol2cart/cart2pol极坐标与笛卡尔坐标互转from kornia.geometry.conversions import pol2cart, cart2pol x, y pol2cart(rho, phi) # x rho * cos(phi), y rho * sin(phi) rho, phi cart2pol(x, y) # rho sqrt(x**2 y**2 eps), phi atan2(y, x)需要特别注意两个实现细节见 conversions.pycart2pol的phi是atan2(y, x)单位为弧度取值范围[-π, π]rho的计算式为sqrt(x**2 y**2 eps)eps 加在根号内部默认eps1e-8因此rho存在正偏差——在原点处该偏差就是全部答案cart2pol(0., 0.)在 float32 下返回rho 9.9999997e-05而非0。这个eps的作用是让原点处的梯度保持有限eps0时梯度为nan但代价是rho不再精确。kornia 的图像 y 轴向下因此phi增长在图像显示中是顺时针的与angle_to_rotation_matrix的旋转方向相反。angle_to_rotation_matrix由角度度生成 2×2 旋转矩阵与轴角系列的弧度不同此函数接收度数输出形状(*, 2, 2)的旋转矩阵[[cos, sin], [-sin, cos]]det 1实现内部先调用deg2rad再取三角值见 conversions.py。在 kornia 的 y 向下图像坐标系中正角度表现为按显示逆时针旋转。坐标换算Coordinatesconvert_points_to_homogeneous/convert_points_from_homogeneous齐次坐标转换from kornia.geometry.conversions import convert_points_to_homogeneous, convert_points_from_homogeneous convert_points_to_homogeneous(torch.tensor([[0., 0.]])) # tensor([[0., 0., 1.]]) convert_points_from_homogeneous(torch.tensor([[0., 0., 1.]])) # tensor([[0., 0.]])实现细节见 conversions.pyconvert_points_to_homogeneous通过F.pad(points, [0, 1], constant, 1.0)在最后一维末尾追加常量1输入形状(*, N, D)→ 输出(*, N, D1)支持整型 dtype。convert_points_from_homogeneous取最后一维的末分量w做除法。当abs(w) eps默认eps1e-8时用w精确除以前面各分量保留符号当abs(w) eps时原样返回分子不除、不报错这是对 OpenCV 的convertPointsFromHomogeneous行为的对齐。因此[[2., 4., -2.]]得到[[-1., -2.]]而[[2., 4., 0.]]得到[[2., 4.]]。输入必须是至少 2 维张量裸(D,)向量会抛ValueError。convert_affinematrix_to_homography/convert_affinematrix_to_homography3d仿射矩阵升维2D 版本要求输入严格为(B, 2, 3)在底部追加[0, 0, 1]行输出(B, 3, 3)见 conversions.py。批处理是强制的未批处理的(2, 3)矩阵会直接抛ValueError。3D 版本要求输入严格为(B, 3, 4)追加[0, 0, 0, 1]行输出(B, 4, 4)见 conversions.py。Rt_to_matrix4x4内部正是复用了它。A torch.tensor([[[1., 0., 0.], [0., 1., 0.]]]) convert_affinematrix_to_homography(A) # tensor([[[1., 0., 0.], # [0., 1., 0.], # [0., 0., 1.]]])normalize_pixel_coordinates/denormalize_pixel_coordinates及 3D 版本像素坐标 ↔ [-1, 1] 归一化坐标这是图像重采样grid_sample、warp_perspective等中最常打交道的函数。核心公式是角点对齐corner-aligned映射x_norm 2 * x / (width - 1) - 1 y_norm 2 * y / (height - 1) - 1实现要点见 conversions.py 与 conversions.py输入为(*, 2)的(x, y)坐标位置参数顺序是(pixel_coordinates, height, width)。该映射等价于align_cornersTrue的grid_sample约定。若要把输出喂给默认align_cornersFalse的F.grid_sample必须显式传align_cornersTrue否则会产生半像素偏移。输出不裁剪超出图像范围的坐标会线性外推到[-1, 1]之外。例如normalize_pixel_coordinates(torch.tensor([[50., 100.]]), 100, 50)返回tensor([[1.0408, 1.0202]])。单像素轴width 1或height 1使用缩放1、偏移0的特殊映射保证该轴可逆非正尺寸抛ValueError。弃用说明0.9.0eps参数已不再参与计算传入非默认值会在 eager 模式下发出FutureWarning未来版本将移除该参数。3D 版本normalize_pixel_coordinates3d/denormalize_pixel_coordinates3d输入为(*, 3)分量顺序是(d, x, y)——深度在前与create_meshgrid3d的输出顺序一致位置参数为(pixel_coordinates, depth, height, width)见 conversions.py。normalize_points_with_intrinsics/denormalize_points_with_intrinsics利用相机内参归一化点用于关键点与本质矩阵essential matrix之间的换算见 conversions.pyfrom kornia.geometry.conversions import normalize_points_with_intrinsics # K [[fx, 0, cx], [0, fy, cy], [0, 0, 1]] xy normalize_points_with_intrinsics(point_2d, camera_matrix) # x (u - cx) / fx, y (v - cy) / fypoint_2d形状(*, 2)camera_matrix为行主序针孔模型(*, 3, 3)只读取对角元fx, fy与[:2, 2]列cx, cy忽略 skew 项K[0, 1]。逆函数denormalize_points_with_intrinsics计算u x * fx cx, v y * fy cy。当内参批尺寸小于点批尺寸时自动广播。单应性归一化Homographynormal_transform_pixel/normal_transform_pixel3d像素归一化矩阵返回一个永不批处理的(1, 3, 3)矩阵作用于齐次列向量(x, y, 1)见 conversions.pyfrom kornia.geometry.conversions import normal_transform_pixel normal_transform_pixel(4, 5) # tensor([[[ 0.5000, 0.0000, -1.0000], # [ 0.0000, 0.6667, -1.0000], # [ 0.0000, 0.0000, 1.0000]]])关键约定默认align_cornersTrue缩放2 / (size - 1)、偏移-1把像素中心0和size-1映射到精确的-1和1。align_cornersFalse半像素映射缩放2 / size、偏移1/size - 1±1落在最外侧像素边缘。它不是F.grid_sample默认的(2x 1)/width - 1约定——后者会把 5 像素宽图像的 0 列放到-0.8而不是-1.0。dtypeNone时矩阵由 Python float 构建取torch.get_default_dtype()显式传入整型 dtype 会被拒绝抛ValueError因为2/(size-1)对超过 3 像素的尺寸是分数截断为整型会让矩阵退化、把整幅图映射到单点。normal_transform_pixel3d目前无条件使用角点对齐没有align_corners参数见 conversions.py。normalize_homography/denormalize_homography及 3D 版本单应矩阵的像素 ↔ 归一化互转这是warp_perspective类变换的核心铺垫。normalize_homography的复合结构是见 conversions.pyH_norm N_dst H inv(N_src)输入dst_pix_trans_src_pix把源图像素映射到目标图像素输出把归一化源坐标映射到归一化目标坐标——方向不变只是换坐标系。dsize_src驱动右侧输入侧因子dsize_dst驱动左侧输出侧因子两者都是(height, width)元组。把两者写反得到的是另一矩阵那正是denormalize_homography计算的inv(N_dst) H N_src。接受(3, 3)或(B, 3, 3)未批处理输入会被提升为(1, 3, 3)返回结果带 batch 维度。align_corners默认True必须与最终消费该结果的grid_sample调用保持一致否则会产生亚像素级的虚假缩放与平移。一个有趣的实现细节normalize_homography在 eager 模式下用闭式 3×3 伴随矩阵torch.linalg.cross构造求逆刻意避开cusolver因此它能在 Jetson 等无法 dlopentorch.linalg.inv的平台上运行而denormalize_homography在 eager 模式下走torch.linalg.inv见 conversions.py。normalize_homography3d处理(B, 4, 4)矩阵内部通过torch.linalg.inv求逆目前也没有align_corners参数见 conversions.py。四元数、旋转矩阵与轴角Quaternion / Rotation Matrix / Axis Angle这是模块中函数最密集、最容易出错的一组。四元数约定为(w, x, y, z)轴角是旋转轴乘以旋转角弧度的 3 维向量。normalize_quaternion四元数 L2 归一化对最后一维做 L2 归一化保持符号-q归一化后精确等于归一化结果的相反数不对w 0做规范化见 conversions.pynormalize_quaternion(torch.tensor((1., 0., 1., 0.))) # tensor([0.7071, 0.0000, 0.7071, 0.0000])注意当||q|| eps默认eps1e-12时输出不是单位四元数且不报错——zeros(4)返回zeros(4)eps0.0时返回全nan。float16 下eps会被提升到该 dtype 的最小正次正规数以保持防护有效。quaternion_to_rotation_matrix/rotation_matrix_to_quaternionfrom kornia.geometry.conversions import quaternion_to_rotation_matrix, rotation_matrix_to_quaternion R quaternion_to_rotation_matrix(torch.tensor((0., 0., 0., 1.))) # tensor([[-1., 0., 0.], # [ 0., -1., 0.], # [ 0., 0., 1.]]) —— 绕 z 半圈 q rotation_matrix_to_quaternion(torch.eye(3), epstorch.finfo(torch.float32).eps) # tensor([1., 0., 0., 0.])quaternion_to_rotation_matrix见 conversions.py内部先调用normalize_quaternion归一化再展开矩阵因此2*q与q得到比特级一致的矩阵双覆盖q与-q表示同一旋转。但注意零四元数会静默返回单位矩阵eye(3)而不是报错这是一个已知陷阱issue #3952。rotation_matrix_to_quaternion见 conversions.py返回(w, x, y, z)顺序符号不规范化为w 0——当trace(R) 0时强制非负的是x/y/z中的主导分量w可能为负。eps被加在主导分量的平方根内部默认值下结果不是严格单位四元数float64 下rotation_matrix_to_quaternion(torch.eye(3))返回[1.0000000012499999, 0., 0., 0.]||q||-1 ≈ 1.25e-09显式传eps0.0才能得到精确的[1., 0., 0., 0.]issue #3951。quaternion_to_axis_angle/axis_angle_to_quaternionfrom kornia.geometry.conversions import quaternion_to_axis_angle, axis_angle_to_quaternion quaternion_to_axis_angle(torch.tensor((1., 0., 0., 0.))) # tensor([0., 0., 0.]) axis_angle_to_quaternion(torch.tensor((0., 1., 0.))) # tensor([0.8776, 0.0000, 0.4794, 0.0000])quaternion_to_axis_angle见 conversions.py改编自 Ceres 的rotation.h。当w ! 0时折叠双覆盖q与-q返回同一向量|θ| π的代表当w 0半圈旋转时不折叠[0., 1., 0., 0.]返回[π, 0., 0.]。输入允许非单位四元数但极端缩放如q * 1e-25会使向量部分的平方下溢而改变结果。axis_angle_to_quaternion见 conversions.py计算w cos(θ/2)不做任何规范化——θ π会返回w 0的双覆盖半支。整型输入会被自动提升为浮点内部sqrt已产生浮点张量不会被拒绝。quaternion_log_to_exp/quaternion_exp_to_log四元数的对数/指数映射这对函数用于位姿优化如对增量旋转做参数化与流形插值from kornia.geometry.conversions import quaternion_log_to_exp, quaternion_exp_to_log q quaternion_log_to_exp(v, epstorch.finfo(v.dtype).eps) # v: (*, 3) - q: (*, 4) v quaternion_exp_to_log(q, epstorch.finfo(q.dtype).eps) # q: (*, 4) - v: (*, 3)quaternion_log_to_exp见 conversions.py的输入是 3 维向量即轴角向量的一半输出w cos(||v||)、向量部sin(||v||)·v/||v||。当π/2 ||v|| 3π/2时落入w 0半支。它等于axis_angle_to_quaternion(2 * v)精度到工作 dtype 的舍入误差非比特级一致。quaternion_exp_to_log见 conversions.py对单位q且w 0时结果恰为quaternion_to_axis_angle(q) / 2但w 0时不折叠双覆盖而是直接应用acos(w)。两者的 float16/bfloat16 输入都会被提升到 float32 计算再转回避免默认eps1e-8在低精度下下溢导致的nanissue #3966。quaternion_exp_to_log的反向传播在w ±1单位四元数、位姿优化的标准初始化点处被显式防护为有限梯度不会产生nan见 conversions.py。axis_angle_to_rotation_matrix/rotation_matrix_to_axis_anglefrom kornia.geometry.conversions import axis_angle_to_rotation_matrix, rotation_matrix_to_axis_angle R axis_angle_to_rotation_matrix(torch.tensor([[1.5708, 0., 0.]])) # 绕 x 轴 90° aa rotation_matrix_to_axis_angle(torch.eye(3)) # tensor([0., 0., 0.])axis_angle_to_rotation_matrix见 conversions.py实现 Rodrigues 公式并针对小角度θ² 1e-6使用二阶泰勒展开分支R I [v]× [v]ײ/2保证在恒等旋转处可微——sqrt的奇异导数永远不会作用到零被开方数上梯度是解析极限而非nan。rotation_matrix_to_axis_angle见 conversions.py内部先转四元数再转轴角。不校验输入是否为正交旋转矩阵zeros(3,3)返回[0., 0., 3.1416]反射矩阵diag(-1,1,1)被静默报告为零旋转。弃用别名angle_axis_to_rotation_matrix、rotation_matrix_to_angle_axis、quaternion_to_angle_axis、angle_axis_to_quaternion自 0.7.0 起为弃用别名会发出DeprecationWarning并转发到新名称。源码用deprecated(replace_with..., version0.7.0)装饰器实现如 conversions.py。欧拉角Euler Anglesquaternion_from_euler/euler_from_quaternionfrom kornia.geometry.conversions import quaternion_from_euler, euler_from_quaternion qw, qx, qy, qz quaternion_from_euler(roll, pitch, yaw) # 弧度分别绕 x/y/z roll, pitch, yaw euler_from_quaternion(w, x, y, z)关键约定见 conversions.py两个函数的输入输出都是分离的张量w, x, y, z四个参数/返回值不是(*, 4)单张量。各参数形状必须精确相等可广播形状如(2,)与(1,)会触发BaseError校验失败。欧拉角单位为弧度quaternion_from_euler的组合顺序是R Rz(yaw) Ry(pitch) Rx(roll)外旋 X-Y-Z / 内旋 Z-Y-X。顺序很重要在(0.3, 0.7, 1.1)处与Rx Ry Rz的矩阵差达0.64。euler_from_quaternion在|pitch| ≠ π/2时返回 roll/yaw ∈[-π, π]、pitch ∈[-π/2, π/2]在pitch ±π/2万向锁时返回的三元组通常不表示输入旋转且没有 gimbal-lock 分支来提示结果由舍入决定issue #3950。euler_from_quaternion不归一化输入传2*q会得到错误三元组甚至可能因asin饱和而误报万向锁issue #3953。不过其pitch的梯度在万向锁处已显式防护为有限值。向量工具Vectorvector_to_skew_symmetric_matrix向量 → 反对称矩阵from kornia.geometry.conversions import vector_to_skew_symmetric_matrix M vector_to_skew_symmetric_matrix(torch.tensor([1.0, 2.0, 3.0])) # tensor([[ 0., -3., 2.], # [ 3., 0., -1.], # [-2., 1., 0.]])矩阵形式为[[0, -v3, v2], [v3, 0, -v1], [-v2, v1, 0]]满足M x cross(v, x)左乘即叉积非其相反数。只接受(3,)或(B, 3)形状更高秩抛ValueError见 conversions.py。位姿换算Pose位姿部分解决两个问题Rt 与 4×4 矩阵的打包/解包、不同坐标系/约定之间的位姿转换。Rt_to_matrix4x4/matrix4x4_to_RtRt 打包与解包from kornia.geometry.conversions import Rt_to_matrix4x4, matrix4x4_to_Rt M Rt_to_matrix4x4(R, t) # R: (B,3,3), t: (B,3,1) - M: (B,4,4) R, t matrix4x4_to_Rt(M) # 逆操作Rt_to_matrix4x4见 conversions.py把t放入最后一列追加[0, 0, 0, 1]底行内部复用convert_affinematrix_to_homography3d作用于齐次列向量满足x_out R x_in t。形状严格(3,3)未批处理、(B,3)平移向量、(B,1,3)都会抛ShapeError。函数对R是否为正交矩阵不做校验。matrix4x4_to_Rt见 conversions.py返回的R与t是输入矩阵的视图view而非拷贝——R.mul_(0.)会原地清零调用方的旋转块修改前务必clone()。此外底行被忽略投影矩阵等非刚体 4×4 会被静默截断为刚体部分。相机帧转换camtoworld_graphics_to_vision_*/camtoworld_vision_to_graphics_*这组函数在图形学帧OpenGLx右、y上、z向后与视觉帧OpenCVx右、y下、z向前之间转换**相机到世界camera-to-world**位姿见 conversions.pyext_vision camtoworld_graphics_to_vision_4x4(ext_graphics) # (B,4,4) - (B,4,4) R_v, t_v camtoworld_graphics_to_vision_Rt(R_g, t_g) # 拆分参数版本操作本质是右乘diag(1, -1, -1, 1)——即变换相机侧基平移列不变。对 camera-to-world 矩阵左乘同一矩阵会得到完全错误的结果翻转了错误的一侧且不报错。翻转 y/z 两根轴而不是一根因此保持行列式与手性det 1的旋转仍为det 1。该翻转是对合involution四个 graphics/vision 函数计算的是同一个映射应用两次值精确还原atol rtol 0两个方向的名字只是记录调用者意图。_4x4与_Rt变体在整型输入上行为不一致_4x4在 cpu/mps 接受 int64 并返回 int64 矩阵而_Rt变体经由Rt_to_matrix4x4会抛RuntimeErrorissue #3959。camtoworld_to_worldtocam_Rt/worldtocam_to_camtoworld_Rtcamera-to-world ↔ world-to-camera用于与 COLMAP 的images.txt格式对接见 conversions.pyR_inv, t_inv camtoworld_to_worldtocam_Rt(R, t) # 返回 (R^T, -R^T t)返回对精确等于(R^T, -R^T t)——刚体逆只用转置和矩阵乘法实现从不调用矩阵求逆。输入侧t是世界坐标中的相机中心输出侧-R^T t是 COLMAP 的 world-to-camera 平移。worldtocam_to_camtoworld_Rt与它是同一个函数比特级一致输出两个名字只是表达调用方向。注意R被假定为正交旋转且从不校验对非正交R结果是转置而非逆会静默出错issue #3961。与Rt_to_matrix4x4不同这对函数的t允许在R的 batch 上广播。ARKitQTVecs_to_ColmapQTVecsARKit 位姿 → COLMAP 位姿一条真实流水线的浓缩把 Apple ARKit 的 camera-to-world 屏幕位姿graphics 帧、四元数表示转换为 COLMAP 期望的 world-to-camera 位姿vision 帧、QW QX QY QZ TX TY TZ格式见 conversions.pyq_colmap, t_colmap ARKitQTVecs_to_ColmapQTVecs(qvec, tvec) # qvec: (B,4) [w,x,y,z], tvec: (B,3,1)内部调用链为源码明确写出quaternion_to_rotation_matrix → camtoworld_graphics_to_vision_Rt → camtoworld_to_worldtocam_Rt → rotation_matrix_to_quaternion使用注意事项均来自源码 docstring 的实测记录ARKit 的simd_quatf.vector是(ix, iy, iz, r)即xyzw顺序调用前必须手动重排为wxyz否则函数会静默接受并产生错误结果。输出四元数符号不规范化比较时应比较旋转而非原始分量。目前没有ColmapQTVecs_to_ARKitQTVecs逆函数逆向需要手动组合worldtocam_to_camtoworld_Rt与camtoworld_vision_to_graphics_Rtissue #3962。零四元数输入不会被拒绝会返回看似合理的[0., 1., 0., 0.]调用前应自行校验issue #3952。实战组合一条完整的像素坐标 → 位姿链路把以上函数串联起来可以快速搭建一个像素点 → 归一化坐标 → 相机坐标的数据流例如三维重建中的关键点预处理import torch from kornia.geometry.conversions import ( normalize_pixel_coordinates, normalize_points_with_intrinsics, convert_points_to_homogeneous, ) # 假设图像 H480, W640内参 fx600, fy600, cx320, cy240 K torch.tensor([[600., 0., 320.], [0., 600., 240.], [0., 0., 1.]])[None] pix torch.tensor([[320., 240.], [400., 300.]])[None] # (1, 2, 2) 像素坐标 (x, y) # 1) 像素坐标 - 归一化网格坐标喂给 grid_sample 前 norm_grid normalize_pixel_coordinates(pix, height480, width640) # 2) 像素坐标 - 相机归一化坐标喂给本质矩阵求解前 cam_xy normalize_points_with_intrinsics(pix, K) # 3) 升齐次为下一步投影/变换做准备 hom convert_points_to_homogeneous(pix)位姿侧的典型流水线OpenGL 渲染 → COLMAP 重建为from kornia.geometry.conversions import ( Rt_to_matrix4x4, camtoworld_graphics_to_vision_4x4, camtoworld_to_worldtocam_Rt, matrix4x4_to_Rt, ) # 假设拿到 OpenGL 帧的 camera-to-world Rt M_gl Rt_to_matrix4x4(R, t) # (B,4,4) M_cv camtoworld_graphics_to_vision_4x4(M_gl) # 转视觉帧 R_cv, t_cv matrix4x4_to_Rt(M_cv) R_colmap, t_colmap camtoworld_to_worldtocam_Rt(R_cv, t_cv) # 转 COLMAP精度、边界与已知陷阱速查通过源码 docstring 与测试文件 tests/geometry/test_conversions.py其中包含TestAngleAxisToQuaternion、TestRotationMatrixToQuaternion、TestNormalizeHomography、TestRt2Extrinsics、TestCARKitToColmap、TestEulerFromQuaternion等 40 个测试类覆盖 float16/float32/float64 与多设备可以归纳出以下高频陷阱陷阱表现对策四元数分量顺序(x,y,z,w)被静默当作(w,x,y,z)返回看似合法的错误旋转统一使用(w,x,y,z)实部在前eps加在根号内部cart2pol的rho偏大rotation_matrix_to_quaternion输出非严格单位四元数高精度需求显式传eps0.0或torch.finfo(dtype).epsalign_corners不一致归一化坐标与grid_sample约定不符产生亚像素偏差与消费方grid_sample的align_corners保持一致零四元数/零向量静默返回单位矩阵/恒等结果不报错调用前自行校验输入有效性位置参数顺序(pixel_coordinates, height, width)易与(x, y)分量顺序混淆按源码签名核对参数顺序弃用别名4 个angle_axis_*/*_angle_axis名称自 0.7.0 弃用使用axis_angle_*新名称更完整的库级约定像素中心、归一化坐标、align_corners可参考 docs/source/get-started/conventions.rst相机与世界坐标系约定camera-to-world、graphics/vision 帧、内参布局可参考 docs/source/get-started/camera-conventions.rst。结语kornia.geometry.conversions的价值在于把几何编程中最容易出错的表示转换封装为可微分、可批处理、带严格形状校验的 PyTorch 算子44 个函数覆盖了从rad2deg到ARKitQTVecs_to_ColmapQTVecs的完整几何换算需求且全部兼容 autograd、TorchScript 与 torch.compile。理解每个函数 docstring 中详尽的 Convention 与 Warning 段落源码里这些约定写得比大多数教程还细是正确使用该模块的关键——尤其是四元数顺序、align_corners与eps这三个贯穿全局的约定点。建议结合 tests/geometry/test_conversions.py 中的测试用例验证自己的调用方式它本身就是一个极佳的用法参考手册。赞分享计算机视觉深度学习人工智能图像处理【免费下载链接】kornia 空间人工智能的几何计算机视觉库项目地址https://gitcode.com/kornia/kornia点击查看免费下载相关推荐玄铁C910未来展望路线图与社区贡献全解析玄铁C910未来展望路线图与社区贡献全解析 玄铁C910作为OpenXuantie开源项目的核心处理器正以强大的性能和灵活的架构吸引着全球开发者的关注。本文硬件开发指令集嵌入式Kornia核心模块深度解析几何变换与图像处理Kornia核心模块深度解析几何变换与图像处理 Kornia是一个基于PyTorch的可微分计算机视觉库专门为深度学习应用设计。本文深度解析Kornia的三计算机视觉人工智能深度学习图像处理Pillow 图像几何变换指南深入解析 PIL.ImageTransform 模块Pillow 图像几何变换指南深入解析 PIL.ImageTransform 模块 导读 PIL.ImageTransform 是 PillowPython图像处理计算机视觉上一篇Vue Smooth DnD轻松实现Vue中的拖放排序下一篇**马克思阶级平等的CSS重置库**创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
