OAK深度流探测草莓距离

OAK深度流探测草莓距离

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

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

校准

在测距之前,我们需要对相机进行校准。

DepthAI官方的calibrate.py程序就是专门用来为OAK进行校准。这GitHub上可以找到。

将整个depthai项目从GitHub上拉去下来。并进入depthai文件夹。

git clone https://github.com/luxonis/depthai.git

cd depthai

安装依赖

python install_requirements.py

打印charuco板校准图像

将校准charuco板打印到平面上,或在平面(不是弯曲的!)显示器上显示校准板。请注意,如果您确实打印了校准图片,请注意确保它附着在平坦的表面上并且平坦且没有皱纹和/或“波浪”。

运行程序

在resources/boards文件夹下是存放json配置文件的地方。自定义配置文件中主要设置双目相机之间的距离”left_to_right_distance_cm”。下面显示的是模块化相机的最小间距。

{
    "board_config":
    {
        "name": "BW1092",
        "revision": "R0M0E0",
        "swap_left_and_right_cameras": true,
        "left_fov_deg": 71.86,
        "rgb_fov_deg": 68.7938,
        "left_to_right_distance_cm": 2.5,
        "left_to_rgb_distance_cm": 1.0
    }
}
python3 calibrate.py -s [SQUARE_SIZE_IN_CM] -brd [BOARD] -db
  • -s SQUARE_SIZE_IN_CM, : 以厘米为单位测量印刷的 charuco 板的平方尺寸
  • -db --defaultBoard: 指定我们正在使用depthai存储库(来自calib.io)中提供的校准板的标志。如果您使用其他板,请改为指定: -ms MARKER_SIZE_IN_CM--markerSizeCm MARKER_SIZE_IN_CM 印刷的 charuco 板上的标记尺寸,以厘米为单位。
  • -brd BOARD : resources/boards文件夹下是存放json配置文件名或自定义 .json 板配置的路径。

程序运行起来后一直按空格即可。注意按照提示的要求摆放校准板, 将图案完全放入提示框中。

探测草莓距离

首先创建的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官方文档