news 2026/8/21 22:02:05

基于单视图几何摄像机内参的投影成像原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于单视图几何摄像机内参的投影成像原理

理论基础:

焦距 f 就是胶片到小孔的距离

摄像机焦距和fov存在一一对应的关系,fov其实就是摄像机焦距的另一种更直观的表达方式

摄像机坐标系的原点就是针孔位置:

摄像机焦距就是原点到像平面的距离

通过将: ( 点的物理坐标/点的深度z )* f-[相机以像素为单位的焦距] 就可以得到点的物理坐标到像平面坐标的转换

计算方式:

根据图像长宽和fov得到图像的相机内参,从而得到3D点到图像平面的映射关系

代码实现:

从图像通过假设fov的方式得到相机内参的代码:

def generate_camera_params(image_path, fx=None, fy=None, cx=None, cy=None, fov=60): """ Generate camera parameters for 3D visualization. Args: image_path: Path to the image fx, fy: Focal lengths in pixels (if None, will be calculated from fov) cx, cy: Principal point coordinates in pixels (if None, will be set to image center) fov: Field of view in degrees (default: 60°) Returns: dict: Camera parameters with keys 'fx', 'fy', 'cx', 'cy' """ image = Image.open(image_path) w, h = image.size # Generate pseudo camera params if not provided if fx is None or fy is None: fx = round(w / (2 * np.tan(np.deg2rad(fov) / 2)), 2) fy = round(h / (2 * np.tan(np.deg2rad(fov) / 2)), 2) if cx is None or cy is None: cx = round(w / 2, 2) cy = round(h / 2, 2) cam_params = {'fx': fx, 'fy': fy, 'cx': cx, 'cy': cy} return cam_params

由摄像机坐标系下的物理3D点,根据对应摄像机内参来得到对应像平面上2D像素坐标的代码:

def convert_3dbbox(point, cam_params): """ Convert 3D bounding box to 2D image coordinates We represent 3D bounding boxes as: `[x_center, y_center, z_center, x_size, y_size, z_size, roll, pitch, yaw]` - **x_center, y_center, z_center**: Object center in camera coordinates (meters) - **x_size, y_size, z_size**: Object dimensions (meters) - **roll, pitch, yaw**: Rotation angles (radians) """ x, y, z, x_size, y_size, z_size, pitch, yaw, roll = point hx, hy, hz = x_size / 2, y_size / 2, z_size / 2 local_corners = [ [ hx, hy, hz], [ hx, hy, -hz], [ hx, -hy, hz], [ hx, -hy, -hz], [-hx, hy, hz], [-hx, hy, -hz], [-hx, -hy, hz], [-hx, -hy, -hz] ] def rotate_xyz(_point, _pitch, _yaw, _roll): # 这是一个 XYZ 顺序的欧拉角旋转 x0, y0, z0 = _point x1 = x0 y1 = y0 * math.cos(_pitch) - z0 * math.sin(_pitch) z1 = y0 * math.sin(_pitch) + z0 * math.cos(_pitch) x2 = x1 * math.cos(_yaw) + z1 * math.sin(_yaw) y2 = y1 z2 = -x1 * math.sin(_yaw) + z1 * math.cos(_yaw) x3 = x2 * math.cos(_roll) - y2 * math.sin(_roll) y3 = x2 * math.sin(_roll) + y2 * math.cos(_roll) z3 = z2 return [x3, y3, z3] img_corners = [] for corner in local_corners: # 8个顶点 rotated = rotate_xyz(corner, np.deg2rad(pitch), np.deg2rad(yaw), np.deg2rad(roll)) X, Y, Z = rotated[0] + x, rotated[1] + y, rotated[2] + z if Z > 0: x_2d = cam_params['fx'] * (X / Z) + cam_params['cx'] y_2d = cam_params['fy'] * (Y / Z) + cam_params['cy'] img_corners.append([x_2d, y_2d]) return img_corners

多视图情况:

多视图中的物体表示方法:

1,所有帧都以第一帧的相机坐标系为世界坐标系,直接预测物体在世界坐标系中的3D位置

2,每一帧都: 预测目标物体在当前帧的相机坐标系下的3d坐标,这样z_center就是对应的相对于当前帧的相机的深度

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/19 23:34:18

26、线程与文件管理:基础与高级操作

线程与文件管理:基础与高级操作 在计算机编程中,线程操作和文件管理是非常重要的两个方面。下面我们将详细介绍线程取款操作以及文件和目录管理的相关知识。 线程取款操作 在多线程环境中,对共享资源的操作需要进行同步控制,以避免数据竞争和不一致的问题。下面是一个取…

作者头像 李华
网站建设 2026/8/21 13:26:04

29、Unix 文件操作与管理全解析

Unix 文件操作与管理全解析 1. 文件删除与移动操作 1.1 文件删除 在 Unix 系统中, remove() 函数用于从文件系统中删除指定路径的文件或目录。其函数原型如下: #include <stdio.h> int remove (const char *path);若操作成功, remove() 会从文件系统中删除 …

作者头像 李华
网站建设 2026/8/21 4:34:04

30、深入理解 inotify 与内存管理

深入理解 inotify 与内存管理 1. inotify 简介与基本操作 inotify 是 Linux 系统中用于监控文件系统事件的机制。我们可以向一个已有的 inotify 实例添加新的监控项。示例代码如下: int wd; wd = inotify_add_watch (fd, "/etc", IN_ACCESS | IN_MODIFY); if (w…

作者头像 李华
网站建设 2026/8/21 7:38:33

32、深入理解内存管理:从严格别名到高级调试

深入理解内存管理:从严格别名到高级调试 1. 严格别名规则 在C和C++编程中,类型转换可能会违反严格别名规则,这是一个常被误解的概念。严格别名规则要求对象只能通过以下几种方式访问: - 对象的实际类型。 - 实际类型的限定版本(如 const 或 volatile )。 - 实际…

作者头像 李华
网站建设 2026/8/21 11:21:29

数美CTO梁堃:从人机对抗到智能进化,AI风控的下半场

本文转自《甲子光年》&#xff0c;作者王艺多2015 年&#xff0c;当移动互联网的流量红利见顶&#xff0c;黑灰产还停留在利用“按键精灵”和“群控设备”进行粗糙薅羊毛的阶段。十年过去&#xff0c;当我们站在 2025 年的门槛上回望&#xff0c;会发现那只是风控历史上的冷兵器…

作者头像 李华
网站建设 2026/8/21 4:11:37

【YOLO-Ultralytics】 EMA模型和普通模型的区别

【YOLO-Ultralytics】 EMA模型和普通模型的区别 文章目录【YOLO-Ultralytics】 EMA模型和普通模型的区别前言核心定义权重更新方式&#xff08;核心差异&#xff09;1. 普通模型的更新逻辑2. EMA模型的更新逻辑关键特性对比&#xff08;结合YOLO训练场景&#xff09;应用场景总…

作者头像 李华