Zed相机的驱动安装和图像视频获取

和众多的深度相机一样,下载SDK,然后SDK里有个上位机可以用来快速的获取视频和可视化,然后还有一套ROS,C++,python的API可以编写一些定制程序。

型号

image-20250216161117215

型号 ZED mini垃圾 ZED 2 黑色的 ZED白色的 最垃圾 ZED 2I 想要的
特点 不写了自己看
帧率
陀螺仪

驱动安装

ZED SDK-Python 的环境后面装

我的cuda环境:cuda12.4

参考官网的下载方式是SDK,针对不同硬件平台和cuda版本下载不同的SDK版本,这里下载的SDK版本号是4.2。

image-20250216130038994
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
$ sh ./ZED_SDK_Ubuntu22_cuda12.1_v4.2.5.zstd.run

Verifying archive integrity... 100% MD5 checksums are OK. All good.
Uncompressing 'ZED camera SDK by Stereolabs (Use 'sudo apt install zstd' if zstd is not found)' 100%
Ubuntu version 22.04 detected. OK
To continue you have to accept the EULA. Accept [Y/n] ?y
Installing...Python 的环境后面装
Installation path: /usr/local/zed #安装路径,tools samples都在这
Checking CUDA version...
OK: Found CUDA 12.4 # 查cuda版本,找不到输出一下路径
Do you want to also install the static version of the ZED SDK (AI module will still require libsl_ai.so) [Y/n] ?y # 必须的
Do you want to install the AI module (required for Object detection and Neural Depth, recommended), cuDNN 8.9 and TensorRT 8.6 will be installed [Y/n] ?y # 这个就是是否需要下载他写好的深度学习的一些方法,可以识别物体这类的,没必要
Install samples (recommended) [Y/n] ?y # sample还是很有必要的,得看看api怎么用的
Installation path: /usr/local/zed/samples/ # sample的路径
Do you want to auto-install dependencies (recommended) ? following packet will be installed via the package manager : libjpeg-turbo8 libturbojpeg libusb-1.0-0 libusb-1.0-0-dev libopenblas-dev libarchive-dev libv4l-0 curl unzip zlib1g mesa-utils libpng-dev python3-dev python3-pip python3-setuptools libglew-dev freeglut3-dev qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools libqt5opengl5 libqt5svg5 [Y/n] ?y # 装啊,还能不装?
Do you want to install the Python API (recommended) [Y/n] ?N # 这里装的不好,需要指定python的路径,建议看下面python的是怎么安装的
Please specify your python executable: python3 # 这里直接摁了回车 ,我感觉得提前构建一个环境给zed
Requirement already satisfied: numpy in /home/outbreak/anaconda3/lib/python3.11/site-packages (1.24.3)
Requirement already satisfied: requests in /home/outbreak/anaconda3/lib/python3.11/site-packages (2.31.0)
Requirement already satisfied: charset-normalizer<4,>=2 in /home/outbreak/anaconda3/lib/python3.11/site-packages (from requests) (2.0.4)
Requirement already satisfied: idna<4,>=2.5 in /home/outbreak/anaconda3/lib/python3.11/site-packages (from requests) (3.4)
Requirement already satisfied: urllib3<3,>=1.21.1 in /home/outbreak/anaconda3/lib/python3.11/site-packages (from requests) (1.26.16)
Requirement already satisfied: certifi>=2017.4.17 in /home/outbreak/anaconda3/lib/python3.11/site-packages (from requests) (2023.7.22)

ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
tables 3.8.0 requires blosc2~=2.0.0, which is not installed.
gensim 4.3.0 requires FuzzyTM>=0.4.0, which is not installed.
numba 0.57.1 requires numpy<1.25,>=1.21, but you have numpy 1.26.4 which is incompatible.
Successfully installed cython-3.0.12 numpy-1.24.3 pyzed-4.2
Done
To install it later or on a different environment run :
python -m pip install --ignore-installed /tmp/selfgz29281/pyzed-4.2-cp311-cp311-linux_x86_64.whl
The ZED Python API was installed for 'python3' #这里是报错了,自动安装到anaconda里了,然后有几个下载的package,有的没装,之后自己装吧,但是没关系,因为ZED SDK 安装文件夹中有一个 Python 脚本(get_python_api.py),可以自动检测操作系统、CUDA 和 Python 版本并下载相应的预编译 Python API 包(pyzed)。大家都是安装zedsdk时候不安装这个pythonAPI,然后后面自己安装

