
计算机视觉深度学习人工智能图像处理【免费下载链接】kornia 空间人工智能的几何计算机视觉库项目地址https://gitcode.com/kornia/kornia点击查看免费下载kornia.sensors.camera是 Kornia 中面向空间 AISLAM、多视图几何、三维重建的可微分相机模型子模块它以「畸变distortion 投影projection」可组合组件为核心统一表达 Pinhole、Brown-Conrady、Kannala-Brandt K3、Orthographic 等经典相机模型。读完本文你将掌握通过CameraModel一行代码实例化内置相机、基于CameraModelBase组合自定义畸变与投影类型、理解project/unproject的可微分数据流以及它与kornia.geometry.camera旧 API 的约定差异。注意根据 sensors.camera.rst 中的声明kornia.sensors.camera目前是实验性 API接口可能随版本调整待其完成后将取代kornia.geometry.camera当前两者按设计保持独立。模块目标与设计动机该模块的设计目标可以概括为两点用统一的组件语言表达已知相机模型把 Pinhole、Kannala-Brandt 等模型拆解为「畸变类型」与「投影类型」的组合并保证整个过程可微分differentiable从而可以直接参与基于梯度的优化、标定与端到端学习管线为用户提供自定义相机模型的工具通过自由组合畸变与投影组件用户可以构造仓库内置模型之外的相机模型。从源码结构看模块由三个文件组成职责边界清晰文件职责kornia/sensors/camera/camera_model.pyCameraModelBase、CameraModel、CameraModelType及四种内置模型类kornia/sensors/camera/distortion_model.pyAffineTransform、BrownConradyTransform、KannalaBrandtK3Transform三种畸变组件kornia/sensors/camera/projection_model.pyZ1Projection、OrthographicProjection两种投影组件公开接口统一从 kornia/sensors/camera/__init__.py 导出BrownConradyModel、CameraModel、CameraModelBase、CameraModelType、KannalaBrandtK3、Orthographic、PinholeModel。内置相机模型一览CameraModelType定义于 camera_model.py是一个枚举列出了模块支持的四种内置模型枚举值数值含义PINHOLE0标准透视投影无畸变BROWN_CONRADY1经典径向 切向畸变模型常用于广角镜头KANNALA_BRANDT_K32鱼眼畸变模型使用 9 阶多项式做等距投影近似ORTHOGRAPHIC3平行投影光线垂直于像平面无透视效果快速上手一行代码定义 Pinhole 相机文档给出的最小示例展示了用CameraModel定义一个 Pinhole 相机import torch from kornia.image import ImageSize from kornia.sensors.camera import CameraModel, CameraModelType params torch.tensor([328., 328., 320., 240.]) # fx, fy, cx, cy cam CameraModel(ImageSize(480, 640), CameraModelType.PINHOLE, params)这里params是扁平的参数向量ImageSize(480, 640)分别表示高度 480、宽度 640注意构造参数的顺序是 height 在前、width 在后。CameraModel在构造时会根据model_type委托给get_model_from_typecamera_model.py创建对应的具体模型类并通过__getattr__把project、unproject、matrix、K、fx、fy、cx、cy、params等属性与方法的调用透传给内部模型。四种内置模型的构造示例来自 camera_model.py 的文档示例# Pinhole cam CameraModel(ImageSize(480, 640), CameraModelType.PINHOLE, torch.tensor([328., 328., 320., 240.])) # Brown-Conrady12 个参数 cam CameraModel(ImageSize(480, 640), CameraModelType.BROWN_CONRADY, torch.tensor([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])) # Kannala-Brandt K38 个参数 cam CameraModel(ImageSize(480, 640), CameraModelType.KANNALA_BRANDT_K3, torch.tensor([1., 1., 1., 1., 1., 1., 1., 1.])) # Orthographic cam CameraModel(ImageSize(480, 640), CameraModelType.ORTHOGRAPHIC, torch.tensor([328., 328., 320., 240.]))自定义相机模型CameraModelBase 组合式 API如果内置模型无法覆盖你的需求可以使用CameraModelBase直接组合畸变与投影组件这是文档给出的核心自定义范式import torch from kornia.image import ImageSize from kornia.sensors.camera import CameraModelBase from kornia.sensors.camera.distortion_model import AffineTransform from kornia.sensors.camera.projection_model import Z1Projection params torch.tensor([328., 328., 320., 240.]) cam CameraModelBase(AffineTransform(), Z1Projection(), ImageSize(480, 640), params)CameraModelBase.__init__的签名是(distortion, projection, image_size, params)camera_model.py其中distortion畸变组件可选AffineTransform、BrownConradyTransform、KannalaBrandtK3Transformprojection投影组件可选Z1Projection、OrthographicProjectionimage_size图像尺寸params形状为(N,)或(B, N)的参数张量N由畸变类型决定。参数长度与校验规则参数向量长度由畸变类型固定_PARAMS_LEN_FOR_DISTORTION字典camera_model.py是这一映射的唯一定义点畸变组件参数长度参数布局AffineTransform4(fx, fy, cx, cy)BrownConradyTransform12(fx, fy, cx, cy, k1, k2, p1, p2, k3, k4, k5, k6)KannalaBrandtK3Transform8(fx, fy, cx, cy, kb0, kb1, kb2, kb3)_validate_paramscamera_model.py会在构造时对params做严格检查只接受秩为 1(N,)或秩为 2(B, N)的张量且最后一维长度必须与畸变类型匹配否则抛出ValueError。这一检查同时覆盖了直接构造CameraModelBase与各类型化子类的路径避免短向量导致的IndexError或秩 3 张量被静默投影成错误结果。内置类型化子类PinholeModel、BrownConradyModel、KannalaBrandtK3、Orthographic也会在自身构造器中做同样的长度与秩检查。相关异常测试可参见 tests/sensors/camera/test_camera_model.py。四个内置模型的组件构成从各类型化构造器camera_model.py可以看出它们的内部组件组合PinholeModelAffineTransform()Z1Projection()参数(fx, fy, cx, cy)BrownConradyModelBrownConradyTransform()Z1Projection()参数 12 个KannalaBrandtK3KannalaBrandtK3Transform()Z1Projection()参数 8 个OrthographicAffineTransform()OrthographicProjection()参数(fx, fy, cx, cy)。可见 Pinhole 与 Orthographic 共用同一套 Affine 畸变内参仿射映射区别只在投影方式三类基于 Z1 投影的模型则靠不同的畸变组件区分。这也是模块「以组件组合表达相机模型」设计哲学的直接体现。核心方法project 与 unprojectCameraModelBase.project与unproject的定义camera_model.py构成一对数学上互逆的操作project(points: Vector3) - Vector2内部等价于distortion.distort(params, projection.project(points))即先把相机坐标系下的 3D 点投影到归一化平面再施加畸变得到像素坐标unproject(points: Vector2, depth: Tensor) - Vector3内部等价于projection.unproject(distortion.undistort(params, points), depth)即先把像素坐标去畸变再结合深度提升回相机坐标系下的 3D 点。注意 API 是Vector 类型化的project接收Vector3返回Vector2unproject接收Vector2返回Vector3原始torch.Tensor不会被直接接受——直接传张量读取坐标会抛出AttributeError。Vector2/Vector3定义在 kornia/geometry/vector.py。文档给出的一组可验证示例 points Vector3(torch.Tensor([1.0, 1.0, 1.0])) cam CameraModel(ImageSize(480, 640), CameraModelType.PINHOLE, torch.Tensor([328., 328., 320., 240.])) cam.project(points) x: 648.0 y: 568.0 points Vector2(torch.Tensor([1.0, 1.0])) cam.unproject(points, torch.Tensor([1.0])) x: tensor([-0.9726]) y: tensor([-0.7287]) z: tensor([1.])在测试 tests/sensors/camera/test_camera_model.py 中test_project_unproject验证了多 batch 下的 project→unproject 往返round-trip闭合投影再反投影后3D 点误差被限制在几个 ULP 之内半精度下需把 atol 下限放宽到4 * eps。这直接印证了「可微分 数值稳定」的实现目标。depth 的语义unproject中的depth是相机坐标系下的 z 值而非欧氏射线长度Z1Projection.unproject将z 1平面上的点乘以depth因此结果的第三个坐标就是传入的depth本身。这一约定与 docs/source/get-started/camera-conventions.rst 中「depth 即相机系 z」的全局约定一致。畸变组件详解畸变组件接收「归一化平面上的点或像素点」并输出「像素坐标或归一化坐标」全部定义在 kornia/sensors/camera/distortion_model.py。AffineTransform仿射内参映射AffineTransform负责把归一化坐标映射到像素坐标以及其逆映射distort与undistort是解析互逆的distortu fx * x cxv fy * y cy输入在归一化z 1平面输出为像素坐标undistortx (u - cx) / fxy (v - cy) / fy是distort的闭式逆每个轴仅一次减法与一次除法无需迭代。其数值结果与kornia.geometry.camera.distort_points_affine一致后者接收普通张量这里接收Vector2。测试见 tests/sensors/camera/test_distortion_model.py以params (328, 328, 150, 150)为例(1, 1)被映射为(478, 478)与u 328 * 1 150完全吻合。BrownConradyTransform径向 切向畸变BrownConradyTransform实现经典的 Brown-Conrady 畸变模型同时刻画镜头形状导致的径向畸变与装配误差导致的切向畸变。它接收 12 参数向量(fx, fy, cx, cy, k1, k2, p1, p2, k3, k4, k5, k6)前四个是内参后八个是畸变系数。其底层实现直接调用 kornia/geometry/calibration.py 中的distort_points/undistort_points内部按params[..., 4:]传入畸变系数并以单位矩阵作为new_K因此数学定义与kornia.geometry.calibration模块保持同一布局。KannalaBrandtK3Transform鱼眼畸变KannalaBrandtK3Transform专为径向畸变显著的鱼眼镜头设计使用多项式近似投影。其distort/undistort分别调用 kornia/geometry/camera/distortion_kannala_brandt.py 中的distort_points_kannala_brandt/undistort_points_kannala_brandt参数向量按(fx, fy, cx, cy, kb0, kb1, kb2, kb3)布局前四个内参 四个 9 阶等距投影多项式的系数。投影组件详解投影组件把相机坐标系下的 3D 点映射到归一化z 1平面定义在 kornia/sensors/camera/projection_model.py。Z1Projection透视除法Z1Projection执行标准的透视除法uv xy / zproject把相机系点投影到z 1平面x、y分别除以深度z。需要注意约定不做 epsilon 保护、不做合法性校验——z 0的点会投影为无穷分子同时为 0 则得到nan位于相机后方的点会得到有限坐标unproject把z 1平面上的点乘以depth恢复为相机系点第三个坐标即传入的depth当depth是 Pythonfloat/int时会先提升为与points同设备同 dtype 的单元素张量。OrthographicProjection平行投影OrthographicProjection假设平行投影x、y坐标保持不变丢弃深度z物体不会因z增大而缩小。其实现分别调用 kornia/geometry/camera/projection_orthographic.py 中的project_points_orthographic/unproject_points_orthographic。内参矩阵matrix() / K()matrix()其别名K()返回(*, 3, 3)的内参矩阵[[fx, 0, cx], [0, fy, cy], [0, 0, 1]]实现见 camera_model.py用fx/fy/cx/cy属性堆叠三个行向量并置右下角为 1且携带params的 batch 维度。这一点与旧 API 有重要区别kornia.geometry.camera.pinhole.PinholeCamera存储的是(B, 4, 4)的intrinsics其camera_matrix属性才返回其中的(B, 3, 3)块。matrix()对所有内置相机模型统一实现。测试 tests/sensors/camera/test_camera_model.py 用显式构造的期望矩阵验证了matrix()的输出。PinholeModel.scale缩放相机模型PinholeModel.scale(scale_factor)camera_model.py返回一个新的模型其焦距、主点与图像尺寸都乘以缩放因子fx s * fx、cx s * cx半像素规则与kornia.geometry.camera.pinhole.PinholeCamera.scale相同。文档示例 cam CameraModel(ImageSize(480, 640), CameraModelType.PINHOLE, torch.Tensor([328., 328., 320., 240.])) cam_scaled cam.scale(2) cam_scaled.params tensor([656., 656., 640., 480.])测试 tests/sensors/camera/test_camera_model.py 以随机 batch 缩放因子验证了焦距、主点、宽高均按scale缩放。文档中的已知限制cx s * cx与库内其余 API 使用的整数像素中心cx (W - 1) / 2不一致且当scale_factor为张量时重建的ImageSize会以提升后的 dtype浮点因子得到浮点字段保存 0 维张量而构造函数原本接收 Python 整数。两个问题分别记录在 issue#4263中。与 kornia.geometry.camera 的约定差异文档明确警告kornia.sensors.camera是实验性 API完成后将取代kornia.geometry.camera但当前两者按设计保持独立——它们共享数学上的 Pinhole 映射却在以下方面不同记录在 issue#4274输入类型本模块接收Vector对象geometry.camera接收普通张量相机轴广播本模块对(B, N, 3)点云与(B, 4)内参做逐分量广播内参与点轴对齐geometry函数则插入单例点轴、沿相机 batch 轴应用内参当B N 1时两者会把内参与不同的点关联起来B 2, N 3时本模块的project/unproject会抛出RuntimeError而 geometry 函数支持投影舍入本模块的project直接除以z而kornia.geometry.camera.perspective.project_points乘以z的倒数并在abs(z) 1e-8时跳过除法按工作 dtype 比较在阈值附近结果可能因舍入而不同[1, 2, 0]在本模块得到无穷而在 geometry 中得到有限像素issue#4267零/近零深度处理unproject对应unproject_points(normalizeFalse)深度形状此处为(*,)而彼处为(*, 1)。除此之外两者在共享[fx, fy, cx, cy]与 Pinhole 数学映射时结果一致且像素都采用同一套整数像素中心约定。测试 tests/sensors/camera/test_camera_model.py 中专门以「convention pin」的形式锁定这一结论。约定与坐标系统一所有相机模型共享的像素中心、深度与内参约定详见 docs/source/get-started/camera-conventions.rst像素中心采用 OpenCV 风格整数像素中心像素坐标(u, v) (x, y) (列, 行)居中图像的主点为((W-1)/2, (H-1)/2)。本模块像素落在该整数中心网格上相机坐标系X 向右、Y 向下、Z 向前OpenCV 右手系extrinsics为 world-to-camera深度语义默认指相机系z本文所述unproject的depth即此含义内参布局行主序3x3的Kfx K[0,0]、fy K[1,1]、cx K[0,2]、cy K[1,2]K()方法暴露的正是这一布局。小结kornia.sensors.camera通过「畸变 × 投影」的组件组合以一套Vector类型化的可微分 API 统一了四种内置相机模型并为自定义模型提供了CameraModelBase这一组合入口。它的project/unproject数学上互逆、数值上经过往返测试验证params参数长度由畸变类型严格约束depth语义与全局相机约定保持一致。如果你需要在端到端可微的标定、SLAM 或重建管线中集成多种相机模型或想定义仓库内置之外的畸变与投影组合这个模块是当前的推荐入口而在它正式取代kornia.geometry.camera之前迁移时请特别注意 Vector 类型输入、相机轴广播与零深度处理这三处约定差异。赞分享计算机视觉深度学习人工智能图像处理【免费下载链接】kornia 空间人工智能的几何计算机视觉库项目地址https://gitcode.com/kornia/kornia点击查看免费下载相关推荐Kornia 可微相机模型实战指南kornia.sensors.camera 的 Pinhole、Brown-Conrady、Kannala-Brandt 与自定义相机建模Kornia 可微相机模型实战指南kornia.sensors.camera 的 Pinhole、Brown Conrady、Kannala Brandt 与计算机视觉人工智能深度学习图像处理Kornia Sensors 相机建模实战基于 Pinhole、Brown-Conrady、Kannala-Brandt 与 Orthographic 的可微分相机模型体系Kornia Sensors 相机建模实战基于 Pinhole、Brown Conrady、Kannala Brandt 与 Orthographic 的可微计算机视觉深度学习人工智能图像处理Kornia 传感器相机模型实现解读Brown-Conrady、Kannala-Brandt K3 与 Orthographic 的可微投影管线Kornia 传感器相机模型实现解读Brown Conrady、Kannala Brandt K3 与 Orthographic 的可微投影管线 导读 本文围计算机视觉人工智能深度学习图像处理上一篇终极二维码修复指南使用QRazyBox免费恢复任何损坏的二维码下一篇Vue 3 Pinia 状态管理实战用 JSDoc 类型体系驾驭 JavaScript 版 Storevue-expert-js 技能指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考