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),发现帧率一直在变化,而且某些帧率变得很低,不太清楚为什么。一下是我录制是的代码。
import pyzed.sl as sl
zed = sl.Camera()
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
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 :
zed.record()
zed.retrieve_image(image_zed, sl.VIEW.VIEW_LEFT)
timestamp = zed.get_timestamp(sl.TIME_REFERENCE.TIME_REFERENCE_CURRENT)
diftimestamp = timestamp - pretimestamp
pretimestamp = timestamp
print(diftimestamp)
dif_time.append(diftimestamp)
zed.disable_recording()
zed.close()
这里要实名表扬zed的技术支持。发送了询问邮件很快就得到了恢复。最终找到了问题所在。
因为我在thinkpad T470P上使用的该摄像头。技术支持说可能是因为GeForce 940MX不支持在最大帧率下工作。后来我进行了一些实验。发现在720P下,设置为15帧和30帧基本上不会有掉帧。但在60帧时就比较严重。所以我猜想可能是因为这个问题。另外,在720p时,即使调用SDK也不能设置任意帧数,好像只有,15,30,60三个选项。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)