IDS Nion 3D ToF相机:1.2MP深度传感为OMS/OOP提供高精度姿态检测

IDS Nion 3D ToF相机:1.2MP深度传感为OMS/OOP提供高精度姿态检测

核心参数

IDS Imaging 2026年发布 Nion 3D ToF 相机:

参数 规格
分辨率 1.2 MP (1280×960)
帧率 30 FPS
传感器 onsemi AR0130 深度传感器
深度精度 ±1mm(近距离)
工作距离 0.3m - 10m
光源 850nm / 940nm IR
功耗 < 5W

ToF 技术对比

3D 感知技术路线

技术 原理 优势 劣势 适用场景
ToF 飞行时间 高帧率、抗光照 分辨率受限 OMS/OOP
双目立体 视差 高分辨率 需要纹理、光照 室外场景
结构光 纹理投射 高精度 受光照影响 静态扫描
LiDAR 激光扫描 远距离 成本高 自动驾驶

Nion vs 竞品

参数 IDS Nion PMD PicoFlexx Azure Kinect Intel RealSense
分辨率 1280×960 224×172 640×576 1280×720
帧率 30 FPS 45 FPS 30 FPS 90 FPS
深度范围 0.3-10m 0.1-4m 0.25-5.5m 0.3-3m
功耗 <5W <2W 10W 3W
成本 ~$500 ~$300 $399 $249

OMS/OOP 应用

1. 乘员姿态检测

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Nion 3D ToFOMS 中的应用:

┌─────────────────────────────────────────────────────┐
│ 车顶安装 │
│ ↓ │
│ ┌─────────┐ │
│ │ Nion1.2MP 深度图 │
│ │ ToF │ ↓ │
│ └────┬────┘ │
│ │ │
│ 深度图 (1280×960)
│ │ │
│ ┌─────────┴─────────┐ │
│ │ 3D 姿态估计 │ │
│ └─────────┬─────────┘ │
│ │ │
│ ┌──────────────┼──────────────┐ │
│ ↓ ↓ ↓ │
│ ┌──────┐ ┌──────────┐ ┌──────────┐ │
│ │坐姿 │ │ OOP检测 │ │儿童座椅 │ │
│ │检测 │ │ 异常姿态 │ │ 识别 │ │
│ └──────┘ └──────────┘ └──────────┘ │
│ │
└─────────────────────────────────────────────────────┘

2. OOP 异常姿态检测

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
"""
基于 3D ToF 的 OOP 检测

使用 IDS Nion 深度图检测异常乘员姿态
"""

import numpy as np
from typing import Dict, List, Tuple

class OOPDetector:
"""
Out-of-Position 异常姿态检测器

使用 3D ToF 深度图
"""

def __init__(self, config: dict = None):
# 座椅位置(预设)
self.seat_positions = {
'driver': {'center': (200, 400, 500), 'size': (400, 400, 600)}, # mm
'passenger': {'center': (600, 400, 500), 'size': (400, 400, 600)},
'rear_left': {'center': (200, 800, 500), 'size': (400, 400, 600)},
'rear_right': {'center': (600, 800, 500), 'size': (400, 400, 600)},
}

# OOP 阈值
self.oop_thresholds = {
'head_to_dashboard': 300, # 头部到仪表盘最小距离 mm
'chest_to_airbag': 250, # 胸部到安全气囊最小距离 mm
'feet_on_dashboard': True, # 脚放在仪表盘上
'leaning_forward': 200, # 向前倾斜超过阈值 mm
'reclined_excessively': 45, # 座椅过度后仰角度
}

def detect_oop(
self,
depth_map: np.ndarray,
camera_params: dict
) -> Dict:
"""
检测异常姿态

Args:
depth_map: 深度图 (H, W),单位 mm
camera_params: 相机内参 {
'fx': float,
'fy': float,
'cx': float,
'cy': float
}

Returns:
{
'is_oop': bool,
'oop_type': str,
'severity': str,
'affected_zone': str
}
"""
# 1. 转换为 3D 点云
point_cloud = self.depth_to_pointcloud(depth_map, camera_params)

# 2. 分割乘员区域
occupant_regions = self.segment_occupants(point_cloud)

# 3. 检测每个乘员的 OOP
oop_results = []

for seat_name, points in occupant_regions.items():
# 3D 姿态估计
pose = self.estimate_pose(points)

