中国 · 南京 · 栖霞区紫东路2号紫东国际创意园B3-2幢5F
+86-18994094214 (仅工作日:8:30~17:30)
contact@oakchina.cn

OAK深度流探测草莓距离

OAK深度流探测草莓距离

利用OAK双目测距来探测草莓距离相机的实际距离。

OAK的双目测距可以帮助我们探测物体的实际距离,以此来定位目标。接下来我们就来实现利用OAK探测草莓的距离,这样就可以将深度信息传递给机械臂来达到自动采摘草莓的目的。

校准

如果是带壳的OAK相机,一般出厂前都会做校准,所以这步你可以跳过。

如果你是用的分体式的OAK相机,那你需要手动校准相机。或者你觉得测距精度不满意,你也可以自己再手动校准一下。

校准教程请查看这篇博客>>

探测草莓距离

首先创建的depth流

depth = pipeline.createStereoDepth()

从管道中获取数据,这样我们可以获取每个像素的深度信息。直接映射为毫米。

in_depth = q.get().getData()

因为输出数组位于 uint16 中,所以将获取到的数据格式改为uint16

depth.dtype = np.uint16

 65535 的具体数值是一个特殊值,意味着无效的视差/深度结果。需要将65535过滤掉。

depth_frame = np.where(depth_frame==65535,np.nan,depth_frame)

选取合适的图像大小。

new_frme = depth_frame[180:220,280:360]

取图像深度数据的平均值,并转换为厘米。

mean_depth = np.nanmean(new_frme) / 1000

这样就把真实的深度数据求取出来了。

depthai双目测距使用注意事项

创建深度节点

使用createStereoDepth方法创建深度流和视差流

stereo = pipeline.createStereoDepth()

输出深度数据

首先需要将左右灰度相机的输出分别链接StereoDepth节点

left.out.link(stereo.left)

right.out.link(stereo.right)

深度流

stereo.depth.link(xout_depth.input)

视差流

stereo.disparity.link(xout_disparity.input)

冲突

  1. 深度流和视差流不可以同时使用。使用深度流时必须要开启setOutputDepth启用输出深度流。这是从视差流转换而来,在某些配置中会导致禁用视差流。
  2. setExtendedDisparity和setSubpixel这两个方法不可以同时开启。
  • setExtendedDisparity:作用是扩大视差范围。
  • setSubpixel:作用是提高的精度,可实现更长的距离。

使用细节

深度计算期间需要指定使用哪个中值滤波器。

  • MEDIAN_OFF:关闭
  • KERNEL_3x3:3*3中值滤波器
  • KERNEL_5x5:5*5中值滤波器
  • KERNEL_7x7:7*7中值滤波器
stereo.setMedianFilter(dai.StereoDepthProperties.MedianFilter.KERNEL_3x3)

对于视差深度数据,该值存储在 uint16 中,其中 uint16 的最大值 65535 是一个特定值,这意味着该距离是未知的。

深度流得到的数据是从视差流转换而来。

最小深度受限于最大视差范围,默认为 96,但在扩展视差模式下可扩展到 192。

想了解更多depthai深度计算细节可以参考depthai官方文档