zed相机使用

zed立体相机+pyhon+opencv

zed相机网上资料都是关于安装的教程,后续的一些使用介绍的不是很多,
因为官方文档已经介绍的很详细,这里介绍一下自己的学习过程,以备查阅,如有错误,敬请指正。
这时官方文档,所有的信息都是根据这儿得来的。
https://www.stereolabs.com/

安装

因为zed相机属于UVC(USB video device class )设备,索引可以用作双目摄像头直接用于计算机或者嵌入式平台,和普通的双目摄像头应该没什么区别。
但是如果要使用其SDK,就需要cuda环境。一开始不知道,打算用在台式机(Intel HD Graphics 4600集成显卡)上,后来发现需要NVIDIA。只好转用我的T470(总算能干点活了)。按照这个教程下来,基本没问题。
https://blog.csdn.net/weixin_42132223/article/details/81840520

使用

安装后在程序里面搜索zed,会发现多出几个应用。可以都打开看看(别忘了把zed相机插上)。其中zed viewer就是拍摄的图像,左下角可以看到可以录视频照相。但录的视频是SVO格式的。里面包含了很多信息。包括深度,点云什么的,所以会非常大。depth viewer可以看深度图像和点云。ZED calibratiuon是做标定的很方便,不用自己搞棋盘,直接拿摄像头去怼显示前上的该应用给的棋盘就行,这里建议用大一点的显示器。先看一下教程不是很难。还有一个ZEDFu我没用到。

以上的这些应用只能让我们看到ZED的一些功能。用来做开发,自然少不了SDK.花一个小时把这个文档大概看一些。基本上就可以上手开发了。
https://www.stereolabs.com/docs/getting-started/

方便参考的一些点

zed相机比较方便的一个点是,做实时分析的时候不用随时都要插着摄像头,可以先录制好获得svo文件,然后用grab()函数直接得到的就是矫正后的图像,当然也可以参考给的opnecv例程进行图像,视频还有点云文件的保存。

因为我要识别网球。很小,距离也很远。一开始打算用点云去做,滤波后提取满足条件的聚类。但PCL库没接触过。后来看到这篇文章
https://support.stereolabs.com/hc/en-us/articles/360011977594-Can-I-get-the-3D-position-of-a-Custom-Object-a-Ball-or-a-Small-Object-
我在深度图中也看不到飞行的网球,zed开发人员也不建议直接用从深度图中去找。深度图是立体矫正匹配后得到的。于是我直接从矫正后的图像中去找两个球的对应点,得到视差。最后计算出三维坐标值。

zed录像保存为svo文件的问题

因为我需要的帧率比较高,而且在关键时刻需要稳定,但是得到的svo文件打开时(需要SDK),发现帧率一直在变化,而且某些帧率变得很低,不太清楚为什么。一下是我录制是的代码。

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

import pyzed.sl as sl

# Create a ZEDCamera object
zed = sl.Camera()

# Create a InitParameters object and set configuration parameters
init_params = sl.InitParameters()
init_params.camera_resolution = sl.RESOLUTION.RESOLUTION_HD720 #分辨率设置
init_params.camera_fps = 60 #帧率设置

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

runtime_parameters = sl.RuntimeParameters()
runtime_parameters.sensing_mode = sl.SENSING_MODE.SENSING_MODE_STANDARD # Use STANDARD sensing mode
# Enable recording with the filename specified in argument
err = zed.enable_recording('video_frame_test.svo', sl.SVO_COMPRESSION_MODE.SVO_COMPRESSION_MODE_LOSSLESS)
image_zed = sl.Mat(zed.get_resolution().width, zed.get_resolution().height, sl.MAT_TYPE.MAT_TYPE_8U_C4)
point_cloud = sl.Mat()

print('SVO is Recording')
n=200
pretimestamp=0
dif_time =[]
while n>0:
if zed.grab(runtime_parameters) == sl.ERROR_CODE.SUCCESS :
# Each new frame is added to the SVO file
zed.record()
zed.retrieve_image(image_zed, sl.VIEW.VIEW_LEFT)
timestamp = zed.get_timestamp(sl.TIME_REFERENCE.TIME_REFERENCE_CURRENT) # Get the timestamp at the time the image was captured
diftimestamp = timestamp - pretimestamp#时间戳之差
pretimestamp = timestamp#上一帧时间戳
#n = n-1
print(diftimestamp)
dif_time.append(diftimestamp)#保存于一个列表
#print(n)
# else:
# key =cv2.waitKey(1)
# print('jump.')


# Disable recording
zed.disable_recording()
zed.close()

这里要实名表扬zed的技术支持。发送了询问邮件很快就得到了恢复。最终找到了问题所在。
因为我在thinkpad T470P上使用的该摄像头。技术支持说可能是因为GeForce 940MX不支持在最大帧率下工作。后来我进行了一些实验。发现在720P下,设置为15帧和30帧基本上不会有掉帧。但在60帧时就比较严重。所以我猜想可能是因为这个问题。另外,在720p时,即使调用SDK也不能设置任意帧数,好像只有,15,30,60三个选项。