Do you want to run the ZED Diagnostic to download all AI models [Y/n] ?y # 深度学习的model,可以不用
Downloading all AI models
Downloading: MULTI CLASS DETECTION...
/usr/local/zed/resources/objects_ 100%[=============================================================>] 35.84M 10.4MB/s 用时 3.7s
Downloading: MULTI CLASS MEDIUM DETECTION...

Do you want to run the ZED Diagnostic to optimize all AI models, it may take a very long time, up to multiple hours but will be done only once. Otherwise it will be optimized just in time when running the ZED SDK [Y/n] ?n # 对不起我赶时间,这个优化我不装了

安装ZED-Python-API(pyzed)-针对conda

ZED SDK 安装文件夹/usr/local/zed中有一个 Python 脚本(get_python_api.py),可以自动检测操作系统、CUDA 和 Python 版本并下载相应的预编译 Python API 的whl包(pyzed)。

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
$ cd /usr/local/zed
$ conda activate ZED #先激活conda还环境,因为这个脚本需要查看python版本和python路径
$ python get_python_api.py

Detected platform:
linux_x86_64
Python 3.10
ZED SDK 4.2
-> Checking if https://download.stereolabs.com/zedsdk/4.2/whl/linux_x86_64/pyzed-4.2-cp310-cp310-linux_x86_64.whl exists and is available
-> Found ! Downloading python package into /usr/local/zed/pyzed-4.2-cp310-cp310-linux_x86_64.whl
-> Installing necessary dependencies
Requirement already satisfied: numpy in /home/outbreak/anaconda3/envs/pytorch2/lib/python3.10/site-packages (1.26.4)
Processing ./pyzed-4.2-cp310-cp310-linux_x86_64.whl
Collecting numpy<2.0,>=1.13 (from pyzed==4.2)
Downloading numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (61 kB)
Collecting cython>=3.0.0 (from pyzed==4.2)
Downloading Cython-3.0.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (3.3 kB)
Downloading Cython-3.0.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.6 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.6/3.6 MB 4.6 MB/s eta 0:00:00
Downloading numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (18.2 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 18.2/18.2 MB 5.0 MB/s eta 0:00:00
Installing collected packages: numpy, cython, pyzed
Successfully installed cython-3.0.12 numpy-1.26.4 pyzed-4.2
Done
To install it later or on a different environment run :
python -m pip install --ignore-installed /usr/local/zed/pyzed-4.2-cp310-cp310-linux_x86_64.whl


$ python -m pip install --ignore-installed /usr/local/zed/pyzed-4.2-cp310-cp310-linux_x86_64.whl
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
这个脚本可以测试又没有安装好,这里方便复制,其实就是下面的sample的第一个
import pyzed.sl as sl
def main():
# Create a Camera object
zed = sl.Camera()

# Create a InitParameters object and set configuration parameters
init_params = sl.InitParameters()
init_params.sdk_verbose = False

# Open the camera
err = zed.open(init_params)
if err != sl.ERROR_CODE.SUCCESS:
exit(1)

# Get camera information (ZED serial number)
zed_serial = zed.get_camera_information().serial_number
print("Hello! This is my serial number: {0}".format(zed_serial))

# Close the camera
zed.close()


if __name__ == "__main__":
main()


# 发现报错,这个报错很常见,自己搜一下
Traceback (most recent call last):
File "/home/outbreak/ZED/samples/tutorials/tutorial 1 - hello ZED/python/hello_zed.py", line 21, in <module>
import pyzed.sl as sl
ImportError: /home/outbreak/anaconda3/envs/pytorch2/bin/../lib/libstdc++.so.6: version `GLIBCXX_3.4.30' not found (required by /usr/local/zed/lib/libsl_zed.so)
#解决方法:ln -sf /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /home/outbreak/anaconda3/envs/pytorch2/bin/../lib/libstdc++.so.6

上位机的使用

这玩意有多个上位机,可以直接命令行输入命令运行,这些软件的位置都在tools里

1
2
3
/usr/local/zed/tools/ZED Depth Viewer
ZED360 ZED_Depth_Viewer ZED_Explorer ZED_Sensor_Viewer
ZED_Calibration ZED_Diagnostic ZEDfu ZED_SVO_Editor

ZED Explorer

ZED Explorer是ZED实时预览和录制的应用程序。它允许您更改视频分辨率、纵横比和相机参数,并捕获高分辨率快照和3D视频。
如果ZED被您的计算机识别,您将看到来自相机的3D视频。

image-20250216134044179

ZED Depth Viewer

ZED Depth Viewer使用ZED SDK捕获和显示深度图和3D点云。运行ZED Depth Viewer,检查深度图是否正确显示。尝试不同的深度模式,以选择最适合您的深度质量/性能比。

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
工业垃圾,写的一托,相机打不开
ZED_Depth_Viewer
[2025-02-16 05:49:06 UTC][ZED][INFO] Logging level INFO
[2025-02-16 05:49:06 UTC][ZED][INFO] Logging level INFO
[2025-02-16 05:49:06 UTC][ZED][INFO] [Init] Depth mode: ULTRA
[2025-02-16 05:49:07 UTC][ZED][INFO] [Init] Camera successfully opened.
[2025-02-16 05:49:07 UTC][ZED][INFO] [Init] Camera FW version: 1523
[2025-02-16 05:49:07 UTC][ZED][INFO] [Init] Video mode: HD1080@30
[2025-02-16 05:49:07 UTC][ZED][INFO] [Init] Serial Number: S/N 25939373
in bool ImageHandler::initialize(sl::Mat&) : Err [999]: unknown error.
Stack trace (most recent call last):
#26 Object "[0xffffffffffffffff]", at 0xffffffffffffffff, in
#25 Object "ZED_Depth_Viewer", at 0x64b315f97e44, in
#24 Object "/lib/x86_64-linux-gnu/libc.so.6", at 0x77912ce29e3f, in __libc_start_main
#23 Object "/lib/x86_64-linux-gnu/libc.so.6", at 0x77912ce29d8f, in
#22 Object "ZED_Depth_Viewer", at 0x64b315f97061, in
#21 Object "ZED_Depth_Viewer", at 0x64b315fc841d, in
#20 Object "ZED_Depth_Viewer", at 0x64b315fc341e, in
#19 Object "ZED_Depth_Viewer", at 0x64b315fdc499, in
#18 Object "/lib/x86_64-linux-gnu/libQt5Core.so.5", at 0x77912d8b875a, in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>)
#17 Object "/lib/x86_64-linux-gnu/libQt5Core.so.5", at 0x77912d9130b7, in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>)
#16 Object "/lib/x86_64-linux-gnu/libglib-2.0.so.0", at 0x77912d1193e2, in g_main_context_iteration
#15 Object "/lib/x86_64-linux-gnu/libglib-2.0.so.0", at 0x77912d1712b7, in
#14 Object "/lib/x86_64-linux-gnu/libglib-2.0.so.0", at 0x77912d11bd3a, in g_main_context_dispatch
#13 Object "/lib/x86_64-linux-gnu/libQt5Core.so.5", at 0x77912d912d33, in
#12 Object "/lib/x86_64-linux-gnu/libQt5Core.so.5", at 0x77912d9123ea, in QTimerInfoList::activateTimers()
#11 Object "/lib/x86_64-linux-gnu/libQt5Core.so.5", at 0x77912d8b9e39, in QCoreApplication::notifyInternal2(QObject*, QEvent*)
#10 Object "/lib/x86_64-linux-gnu/libQt5Widgets.so.5", at 0x77912e56c712, in QApplicationPrivate::notify_helper(QObject*, QEvent*)
#9 Object "/lib/x86_64-linux-gnu/libQt5Core.so.5", at 0x77912d8e733e, in QObject::event(QEvent*)
#8 Object "/lib/x86_64-linux-gnu/libQt5Core.so.5", at 0x77912d8f57fd, in QTimer::timeout(QTimer::QPrivateSignal)
#7 Object "/lib/x86_64-linux-gnu/libQt5Core.so.5", at 0x77912d8f17c7, in
#6 Object "ZED_Depth_Viewer", at 0x64b315fc8eec, in
#5 Object "ZED_Depth_Viewer", at 0x64b315fc4434, in
#4 Object "ZED_Depth_Viewer", at 0x64b315fd48d3, in
#3 Object "ZED_Depth_Viewer", at 0x64b315fd3368, in
#2 Object "ZED_Depth_Viewer", at 0x64b31603654d, in
#1 Object "ZED_Depth_Viewer", at 0x64b315ff272d, in
#0 Object "/lib/x86_64-linux-gnu/libcuda.so.1", at 0x779139af30e9, in
Segmentation fault (Address not mapped to object [0x1500000015])
[1] 4712 segmentation fault (core dumped) ZED_Depth_Viewer

工业垃圾的上位机bug一堆

用上位机看zed mini深度图,看不到,还把我系统的所有小图表都崩没了,然后还卡住了,垃圾至极。比realsense不知道拉到哪里去了。

ZED Sensor Viewer

能看到当前的陀螺仪,加速度,磁力计数据。

image-20250216133853582

SED_SVO_Editor

ZED tutorials

ZED SDK包括几个教程和示例,用于学习如何使用视频、深度、位置跟踪、地图和其他信息,以及许多第三方集成。自己看吧。代码路径在/usr/local/zed/samples/tutorials里面

Tutorial Description Link
Hello ZED This is the simplest tutorial. It shows how to open a stereo camera and print its serial number in the terminal. [C++](https://github.com/stereolabs/zed-examples/tree/master/tutorials/tutorial 1 - hello ZED/cpp/) [Python](https://github.com/stereolabs/zed-examples/tree/master/tutorials/tutorial 1 - hello ZED/python/)
Image Capture Shows how to open a stereo camera, capture an image and print its timestamp and image size in the terminal. [C++](https://github.com/stereolabs/zed-examples/tree/master/tutorials/tutorial 2 - image capture/cpp/) [Python](https://github.com/stereolabs/zed-examples/tree/master/tutorials/tutorial 2 - image capture/python/)
Depth Perception Shows how to retrieve the depth and point cloud of a scene, and print the distance of a given point in the terminal. [C++](https://github.com/stereolabs/zed-examples/tree/master/tutorials/tutorial 3 - depth sensing/cpp/) [Python](https://github.com/stereolabs/zed-examples/tree/master/tutorials/tutorial 3 - depth sensing/python/)
Camera Tracking Shows how to enable positional tracking and get the position and orientation of the camera in real time. [C++](https://github.com/stereolabs/zed-examples/tree/master/tutorials/tutorial 4 - positional tracking/cpp/) [Python](https://github.com/stereolabs/zed-examples/tree/master/tutorials/tutorial 4 - positional tracking/python/)
Spatial Mapping Shows how to enable spatial mapping and capture a mesh or fused point cloud of the environment. [C++](https://github.com/stereolabs/zed-examples/tree/master/tutorials/tutorial 5 - spatial mapping/cpp/) [Python](https://github.com/stereolabs/zed-examples/tree/master/tutorials/tutorial 5 - spatial mapping/python/)
3D Object Detection Shows how to detect objects in a scene and localize them in 3D. [C++](https://github.com/stereolabs/zed-examples/tree/master/tutorials/tutorial 6 - object detection/cpp/) [Python](https://github.com/stereolabs/zed-examples/tree/master/tutorials/tutorial 6 - object detection/python/)
Using Sensors Shows how to acquire IMU, barometer and magnetometer data. [C++](https://github.com/stereolabs/zed-examples/tree/master/tutorials/tutorial 7 - sensor data/cpp/) [Python](https://github.com/stereolabs/zed-examples/tree/master/tutorials/tutorial 7 - sensor data/python/)
3D Body Tracking Shows how to detect human body skeletons in a 3D scene. [C++](https://github.com/stereolabs/zed-examples/tree/master/tutorials/tutorial 7 - sensor data/cpp/) [Python](https://github.com/stereolabs/zed-sdk/tree/master/tutorials/tutorial 8 - body tracking/python)
Geo-tracking Shows how to use the Geo-tracking Fusion API to display fused GNSS and positional tracking data on a map. [C++](https://github.com/stereolabs/zed-examples/tree/master/tutorials/tutorial 7 - sensor data/cpp/) [Python](https://github.com/stereolabs/zed-sdk/tree/master/tutorials/tutorial 8 - body tracking/python)

只讲解深度图/视差图/彩色图获取

要获得数据,首先要使用grab函数获得数据

然后通过retrieve_image函数获得每个视角的彩色图等

然后通过retrieve_measure函数获得每个视角的深度图视差图等

默认名称获得的是左视角的深度图和视差图,比如说DEPTH是指左目的深度图,如果想获得右目的,那就得参数为DEPTH_RIGHT

Enumerator
DISPARITY Disparity map. Each pixel contains 1 float. Type: sl.MAT_TYPE.F32_C1
DEPTH Depth map in sl.UNIT defined in sl.InitParameters.coordinate_units. Each pixel contains 1 float. Type: sl.MAT_TYPE.F32_C1
CONFIDENCE Certainty/confidence of the depth map. Each pixel contains 1 float. Type: sl.MAT_TYPE.F32_C1
XYZ Point cloud. Each pixel contains 4 float (X, Y, Z, not used). Type: sl.MAT_TYPE.F32_C4
XYZRGBA Colored point cloud. Each pixel contains 4 float (X, Y, Z, color). The color should to be read as an unsigned char[4] representing the RGBA color. Type: sl.MAT_TYPE.F32_C4
XYZBGRA Colored point cloud. Each pixel contains 4 float (X, Y, Z, color). The color should to be read as an unsigned char[4] representing the BGRA color. Type: sl.MAT_TYPE.F32_C4
XYZARGB Colored point cloud. Each pixel contains 4 float (X, Y, Z, color). The color should to be read as an unsigned char[4] representing the ARGB color. Type: sl.MAT_TYPE.F32_C4
XYZABGR Colored point cloud. Each pixel contains 4 float (X, Y, Z, color). The color should to be read as an unsigned char[4] representing the ABGR color. Type: sl.MAT_TYPE.F32_C4
NORMALS Normal vectors map. Each pixel contains 4 float (X, Y, Z, 0). Type: sl.MAT_TYPE.F32_C4
DISPARITY_RIGHT Disparity map for right sensor. Each pixel contains 1 float. Type: sl.MAT_TYPE.F32_C1
DEPTH_RIGHT Depth map for right sensor. Each pixel contains 1 float. Type: sl.MAT_TYPE.F32_C1
XYZ_RIGHT Point cloud for right sensor. Each pixel contains 4 float (X, Y, Z, not used). Type: sl.MAT_TYPE.F32_C4
XYZRGBA_RIGHT Colored point cloud for right sensor. Each pixel contains 4 float (X, Y, Z, color). The color needs to be read as an unsigned char[4] representing the RGBA color. Type: sl.MAT_TYPE.F32_C4
XYZBGRA_RIGHT Colored point cloud for right sensor. Each pixel contains 4 float (X, Y, Z, color). The color needs to be read as an unsigned char[4] representing the BGRA color. Type: sl.MAT_TYPE.F32_C4
XYZARGB_RIGHT Colored point cloud for right sensor. Each pixel contains 4 float (X, Y, Z, color). The color needs to be read as an unsigned char[4] representing the ARGB color. Type: sl.MAT_TYPE.F32_C4
XYZABGR_RIGHT Colored point cloud for right sensor. Each pixel contains 4 float (X, Y, Z, color). The color needs to be read as an unsigned char[4] representing the ABGR color. Type: sl.MAT_TYPE.F32_C4
NORMALS_RIGHT Normal vectors map for right view. Each pixel contains 4 float (X, Y, Z, 0). Type: sl.MAT_TYPE.F32_C4
DEPTH_U16_MM Depth map in millimeter whatever the sl.UNIT defined in sl.InitParameters.coordinate_units. Invalid values are set to 0 and depth values are clamped at 65000. Each pixel contains 1 unsigned short. Type: sl.MAT_TYPE.U16_C1
DEPTH_U16_MM_RIGHT Depth map in millimeter for right sensor. Each pixel contains 1 unsigned short. Type: sl.MAT_TYPE.U16_C1
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
########################################################################
#
# Copyright (c) 2022, STEREOLABS.
#
# All rights reserved.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# 我自己根据官方的sample改的
########################################################################

import os
import pyzed.sl as sl
import cv2
import numpy as np
def print_camera_information(cam_info):
print("ZED Model : {0}".format(cam_info.camera_model))
print("ZED Serial Number : {0}".format(cam_info.serial_number))
print("ZED Camera Firmware : {0}/{1}".format(cam_info.camera_configuration.firmware_version,
cam_info.sensors_configuration.firmware_version))
print("ZED Camera Resolution : {0}x{1}".format(round(cam_info.camera_configuration.resolution.width, 2),
cam_info.camera_configuration.resolution.height))
print("ZED Camera FPS : {0}".format(int(cam_info.camera_configuration.fps))
)
def main():
# 找到相机,创建相机对象
zed = sl.Camera()
# 这个param需要设置开启相机的参数
init_params = sl.InitParameters()
# 这里要获得左右视差图,深度图,点云数据,所以要开启右侧测量
init_params.enable_right_side_measure=True
# 拍摄2k的图像,或者1080,720,参数查询https://www.stereolabs.com/docs/api/python/classpyzed_1_1sl_1_1RESOLUTION.html
init_params.camera_resolution = sl.RESOLUTION.HD720 # Use HD2K HD720 opr HD1200 video mode, depending on camera type.
# 存图路径
filefolder_name = "2_720"
# init_params.camera_fps = 30 # Set fps at 30
# 这里是所有更改的参数,请配合SetCameraSettings文件使用
zed.set_camera_settings(sl.VIDEO_SETTINGS.LED_STATUS, True)
zed.set_camera_settings(sl.VIDEO_SETTINGS.BRIGHTNESS, -1)
zed.set_camera_settings(sl.VIDEO_SETTINGS.CONTRAST, -1)
zed.set_camera_settings(sl.VIDEO_SETTINGS.HUE, -1)
zed.set_camera_settings(sl.VIDEO_SETTINGS.SATURATION, -1)
zed.set_camera_settings(sl.VIDEO_SETTINGS.SHARPNESS, -1)
zed.set_camera_settings(sl.VIDEO_SETTINGS.GAIN, -1)
zed.set_camera_settings(sl.VIDEO_SETTINGS.EXPOSURE, -1)
zed.set_camera_settings(sl.VIDEO_SETTINGS.WHITEBALANCE_TEMPERATURE, -1)
print("[Sample] Reset all settings to default")
err = zed.open(init_params)
if err != sl.ERROR_CODE.SUCCESS:
print("Camera Open : "+repr(err)+". Exit program.")
exit()
# Capture flag
i = 0
image_left = sl.Mat() # 图像
disparity_left = sl.Mat() # 视差值
dep_left = sl.Mat() # 深度图
depth_left = sl.Mat() # 深度值
point_cloud_left = sl.Mat() # 点云数据

image_right = sl.Mat() # 图像
disparity_right = sl.Mat() # 视差值
dep_right = sl.Mat() # 深度图
depth_right = sl.Mat() # 深度值
point_cloud_right = sl.Mat() # 点云数据
runtime_parameters = sl.RuntimeParameters()
# 获取分辨率
cam_info = zed.get_camera_information()
print_camera_information(cam_info)
w, h = cam_info.camera_configuration.resolution.width , cam_info.camera_configuration.resolution.height
x,y = int(w/2),int(h/2) # 中心点

# 获得当前相机的两个相机的标定参数,Intrinsics and extrinsic stereo parameters for rectified/undistorted images.
calibration_params = zed.get_camera_information().camera_configuration.calibration_parameters
# Focal length of the left eye in pixels
focal_left_x = calibration_params.left_cam.fx
focal_left_y = calibration_params.left_cam.fy
opticalCenter_left_x = calibration_params.left_cam.cx
opticalCenter_left_y = calibration_params.left_cam.cy
distolist_lfet = calibration_params.left_cam.disto
focal_length_meteric_left = calibration_params.left_cam.focal_length_metric

# Focal length of the right eye in pixels
focal_right_x = calibration_params.right_cam.fx
focal_right_y = calibration_params.right_cam.fy
opticalCenter_right_x = calibration_params.right_cam.cx
opticalCenter_right_y = calibration_params.right_cam.cy
distolist_right = calibration_params.right_cam.disto
focal_length_meteric_right = calibration_params.right_cam.focal_length_metric

print('左目焦距',focal_left_x,focal_left_y,'右目焦距',focal_right_x,focal_right_y)
print('左目光心',opticalCenter_left_x,opticalCenter_left_y,'右目光心',opticalCenter_right_x,opticalCenter_right_y)
print('左目畸变参数',distolist_lfet,'右目畸变参数',distolist_right)
print('左目焦距',focal_length_meteric_left,'右目焦距',focal_length_meteric_right)

# 获得双目的联合标定参数,看看需要什么
# get translation and rotation
rotation = calibration_params.stereo_transform.get_rotation_matrix()# 3*3 matrix sl.Matrix3f
translation = calibration_params.stereo_transform.get_translation().get() # [tx, ty, tz]
# Returns the baseline of the camera in the sl.UNIT defined in sl.InitParameters.coordinate_units.
baseline = calibration_params.get_camera_baseline()
# Translation between left and right eye on x-axis
tx = calibration_params.stereo_transform.get_translation().get()[0]
print('平移向量',translation)
print('旋转矩阵',rotation)
print('双目基线',baseline,'左右相机的x轴平移',tx)
# 导出标定参数到txt文件
with open(filefolder_name+"/calibration_parameters.txt", "w", encoding="utf-8") as file:
file.write("左目焦距: fx = {0}, fy = {1}\n".format(focal_left_x, focal_left_y))
file.write("右目焦距: fx = {0}, fy = {1}\n".format(focal_right_x, focal_right_y))
file.write("左目光心: cx = {0}, cy = {1}\n".format(opticalCenter_left_x, opticalCenter_left_y))
file.write("右目光心: cx = {0}, cy = {1}\n".format(opticalCenter_right_x, opticalCenter_right_y))
file.write("畸变参数格式: [k1, k2, p1, p2, k3, k4, k5, k6, s1, s2, s3, s4]\n")
file.write("左目畸变参数: {}\n".format(distolist_lfet))
file.write("右目畸变参数: {}\n".format(distolist_right))
file.write("左目焦距 (米): {}\n".format(focal_length_meteric_left))
file.write("右目焦距 (米): {}\n".format(focal_length_meteric_right))
file.write("双目基线: {}\n".format(baseline))
file.write("左右相机的x轴平移: {}\n".format(tx))
file.write("旋转矩阵: {}\n".format(rotation))
file.write("平移向量: {}\n".format(translation))
while True:
# 获取最新的图像,修正它们,并基于提供的RuntimeParameters(深度,点云,跟踪等)计算测量值。
if zed.grab(runtime_parameters) == sl.ERROR_CODE.SUCCESS: # 相机成功获取图象
timestamp = zed.get_timestamp(sl.TIME_REFERENCE.CURRENT) # 获取图像被捕获时的时间点,用于图像命名
# 获取左目图像
zed.retrieve_image(image_left, sl.VIEW.LEFT) # image:容器,sl.VIEW.LEFT:内容
d_image_left = image_left.get_data() # 转换成图像数组,便于后续的显示或者储存
# 获取视差值
zed.retrieve_measure(disparity_left,sl.MEASURE.DISPARITY,sl.MEM.CPU)
d_disparity_left = disparity_left.get_data()
zed.retrieve_image(dep_left,sl.VIEW.DEPTH) # 深度图
d_dep_left = dep_left.get_data()
# 获取深度
zed.retrieve_measure(depth_left,sl.MEASURE.DEPTH,sl.MEM.CPU) # 深度值
d_depth_left = depth_left.get_data()
# 获取点云
zed.retrieve_measure(point_cloud_left,sl.MEASURE.XYZBGRA,sl.MEM.CPU)
d_point_map_left = point_cloud_left.get_data()

# 获取左目图像
zed.retrieve_image(image_right, sl.VIEW.RIGHT) # image:容器,sl.VIEW.right:内容
d_image_right = image_right.get_data() # 转换成图像数组,便于后续的显示或者储存
# 获取视差值
zed.retrieve_measure(disparity_right,sl.MEASURE.DISPARITY_RIGHT ,sl.MEM.CPU)
d_disparity_right = disparity_right.get_data()
# 获取深度
zed.retrieve_measure(depth_right,sl.MEASURE.DEPTH_RIGHT,sl.MEM.CPU) # 深度值
d_depth_right = depth_right.get_data()
zed.retrieve_image(dep_right,sl.VIEW.DEPTH_RIGHT) # 深度图
d_dep_right = dep_right.get_data()
# 获取点云
zed.retrieve_measure(point_cloud_right,sl.MEASURE.XYZBGRA_RIGHT,sl.MEM.CPU)
d_point_cloud_right = point_cloud_right.get_data()

print('时间点',timestamp.get_seconds(),'中心点视差值',d_disparity_left[x,y],'中心点深度值',d_depth_left[x,y],'中心点云数据',d_point_map_left[x,y])
# 利用cv2.imshow显示视图,并对想要的视图进行保存
view_color = np.concatenate((cv2.resize(d_image_left,(640,360)),cv2.resize(d_image_right,(640,360))),axis=1)
cv2.imshow("ColorImage", view_color)
view_depth = np.concatenate((cv2.resize(d_dep_left,(640,360)),cv2.resize(d_dep_right,(640,360))),axis=1)
cv2.imshow("DepthImage", view_depth)
key = cv2.waitKey(1)
if key & 0xFF == ord('q'): # q退出
break
if key & 0xFF == ord('s'): # 图像保存
timestamp_ms = timestamp.get_milliseconds()
savePath = os.path.join(filefolder_name + "/images", "left_{:0>3d}.png".format(i)) # 注意根目录是否存在"./images"文件夹
cv2.imwrite(savePath, d_image_left)
savePath = os.path.join(filefolder_name+ "/images", "right_{:0>3d}.png".format(i))
cv2.imwrite(savePath, d_image_right)
i = i + 1
# Close the camera
zed.close()

if __name__ == "__main__":
main()


image-20250216160621095

Sample usage

Sample Description Link
Camera Control Shows how camera settings like Exposure, Gain, Contrast, Sharpness, etc. can be modified and display the resulting image. [C++](https://github.com/stereolabs/zed-sdk/tree/master/camera control/cpp) [Python](https://github.com/stereolabs/zed-sdk/tree/master/camera control/python)
Camera Streaming Shows how to stream the ZED stereo video on an IP network, decode the video and display its live 3D point cloud. [GitHub](https://github.com/stereolabs/zed-sdk/tree/master/camera streaming)
Depth Sensing Shows how to capture a 3D point cloud and display it in an OpenGL window. [C++](https://github.com/stereolabs/zed-sdk/tree/master/depth sensing/depth sensing/cpp) [Python](https://github.com/stereolabs/zed-sdk/tree/master/depth sensing/depth sensing/python)
Positional Tracking Displays the live position and orientation of the camera in a 3D window. [C++](https://github.com/stereolabs/zed-sdk/tree/master/positional tracking/positional tracking/cpp) [Python](https://github.com/stereolabs/zed-sdk/tree/master/positional tracking/positional tracking/python)
Spatial Object Detection 2D Display Detect and track objects in the scene, and display their 3D bounding boxes over the live image. [C++](https://github.com/stereolabs/zed-sdk/tree/master/object detection/image viewer/cpp) [Python](https://github.com/stereolabs/zed-sdk/tree/master/object detection/image viewer/python)
Spatial Object Detection 3D Display Detect and track objects in the scene, and display their 3D bounding boxes over the live point cloud. [C++](https://github.com/stereolabs/zed-sdk/tree/master/object detection/birds eye viewer/cpp) [Python](https://github.com/stereolabs/zed-sdk/tree/master/object detection/birds eye viewer/cpp)
Body Tracking Shows how to detect and track 3D human bodies in space and display skeletons over the live image. [C++](https://github.com/stereolabs/zed-sdk/tree/master/body tracking/body tracking/cpp) [Python](https://github.com/stereolabs/zed-sdk/tree/master/body tracking/body tracking/python)
Spatial Mapping Captures a live 3D mesh of the environment and displays it as an overlay on the camera image. [C++](https://github.com/stereolabs/zed-sdk/tree/master/spatial mapping/spatial mapping/cpp) [Python](https://github.com/stereolabs/zed-sdk/tree/master/spatial mapping/spatial mapping/python)
Plane Detection Shows how to detect floor and planar areas in the scene and draw them on the image. [C++](https://github.com/stereolabs/zed-sdk/tree/master/plane detection/plane detection/cpp) [Python](https://github.com/stereolabs/zed-examples/tree/master/plane detection/plane detection/python)
Video Recording Shows how to record a lossless or compressed video in SVO format. C++ Python
Video Playback Shows how to playback a recorded SVO video. C++ Python
Video Export Opens an SVO file and exports video and depth to PNG or AVI files. C++ Python
Multi Camera Shows how to open and use multiple ZED cameras at the same time in a single application. [C++](https://github.com/stereolabs/zed-sdk/tree/master/depth sensing/multi camera/cpp) [Python](https://github.com/stereolabs/zed-sdk/tree/master/depth sensing/multi camera/cpp)

正在更新