# OOP 检测
oop = self.check_oop_conditions(pose, seat_name)

if oop['is_oop']:
oop_results.append({
'seat': seat_name,
**oop
})

return oop_results

def depth_to_pointcloud(
self,
depth_map: np.ndarray,
params: dict
) -> np.ndarray:
"""
深度图转 3D 点云

Args:
depth_map: (H, W) 深度图,单位 mm
params: 相机内参

Returns:
points: (N, 3) 点云,单位 mm
"""
H, W = depth_map.shape

# 创建像素坐标网格
u = np.arange(W)
v = np.arange(H)
u, v = np.meshgrid(u, v)

# 3D 坐标计算
fx, fy = params['fx'], params['fy']
cx, cy = params['cx'], params['cy']

x = (u - cx) * depth_map / fx
y = (v - cy) * depth_map / fy
z = depth_map

# 有效点
valid = depth_map > 0
points = np.stack([x[valid], y[valid], z[valid]], axis=-1)

return points

def estimate_pose(self, points: np.ndarray) -> Dict:
"""
从点云估计 3D 姿态

Returns:
{
'head_position': (x, y, z),
'chest_position': (x, y, z),
'orientation': (roll, pitch, yaw),
'skeleton': {...}
}
"""
# 简化:使用聚类估计头部和躯干
from sklearn.cluster import DBSCAN

clustering = DBSCAN(eps=50, min_samples=100).fit(points)
labels = clustering.labels_

# 找到最大的聚类(乘员主体)
unique_labels, counts = np.unique(labels[labels >= 0], return_counts=True)
main_label = unique_labels[np.argmax(counts)]
main_points = points[labels == main_label]

# 估计边界框
min_coords = main_points.min(axis=0)
max_coords = main_points.max(axis=0)

# 头部在顶部,躯干在中部
head_y_threshold = max_coords[1] - (max_coords[1] - min_coords[1]) * 0.3
head_points = main_points[main_points[:, 1] < head_y_threshold]
chest_points = main_points[main_points[:, 1] >= head_y_threshold]

head_position = head_points.mean(axis=0) if len(head_points) > 0 else None
chest_position = chest_points.mean(axis=0) if len(chest_points) > 0 else None

return {
'head_position': head_position,
'chest_position': chest_position,
'bounding_box': (min_coords, max_coords),
'point_count': len(main_points)
}

def check_oop_conditions(
self,
pose: Dict,
seat_name: str
) -> Dict:
"""
检查 OOP 条件
"""
oop_violations = []

head = pose['head_position']
chest = pose['chest_position']
bbox_min, bbox_max = pose['bounding_box']

seat = self.seat_positions.get(seat_name)
if not seat:
return {'is_oop': False}

# 1. 头部到仪表盘距离
if head is not None and seat_name == 'driver':
dashboard_x = seat['center'][0] - seat['size'][0] / 2 - 100
head_to_dashboard = head[0] - dashboard_x
if head_to_dashboard < self.oop_thresholds['head_to_dashboard']:
oop_violations.append('head_too_close')

# 2. 胸部到安全气囊距离
if chest is not None:
airbag_x = seat['center'][0] - seat['size'][0] / 2
chest_to_airbag = chest[0] - airbag_x
if chest_to_airbag < self.oop_thresholds['chest_to_airbag']:
oop_violations.append('chest_too_close')

# 3. 向前倾斜检测
if head is not None and chest is not None:
forward_lean = seat['center'][0] - head[0]
if forward_lean > self.oop_thresholds['leaning_forward']:
oop_violations.append('leaning_forward')

# 判断严重程度
if len(oop_violations) >= 2:
severity = 'severe'
elif len(oop_violations) == 1:
severity = 'moderate'
else:
severity = 'none'

return {
'is_oop': len(oop_violations) > 0,
'oop_type': oop_violations,
'severity': severity
}


# 使用示例
if __name__ == "__main__":
# 模拟相机参数(IDS Nion 1.2MP)
camera_params = {
'fx': 1000, # 焦距
'fy': 1000,
'cx': 640, # 光心
'cy': 480
}

# 模拟深度图
depth_map = np.random.randint(500, 2000, (960, 1280))

# OOP 检测
detector = OOPDetector()
results = detector.detect_oop(depth_map, camera_params)

