使用IntelD435实现指定区域平均距离测量

使用IntelD435实现指定区域平均距离测量

概述

使用IntelD435的彩色相机标定测量区域,同时使用D435的深度感知功能测量指定区域的深度,可用来感知特定区域的变化。 ## 效果图 白色框为选定区域,上方显示区域的平均距离。 效果图

实现思路

  • 获取深度图和彩色图
  • 显示彩色图
  • 使用pyopencv获得鼠标交互并获取边缘坐标
  • 获取选定区域的深度信息
  • 计算并得出结果

实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#引入必要的库
import pyrealsense2 as rs
import numpy as np
import cv2
import sys

#定义D435输入
pipeline = rs.pipeline()
config = rs.config()
config.enable_stream(rs.stream.depth, 1280, 720, rs.format.z16, 30)
config.enable_stream(rs.stream.color, 1280, 720, rs.format.bgr8, 30)

profile = pipeline.start(config)



mouse_config_p = 0

# 空间坐标
x_min = 0
y_min = 0
x_max = 0
y_max = 0

#鼠标交互
def onmouse(event, x, y, flags, param): #标准鼠标交互函数
global mouse_config_p,x_min,y_min,x_max,y_max
if event==cv2.EVENT_LBUTTONDOWN: #当鼠标点击时
if mouse_config_p == 0 :
x_min = x #获取坐标
y_min = y
mouse_config_p += 1
elif mouse_config_p == 1:
x_max = x
y_max = y
mouse_config_p += 1
with open("./config.ini","w") as f: #存储到文件(预留)
f.write(str(x_min))
f.write(" ")
f.write(str(y_min))
f.write(" ")
f.write(str(x_max))
f.write(" ")
f.write(str(y_max))

#划定选区
def Region_config():
finish = False
while finish == False: #循环直到获取到有效帧
cv2.namedWindow('FreshCompanion')
cv2.setMouseCallback('FreshCompanion', onmouse) #绑定鼠标动作
frames = pipeline.wait_for_frames() #获取帧
color_frame = frames.get_color_frame() #获取彩色帧
if not color_frame :
continue
color_image = np.asanyarray(color_frame.get_data())
cv2.imshow("FreshCompanion", color_image)
cv2.waitKey(1) #必须使用waitkey,否则会卡住
if x_min != 0 and y_min != 0 and x_max != 0 and y_max != 0: #判断是否完成
finish = True

#获取距离
def get_dis():
while True:
for i in range(5): #忽略前几帧
pipeline.wait_for_frames()

frames = pipeline.wait_for_frames()

depth_frame = frames.get_depth_frame() #获取深度帧

color_frame = frames.get_color_frame() #获取彩色帧

if not depth_frame or not color_frame:
continue

# 把图片转化为numpy数组
depth_image = np.asanyarray(depth_frame.get_data())
color_image = np.asanyarray(color_frame.get_data())


depth = np.asanyarray(depth_frame.get_data())
# 仅保留选区
depth = depth[y_min:y_max,x_min:x_max].astype(float)

depth_scale = profile.get_device().first_depth_sensor().get_depth_scale()#获取设备统计单位
#depth = depth[depth!=0] #当数据恶化时去除零数据提高精度
depth = depth * depth_scale #转换为m
dist, _, _, _ = cv2.mean(depth) #计算平均值
cv2.rectangle(color_image, (x_min, y_min),(x_max, y_max), (255, 255, 255), 2) #绘制选取框
cv2.putText(color_image, "Distance = " + str(dist) + "m", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2) #绘制距离值
cv2.imshow("FreshCompanion", color_image)
cv2.waitKey(1)

#sys.exit(0)


Region_config()
get_dis()
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2017-2022 Ink East
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信