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)
冲突
- 深度流和视差流不可以同时使用。使用深度流时必须要开启setOutputDepth启用输出深度流。这是从视差流转换而来,在某些配置中会导致禁用视差流。
- 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官方文档。