OAK-D-Long-Range: 让你的机器人拥有鹰一样的视觉!3D视觉精度与点云方案!

OAK-D LONG RANGE – 精度与点云

有没有想过让你的机器人有鹰的视力?来看看我们OAK-D-Long Range相机吧!这是一款3D+AI相机,为全球项目带来了超强的视觉效果!让我们深入了解它是如何通过15cm的基线做到这一点的!

15CM基线: 更深度的透视

有了15厘米的立体基线,OAK-D -Long-Range可以更准确地感知更远的物体。在配置立体深度文档中(Configuring Stereo Depth (luxonis.com),我们提到基线距离(线性)与精度相关,因此,如果我们将基线距离增加2倍,则在相同距离下的误差将减少2倍。
在这里插入图片描述

深度精度

在我们的深度精度文档()Depth accuracy (luxonis.com)页面上,我们有关于每个设备精度的更深入(双关语)信息,以及关于精度图为何如此的图表和解释。以下是我们的OAK-D-Long-Range的深度精度(与距离有关):
在这里插入图片描述
这种精度是通过具有82°水平FOV的默认镜头获得的。如果我们减少FOV(不同的镜头或中央裁剪框,而不是ISP缩小尺寸),我们会获得更好的远距离精度。

点云

图形很好,但如果相机不适用于现实世界中的应用程序,它们就毫无用处。我们在一辆振动重型拖拉机(一辆有30年历史的IMT 549)上录制了一些镜头,未经过滤的点云看起来相当不错。
使用rerun.io(Rerun — Visualize multimodal data over time),我们可视化了直接从设备获得的RGB-D帧,并且没有主机上的后处理(额…类似于RealSense™相机的操作)。因此,如果我们添加主机计算密集型点云处理,我们将获得更平滑的曲面。

Tractor Video 1

Tractor Video 2

Tractor Video 3

Tractor Video 4

代码复现

我们使用depthai-sdk进行管道构建和回放,并使用the depthai-viewer(GitHub - luxonis/depthai-viewer: Log images, point clouds, etc, and visualize them effortlessly. Built in Rust using egui)进行可视化。我们也可以使用原生Rerun(这里有一个Rerun的例子:OAK-D Long Range Tractor pointcloud visualization with native Rerun (non-colorized pointclouds?) · GitHub),但点云不会被着色。在运行代码之前,需要安装以下要求:

python3 -mpip install depthai-sdk==1.14 depthai-viewer==0.2.2

安装要求并将OAK设备连接到计算机(进行立体声重建)后,可以运行以下代码:

from depthai_sdk import OakCamera
import depthai as dai
import depthai_viewer as viewer
import subprocess
import sys
import cv2

# Download and run the tractor recording
with OakCamera(replay="tractor-oak-d-lr") as oak:

    # Run & initialize the depthai_viewer
    try:
        subprocess.Popen([sys.executable, "-m", "depthai_viewer", "--viewer-mode"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    except subprocess.TimeoutExpired:
        pass
    viewer.init("Depthai Viewer")
    viewer.connect()

    oak.replay.set_fps(10)
    cam_b = oak.create_camera('CAM_B')
    cam_c = oak.create_camera('CAM_C')
    # Downscale the 1920x1200 frames to 1280x800
    oak.replay.resize('cam_c', (1280, 800))
    oak.replay.resize('cam_b', (1280, 800))

    nn = oak.create_nn('mobilenet-ssd', cam_c)

    stereo = oak.create_stereo(left=cam_b, right=cam_c)
    stereo.node.setOutputSize(640, 400)
    stereo.config_stereo(confidence=215, lr_check=True, extended=True, subpixel=True, subpixel_bits=5)
    stereo.config_stereo(align=cam_c)
    stereo.node.setDepthAlign(dai.CameraBoardSocket.CAM_C)

    # On-device post processing for stereo depth
    config = stereo.node.initialConfig.get()
    stereo.node.setPostProcessingHardwareResources(4, 4)
    config.postProcessing.speckleFilter.enable = True
    config.postProcessing.speckleFilter.speckleRange = 50
    config.postProcessing.temporalFilter.enable = False
    config.postProcessing.spatialFilter.enable = True
    config.postProcessing.spatialFilter.holeFillingRadius = 1
    config.postProcessing.spatialFilter.numIterations = 1
    config.postProcessing.thresholdFilter.minRange = 400
    config.postProcessing.thresholdFilter.maxRange = 15000
    config.postProcessing.brightnessFilter.maxBrightness = 255
    stereo.node.initialConfig.set(config)

    q = oak.queue([
        stereo.out.depth.set_name('depth'),
        stereo.out.rectified_right.set_name('rr'),
        nn.out.main.set_name('nn'),
    ]).configure_syncing(enable_sync=True, threshold_ms=250).get_queue()
    # oak.show_graph()
    oak.start()

    calibData = oak.device.readCalibration()
    intrinsics = calibData.getCameraIntrinsics(dai.CameraBoardSocket.CAM_C, dai.Size2f(640, 400))
    viewer.log_pinhole("CAM_C/transform/Color", child_from_parent=intrinsics, width=640, height=400, timeless=True)
    viewer.log_rigid3("CAM_C/transform", child_from_parent=([0, 0, 0], [1, 0, 0, 0]), xyz="RDF", timeless=True)

    while oak.running():
        packets = q.get()
        depth = packets['depth']
        viewer.log_image("Right", packets['rr'].frame)

        color = packets['nn'].frame
        color = cv2.pyrDown(color) # Downscale to match 640x400 depth frame

        viewer.log_image("CAM_C/transform/Color/Image", color[:, :, ::-1]) # BGR to RGB
        viewer.log_depth_image("CAM_C/transform/Color/Depth", depth.frame, meter=1e3)

        oak.poll()

请注意,在第一次运行时,depthai-sdk将下载大约300MB的tractor-oak-d-lr录制:

在这里插入图片描述
欢迎大家点赞!关注!评论!三连啊~~~

新朋友还想进一步了解OAK相机的话可到我们官网哦,https://www.oakchina.cn/

如果你初次遇见OAK,可来这里系统查看一下:https://www.oakchina.cn/intro/
Shopping直通车在这里:https://www.oakchina.cn/shop/

OAK中国 | 追踪AI技术和产品新动态
公众号 | OAK视觉人工智能开发
戳「+关注」获取最新资讯↗↗
如果喜欢,请一键三连吧~比心❤️

  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值