深度学习(一)--获取ZED实时图像、视差值、深度值、点云值

最近在学习机器视觉,主要基于ZED做一些视觉算法,故记录下学习过程。本篇文章主要是获取ZED实时视频。

1.环境信息
摄像头:ZED  USB接口
系统:Ubuntu18.04
2.功能实现

创建python文件,test.py

import os
import cv2
import numpy as np
import pyzed.sl as sl   #python3 zed api


def image_capture():
    zed = sl.Camera()
    # 设置相机的分辨率1080和采集帧率30fps
    init_params = sl.InitParameters()
    init_params.camera_resolution = sl.RESOLUTION.HD1080  # Use HD1080 video mode
    init_params.camera_fps = 30  # fps可选:15、30、60、100

    err = zed.open(init_params)  # 根据自定义参数打开相机
    if err != sl.ERROR_CODE.SUCCESS:
        exit(1)
    runtime_parameters = sl.RuntimeParameters()  # 设置相机获取参数
    runtime_parameters.sensing_mode = sl.SENSING_MODE.STANDARD  #深度感应模式
    i = 0
    # 创建sl.Mat对象来存储图像(容器),Mat类可以处理1到4个通道的多种矩阵格式(定义储存图象的类型)
    image = sl.Mat()  # 图像
    
    # # 获取分辨率
    resolution = zed.get_camera_information().camera_resolution
    w, h = resolution.width , resolution.height
    x,y = int(w/2),int(h/2)  # 中心点

    while True:
        # 获取最新的图像,修正它们,并基于提供的RuntimeParameters(深度,点云,跟踪等)计算测量值。
        if zed.grab(runtime_parameters) == sl.ERROR_CODE.SUCCESS:  # 相机成功获取图象
            # 获取图像
            timestamp = zed.get_timestamp(sl.TIME_REFERENCE.CURRENT)  # 获取图像被捕获时的时间点
            zed.retrieve_image(image, sl.VIEW.RIGHT)  # image:容器,sl.VIEW.LEFT:内容 ,右镜头
            img = image.get_data()  # 转换成图像数组,便于后续的显示或者储存
            # 显示彩色图
            view = cv2.resize(img,(640,480))
            cv2.imshow("View", view)  #显示图像
            key = cv2.waitKey(1)    #waitkey控制着imshow的持续时间
            if key & 0xFF == 27:  # esc退出
                break
            if key & 0xFF == ord('s'):  # 图像保存
                savePath = os.path.join("./images", "V{:0>3d}.png".format(i))  # 注意根目录是否存在"./images"文件夹
                cv2.imwrite(savePath, view)
            i = i + 1
    zed.close()
    
if __name__ == "__main__":
    image_capture()
3.运行
python3 test.py
4.获取视差值、深度值、点云值
disparity = sl.Mat()  # 视差值
dep_map = sl.Mat()  # 深度图
depth = sl.Mat()  # 深度值
point_cloud = sl.Mat()  # 点云数据

# 获取视差值
zed.retrieve_measure(disparity,sl.MEASURE.DISPARITY,sl.MEM.CPU)
dis_map = disparity.get_data()

# 获取深度数据
zed.retrieve_measure(depth,sl.MEASURE.DEPTH,sl.MEM.CPU)  # 深度值
#访问深度值,每个(X,Y)像素的深度(Z),使用getValue()可以访问这些值
depth_value = depth.get_value(x,y)  #默认情况下,深度值以毫米表示 -->(SUCCESS, 2093.3408203125)
            
#显示深度图像
#32位深度图可以显示为灰度8位图像。为了显示深度图,我们将其值缩放为[0,255],其中255(白色)表示最近的可能深度值,0(黑色)表示最远的可能深度值。
zed.retrieve_image(dep_map,sl.VIEW.DEPTH)  # 深度图
dep_image = dep_map.get_data()
cv2.imshow("dep_image",dep_image)

# 获取点云数据
zed.retrieve_measure(point_cloud,sl.MEASURE.XYZBGRA,sl.MEM.CPU)
point_map = point_cloud.get_data()
#使用getValue()访问特定的像素值,单位(毫米),返回 (X,Y,Z)和RGBA颜色的3D点云
s,point3D = point_cloud.get_value(x,y)  -->(SUCCESS, array([     142.76,      220.06,      2093.3, -2.8241e+38]))
x = point3D[0]
y = point3D[1]
z = point3D[2]
color = point3D[3]
            
#利用点云测量距离。 欧几里得距离公式
point3D = point_cloud.get_value(i,j)
distance = math.sqrt(point3D[0] * point3D[0] + point3D[1] * point3D[1] + point3D[2] * point3D[2])

print('时间点',timestamp.get_seconds(),'中心点视差值',dis_map[x,y],'中心点深度值',dep_image[x,y],'中心点云数据',point_map[x,y])

此外,还可以获取相机的其他信息

# 创建相机对象
zed = sl.Camera()  # Camera是非常重要的一个类

# 获得相机的信息
zed_info = zed.get_camera_information()
print('相机序列号:%s' % zed_info.serial_number)
print('相机型号:%s' % zed_info.camera_model)
print('相机分辨率: width:%s, height:%s' % (zed_info.camera_resolution.width, zed_info.camera_resolution.height))
print('相机FPS:%s' % zed_info.camera_fps)
print('相机外部参数:')
print('相机旋转矩阵R:%s' % zed_info.calibration_parameters.R)
print('相机变换矩阵T:%s' % zed_info.calibration_parameters.T)
print('相机基距:%s' % zed_info.calibration_parameters.get_camera_baseline())
print('初始化参数:')

zed_init = zed.get_init_parameters()
print('相机分辨率:%s' % (zed_init.camera_resolution))
print('深度最小:%s' % (zed_init.depth_minimum_distance))
print('深度最大:%s' % (zed_init.depth_maximum_distance))

在这里插入图片描述
最近好忙,都没时间写博客了。emm, 好开心又学到新知识!
希望本篇文章可以帮到你~~

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值