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)
冲突
- 深度流和视差流不可以同时使用。使用深度流时必须要开启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官方文档。