将无人机拍摄范围内要素投影到无人机图片中

1. 数据处理

复制代码
以大疆无人机为例,读取照片的内参,外参信息,其中外参以云台为主,内参搜索官方确定

2. 内外参数求解

2.1 相机内参矩阵‌K‌是相机固有属性,其标准形式如下:

K = \[fx, 0, cx,

0, fy, cy,

0, 0, 1\]

‌ 包括焦距fx、fy和主点cx,cy,fx为在感光元件上单位mm存在的像素数量,乘以焦距mm,最后的单位是像素

2.2 相机外参的推导

外参矩阵由旋转矩阵‌R‌和平移向量‌t‌组成,描述世界坐标系到相机坐标系的变换:‌P_c = R·P_w + t‌,旋转矩阵R的计算

已知欧拉角(航向角Yaw(Yaw+90)、俯仰角Pitch(无人机坐标系与常见空间坐标系不同:90+abs(Pitch))、横滚角Roll),需按特定顺序转换为旋转矩阵:

‌旋转顺序‌:通常为Z轴(Yaw) → Y轴(Pitch) → X轴(Roll)‌。

‌计算公式‌:

R_z(Yaw) = \[cosθ, -sinθ, 0, sinθ, cosθ, 0, 0,0,1]

R_y(Pitch) = \[cosθ, 0, sinθ, 0,1,0, -sinθ, 0, cosθ]

R_x(Roll) = \[1,0,0, 0,cosθ, -sinθ, 0,sinθ, cosθ]

最终旋转矩阵:‌R = R_x·R_y·R_z‌(注意顺序影响结果)‌27。

平移向量t的确定‌,已知条件‌:相机在世界坐标系中的空间坐标‌(x,y,z)‌,直接赋值‌:平移向量‌t = -R·x,y,z^T‌(需将相机位置转换到相机坐标系)‌。

  1. 外参矩阵的组合为3×4矩阵:

    复制代码
     	[ R | t ] = [[r11, r12, r13, tx],
     	             [r21, r22, r23, ty],
     	             [r31, r32, r33, tz]]

3. 转换代码

世界坐标系中,坐标转换到图片上:

复制代码
	Z·[u, v, 1]^T = K·[R | t]·[X, Y, Z, 1]^T

opencv-python代码如下:

python 复制代码
import cv2
import numpy as np

# ================== 输入已知参数 ==================
# 相机内参
fx, fy = 800, 800  # 焦距(像素单位)
cx, cy = 320, 240  # 主点坐标
camera_matrix = np.array([[fx, 0, cx],
                          [0, fy, cy],
                          [0, 0, 1]], dtype=np.float32)  # ‌:ml-citation{ref="1,4" data="citationList"}

# 相机在世界坐标系中的位置(单位:米)
camera_position = np.array([1.0, 2.0, 3.0], dtype=np.float32)  # (x,y,z) ‌:ml-citation{ref="3,6" data="citationList"}

# 欧拉角(单位:弧度)
yaw = np.deg2rad(30)    # 航向角(绕Z轴)
pitch = np.deg2rad(-15) # 俯仰角(绕Y轴)
roll = np.deg2rad(10)   # 横滚角(绕X轴) ‌:ml-citation{ref="2,3" data="citationList"}

# ================== 计算旋转矩阵 ==================
# 按Z→Y→X顺序构建旋转矩阵 ‌:ml-citation{ref="2,3" data="citationList"}
R_z = np.array([[np.cos(yaw), -np.sin(yaw), 0],
                [np.sin(yaw), np.cos(yaw), 0],
                [0, 0, 1]], dtype=np.float32)  # Z轴旋转

R_y = np.array([[np.cos(pitch), 0, np.sin(pitch)],
                [0, 1, 0],
                [-np.sin(pitch), 0, np.cos(pitch)]], dtype=np.float32)  # Y轴旋转

R_x = np.array([[1, 0, 0],
                [0, np.cos(roll), -np.sin(roll)],
                [0, np.sin(roll), np.cos(roll)]], dtype=np.float32)  # X轴旋转

R = R_x @ R_y @ R_z  # 组合旋转矩阵 ‌:ml-citation{ref="2,3" data="citationList"}

# ================== 计算平移向量 ==================
t = -R @ camera_position.reshape(3,1)  # ‌:ml-citation{ref="3,6" data="citationList"}

# ================== 外参矩阵合成 ==================
extrinsic_matrix = np.hstack([R, t])  # 3x4矩阵 ‌:ml-citation{ref="3,4" data="citationList"}

# ================== 验证投影 ==================
# 世界坐标系中的点(单位:米)
world_point = np.array([0, 0, 0, 1], dtype=np.float32).reshape(4,1)

# 投影到像素坐标系
projected = camera_matrix @ extrinsic_matrix @ world_point
pixel_coord = (projected / projected‌:ml-citation{ref="2" data="citationList"}).flatten()[:2]  # 归一化 ‌:ml-citation{ref="4,6" data="citationList"}

print("内参矩阵 K:\n", camera_matrix)
print("外参矩阵 [R|t]:\n", extrinsic_matrix)
print("世界原点投影坐标:", pixel_coord)

求解过程可通过cv2.projectPoints()函数验证更复杂场景的投影精度‌

相关推荐
兵慌码乱9 天前
基于 MediaPipe 与 PySide2 的手势交互音乐控制系统实现:轻量化视觉交互全流程解析
python·opencv·计算机视觉·人机交互·手势识别·mediapipe·pyside2
24年生活经验_小旻13 天前
ROS2+Ardupilot+Gazebo通信仿真基本环境搭建
无人机
嘉子的秃头日记14 天前
TRO 2026|无人机能不能像积木一样,拼出不同形态?
无人机
梦想三三14 天前
OpenCV银行卡数字识别项目(图像预处理与字符分割)
人工智能·opencv·计算机视觉
YOLO数据集集合14 天前
无人机航拍地质灾害智能识别 山体滑坡实例分割数据集落地实战 | 泥石流监测 道路险情封堵 深度学习模型训练方案10296期
人工智能·深度学习·yolo·目标检测·无人机
武子康14 天前
调查研究-180 roboflow/supervision:计算机视觉工程里的“胶水层“,为什么值得关注?
人工智能·opencv·计算机视觉·chatgpt·llm·向量化
海砥装备HardAus14 天前
大载重工业无人机高空风扰建模与ADRC自抗扰抗风控制实现
无人机·adrc·工业无人机
海砥装备HardAus14 天前
大载重工业无人机动力容错控制:单电机失效下的应急重构算法设计
算法·重构·嵌入式·无人机
中科固源14 天前
飞控里的“暗战”:无人机软件栈中的控制权风险
网络安全·无人机·低空经济
YOLO数据集集合14 天前
无人机风电设备智能巡检 风机叶片缺陷目标检测数据集实战 | 表面腐蚀漏油识别 工业视觉质检 深度学习模型训练落地10337期
人工智能·深度学习·目标检测·计算机视觉·无人机