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_viewertry:subprocess.Popen([sys.executable, "-m", "depthai_viewer", "--viewer-mode"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)except subprocess.TimeoutExpired:passviewer.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 1280x800oak.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 depthconfig = stereo.node.initialConfig.get()stereo.node.setPostProcessingHardwareResources(4, 4)config.postProcessing.speckleFilter.enable = Trueconfig.postProcessing.speckleFilter.speckleRange = 50config.postProcessing.temporalFilter.enable = Falseconfig.postProcessing.spatialFilter.enable = Trueconfig.postProcessing.spatialFilter.holeFillingRadius = 1config.postProcessing.spatialFilter.numIterations = 1config.postProcessing.thresholdFilter.minRange = 400config.postProcessing.thresholdFilter.maxRange = 15000config.postProcessing.brightnessFilter.maxBrightness = 255stereo.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'].framecolor = cv2.pyrDown(color) # Downscale to match 640x400 depth frameviewer.log_image("CAM_C/transform/Color/Image", color[:, :, ::-1]) # BGR to RGBviewer.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视觉人工智能开发
戳「+关注」获取最新资讯↗↗
如果喜欢,请一键三连吧~比心❤️