print(f"检测到 {len(results)} 个 OOP")
for r in results:
print(f" 座位: {r['seat']}, 类型: {r['oop_type']}, 严重程度: {r['severity']}")

3. Euro NCAP OOP 场景

OOP 场景 检测方法 告警要求
头靠仪表盘 头部深度 < 阈值 禁用安全气囊
脚放仪表盘 下肢位置异常 警告
座椅过度后仰 姿态角度 > 45° 警告
儿童前排 体型识别 禁用安全气囊

与其他传感器融合

ToF + RGB 方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
ToF + RGB 融合架构:

┌─────────────────────────────────────────────────────┐
│ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ RGB 摄像头 │ │ ToF 相机 │ │
│ │ (2D 纹理) │ │ (3D 深度) │ │
│ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │
│ └───────────┬───────┘ │
│ │ │
│ ┌────────┴────────┐ │
│ │ 传感器融合 │ │
│ │ - 空间对齐 │ │
│ │ - 时序同步 │ │
│ │ - 数据融合 │ │
│ └────────┬────────┘ │
│ │ │
│ ┌───────────────┼───────────────┐ │
│ ↓ ↓ ↓ │
│ ┌───────┐ ┌───────────┐ ┌──────────┐ │
│ │乘员 │ │ 姿态估计 │ │ 儿童座椅 │ │
│ │分类 │ │ (3D) │ │ 检测 │ │
│ └───────┘ └───────────┘ └──────────┘ │
│ │
└─────────────────────────────────────────────────────┘

优势:
- RGB 提供纹理和语义
- ToF 提供精确深度
- 融合后可实现高精度 3D 姿态

融合代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
"""
ToF + RGB 融合
"""

import numpy as np
import cv2

class ToFRGBFusion:
"""
ToF 深度 + RGB 纹理融合
"""

def __init__(self, tof_params: dict, rgb_params: dict, extrinsics: dict):
self.tof_params = tof_params # ToF 内参
self.rgb_params = rgb_params # RGB 内参
self.extrinsics = extrinsics # 外参(相对位姿)

def align_depth_to_rgb(
self,
depth_tof: np.ndarray,
rgb_image: np.ndarray
) -> np.ndarray:
"""
将 ToF 深度图对齐到 RGB 图像坐标系

Args:
depth_tof: ToF 深度图 (H_tof, W_tof)
rgb_image: RGB 图像 (H_rgb, W_rgb, 3)

Returns:
depth_aligned: 对齐后的深度图 (H_rgb, W_rgb)
"""
# 1. 生成 ToF 相机 3D 点
H_tof, W_tof = depth_tof.shape
u_tof, v_tof = np.meshgrid(np.arange(W_tof), np.arange(H_tof))

fx_tof, fy_tof = self.tof_params['fx'], self.tof_params['fy']
cx_tof, cy_tof = self.tof_params['cx'], self.tof_params['cy']

x_tof = (u_tof - cx_tof) * depth_tof / fx_tof
y_tof = (v_tof - cy_tof) * depth_tof / fy_tof
z_tof = depth_tof

points_tof = np.stack([x_tof, y_tof, z_tof], axis=-1)

# 2. 转换到 RGB 相机坐标系
R = self.extrinsics['rotation'] # (3, 3)
t = self.extrinsics['translation'] # (3,)

points_rgb = np.dot(points_tof, R.T) + t

# 3. 投影到 RGB 图像平面
fx_rgb, fy_rgb = self.rgb_params['fx'], self.rgb_params['fy']
cx_rgb, cy_rgb = self.rgb_params['cx'], self.rgb_params['cy']

u_rgb = (points_rgb[..., 0] * fx_rgb / points_rgb[..., 2] + cx_rgb).astype(int)
v_rgb = (points_rgb[..., 1] * fy_rgb / points_rgb[..., 2] + cy_rgb).astype(int)
z_rgb = points_rgb[..., 2]

# 4. 生成对齐后的深度图
H_rgb, W_rgb = rgb_image.shape[:2]
depth_aligned = np.zeros((H_rgb, W_rgb), dtype=np.float32)

valid = (
(u_rgb >= 0) & (u_rgb < W_rgb) &
(v_rgb >= 0) & (v_rgb < H_rgb) &
(z_rgb > 0)
)

