【ZED】从零开始使用ZED相机(二):打开相机+捕获图像

引言

关于ZED相机的安装和配置可以先参考【ZED】从零开始使用ZED相机(一):windows下的安装配置与测试,接下来开始二次开发ZED相机。
阅读ZED API文档,选择自己使用的语言,学会相机的基本调用函数
在这里插入图片描述
笔者建议:安装包的samples与官方文档配合使用效果更加
在这里插入图片描述
必备导入库:(后面涉及的代码都要导入这两个库)

import pyzed.sl as sl
import cv2 

ZED开发目录:

(1)打开相机,终端打印相机的ZED相机的基本信息

(2)捕获图像(左、右、深度图等)+ 获取计算的数据(视差、深度、3D数据等)

下面详细展开

1 hello_zed(初见ZED)

import pyzed.sl as sl
import cv2 
def hello_zed():
    # 创建相机对象
    zed = sl.Camera()  # Camera是非常重要的一个类

    # 创建初始化参数对象并配置初始化参数
    init_params = sl.InitParameters()
    init_params.sdk_verbose = False  # 相机有很多可以初始化的参数,用到一个认识一个

    # 打开相机(终端打开,但是看不到相机的画面,需要用到cv2.imshow显示相机画面,后面再介绍)
    err = zed.open(init_params)  # 指定参数打开相机
    if err != sl.ERROR_CODE.SUCCESS:
        exit(1)
    # 获得相机的信息,笔者列举了一部分,并不是全部信息,读者可以自行探究
    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))
    # 关闭相机
    zed.close()

if __name__ == "__main__":
    hello_zed()

2 image_capture(捕获图像)

import pyzed.sl as sl
import cv2 
import os
# 2. 捕获图像
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()  # 图像
    disparity = sl.Mat()  # 视差值
    dep = sl.Mat()  # 深度图
    depth = sl.Mat()  # 深度值
    point_cloud = 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.LEFT)  # image:容器,sl.VIEW.LEFT:内容
            img = image.get_data()  # 转换成图像数组,便于后续的显示或者储存
            # 获取视差值
            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)  # 深度值
            zed.retrieve_image(dep,sl.VIEW.DEPTH)  # 深度图
            depth_map = depth.get_data()
            dep_map = dep.get_data()
            # 获取点云
            zed.retrieve_measure(point_cloud,sl.MEASURE.XYZBGRA,sl.MEM.CPU)
            point_map = point_cloud.get_data()
            print('时间点',timestamp.get_seconds(),'中心点视差值',dis_map[x,y],'中心点深度值',depth_map[x,y],'中心点云数据',point_map[x,y])
            # 利用cv2.imshow显示视图,并对想要的视图进行保存
            view = np.concatenate((cv2.resize(img,(640,360)),cv2.resize(dep_map,(640,360))),axis=1)
            cv2.imshow("View", view)
            key = cv2.waitKey(1)
            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()

视图显示结果如下:笔者通过设置按键“s”进行想要图像的保存,需要注意的是保存路径需要先创建好
在这里插入图片描述

终端打印如下:
在这里插入图片描述

代码中涉及的可选参数(点击关键字可进入官方文档链接)

  1. 分辨率选择
    在这里插入图片描述

  2. 可捕获的视图
    在这里插入图片描述

  3. 计算获得的视图
    在这里插入图片描述

  • 30
    点赞
  • 161
    收藏
    觉得还不错? 一键收藏
  • 44
    评论
您可以使用ZED SDK提供的API来编写一个程序来控制ZED 2相机和单目相机同时拍摄视频。下面是一些步骤: 1. 您可以使用ZED SDK中的“Camera”类来初始化和打开相机: ```c++ sl::Camera zed; zed.open(); ``` 2. 您可以使用“Recording”类来开始录制视频并设置保存的文件路径和格式: ```c++ sl::RecordingParameters rec_params; rec_params.filename = "path/to/file.svo"; // 设置SVO格式文件的保存路径 rec_params.compression_mode = sl::CompressionMode::H264; // 设置SVO压缩模式 zed.enableRecording(rec_params); cv::VideoWriter outputVideo; int codec = cv::VideoWriter::fourcc('M', 'P', '4', 'V'); // 设置MP4编解码器 outputVideo.open("path/to/file.mp4", codec, 30.0, cv::Size(1280, 720)); // 设置MP4格式文件的保存路径、编解码器、帧率和分辨率 ``` 3. 您可以使用“RuntimeParameters”类来设置相机参数,并使用“grab()”函数来捕获帧并将其保存为SVO文件和MP4文件: ```c++ sl::Mat left_image, right_image; while (true) { if (zed.grab() == sl::ERROR_CODE::SUCCESS) { zed.retrieveImage(left_image, sl::VIEW::LEFT); zed.retrieveImage(right_image, sl::VIEW::RIGHT); zed.record(); // 将当前帧保存到SVO文件中 cv::Mat left_cv_image = slMat2cvMat(left_image); // 将ZED图像格式转换为OpenCV图像格式 cv::Mat right_cv_image = slMat2cvMat(right_image); cv::Mat stereo_image; cv::hconcat(left_cv_image, right_cv_image, stereo_image); // 将左右摄像机的图像拼接成立体图像 outputVideo.write(stereo_image); // 将当前帧保存到MP4文件中 } } ``` 4. 最后,您可以使用“disableRecording()”函数来停止录制: ```c++ zed.disableRecording(); outputVideo.release(); ``` 请注意,上述代码仅提供了一个简单的示例,您可以根据自己的需求进行修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值