depth_aligned[v_rgb[valid], u_rgb[valid]] = z_rgb[valid]

return depth_aligned

def create_rgbd_image(
self,
depth_aligned: np.ndarray,
rgb_image: np.ndarray
) -> np.ndarray:
"""
创建 RGB-D 图像

Returns:
rgbd: (H, W, 4) [R, G, B, D]
"""
# 归一化深度用于可视化
depth_norm = cv2.normalize(
depth_aligned, None, 0, 255, cv2.NORM_MINMAX
).astype(np.uint8)

# 堆叠
rgbd = np.concatenate([
rgb_image,
depth_norm[..., np.newaxis]
], axis=-1)

return rgbd

IMS 部署建议

1. 硬件选型

场景 推荐方案 原因
高精度 OOP IDS Nion 1.2MP 分辨率最高
成本敏感 Intel RealSense D435 性价比高
车规级 TI OPA4788 + 定制 车规认证
与 DMS 共用 单 IR 摄像头 + 深度估计 成本最低

2. 安装位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
车内 ToF 安装位置:

前挡风玻璃
┌─────────────────────────┐
│ ┌───────┐ │ ← 顶棚中央(最佳)
│ │ ToF-1 │ │ 覆盖前排
│ └───────┘ │
│ │
│ [驾驶员] [乘客] │
│ │
│ ┌───────┐ │ ← 后排顶棚
│ │ ToF-2 │ │ 覆盖后排
│ └───────┘ │
└─────────────────────────┘

推荐:
- ToF-1: 前排 OMS + OOP
- ToF-2: 后排 CPD + OMS

3. 数据处理流水线

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
"""
IDS Nion 数据处理流水线
"""

import numpy as np
from typing import Dict

class NionPipeline:
"""
IDS Nion ToF 数据处理流水线
"""

def __init__(self, config: dict):
self.oop_detector = OOPDetector()
self.point_cloud_buffer = []
self.frame_rate = 30

def process_frame(self, frame: Dict) -> Dict:
"""
处理单帧 ToF 数据

Args:
frame: {
'depth': np.ndarray, # 深度图 (960, 1280)
'amplitude': np.ndarray, # 幅度图(置信度)
'timestamp': float
}

Returns:
{
'occupants': list, # 乘员列表
'oop_alerts': list, # OOP 告警
'child_seat': bool # 儿童座椅检测
}
"""
depth = frame['depth']
amplitude = frame['amplitude']

# 1. 深度图预处理
depth_filtered = self.filter_depth(depth, amplitude)

# 2. OOP 检测
oop_results = self.oop_detector.detect_oop(
depth_filtered,
self.get_camera_params()
)

# 3. 乘员分类(成人/儿童/儿童座椅)
occupants = self.classify_occupants(depth_filtered)

# 4. 儿童座椅检测
child_seat = self.detect_child_seat(depth_filtered)

return {
'occupants': occupants,
'oop_alerts': oop_results,
'child_seat': child_seat
}

def filter_depth(
self,
depth: np.ndarray,
amplitude: np.ndarray
) -> np.ndarray:
"""
深度图滤波

使用幅度图作为置信度
"""
# 移除低置信度点
confidence_threshold = 50 # 幅度阈值
valid = amplitude > confidence_threshold

depth_filtered = depth.copy()
depth_filtered[~valid] = 0

# 中值滤波去噪
import cv2
depth_filtered = cv2.medianBlur(
depth_filtered.astype(np.uint16), 5
)

return depth_filtered

总结

IDS Nion 3D ToF 相机的核心优势:

  1. 1.2MP 高分辨率 - 市面上最高分辨率 ToF
  2. 30 FPS 实时性 - 满足 OMS/OOP 实时检测
  3. ±1mm 深度精度 - 高精度姿态估计
  4. 低功耗 <5W - 适合车载部署

对 IMS 开发的启示:

  • ToF 是 OOP 检测的最佳选择
  • 1.2MP 分辨率满足精细姿态估计
  • 与 RGB 融合可提升语义理解
  • 为 Euro NCAP OOP 要求做好准备

IDS Nion 3D ToF相机:1.2MP深度传感为OMS/OOP提供高精度姿态检测
https://dapalm.com/2026/04/25/2026-04-25-ids-nion-3d-tof-oms-oop/
作者
Mars
发布于
2026年4月25日
许可协议