Astra Pro深度相机初使用–通过openni2调用深度相机(基于python),获取深度信息(学习笔记)
我手里的这个型号的深度相机来历也比较搞笑,是我从闲鱼几十块买的,成色很新,甚至包装都没拆,非常便宜,让我一度认为可能是坏的,原因是大哥那边不会用,我买完之后大哥那边就涨了二十哈哈哈。
小插曲,接下来介绍使用,这边有两种方法。
第一种使用官方给的基于openni2的sdk:奥比中光AI开放平台|全球首个聚焦3D视觉开放平台https://vcp.developer.orbbec.com.cn/resourceCenter?defaultSelectedKeys=72这个软件适配的很好,用起来很方便,但是不适合做扩展,直白说就是拿来看看,用于调试参数什么的,这个解压下来就自带驱动,直接就可使用,按如下操作下载解压就行了,它自己的Orbbec SDK工具不支持这个型号的,只能选择openni2的sdk,如果你是新款的可以使用这个sdk。
效果就是这样的:鼠标放在深度图上就能显示深度信息
接下来介绍第二种方法,
参考这位大佬的博客:(17)深度点云学习–python安装openni打开奥比中光RGBD_点云深度学习python程序-CSDN博客
通过python调用openni2的api来启动深度相机,此前需要先安装驱动,按照提示安装就好 。驱动依旧和上面的一样在开发者资源中心去下载安装。
做完这些之后我们就可以开始
下一步:
安装openni库:如果速度慢可以使用镜像源加速:这里使用清华源为例,其他库依照需要安装即可
pip install openni -i https://pypi.tuna.tsinghua.edu.cn/simple
接下来:
需要下载资源包
把这几个文件拷出来和你的python文件一起
或者像我这样,简单省事一点就是把python文件放在之前用来查看的基于openni的sdk里面,像下面这样就不用再下载这个包了:
然后就可以开始编写代码了
from openni import openni2
import numpy as np
import cv2
import time
DEVICE_INFO = {}
WINDOW_NAME_DEPTH = 'Depth Image'
WINDOW_NAME_COLOR = 'Color Image'
COLOR_MAP_TYPE = 8 # 可以尝试不同的色彩映射, 有0~11种渲染的模式,8 色彩鲜艳,2的色彩正常,0和11为黑白色
ALPHA_VALUE = 0.17
MAX_DISTANCE_CM = 800 # 最大有效距离,单位为厘米
FONT = cv2.FONT_HERSHEY_SIMPLEX
FONT_SCALE = 0.5
FONT_COLOR = (0, 0, 0)
FONT_THICKNESS = 1
last_click_time = 0
click_x, click_y = -1, -1
distance_text = ""
def mousecallback(event, x, y, flags, param):
global click_x, click_y, distance_text, last_click_time
if event == cv2.EVENT_LBUTTONDOWN: # 单击事件,需要双击事件就是cv2.EVENT_LBUTTONDBLCLK
click_x, click_y = x, y
distance = dpt[y, x] / 10.0 # 若深度值是以毫米为单位,转换为厘米
distance_text = f"Dis: {distance:.2f} cm"
last_click_time = time.time()
if __name__ == "__main__":
try:
openni2.initialize()
dev = openni2.Device.open_any()
print(dev.get_device_info())
depth_stream = dev.create_depth_stream()
dev.set_image_registration_mode(True)
depth_stream.start()
cap = cv2.VideoCapture(1)
cv2.namedWindow(WINDOW_NAME_DEPTH)
cv2.setMouseCallback(WINDOW_NAME_DEPTH, mousecallback)
while True:
frame = depth_stream.read_frame()
dframe_data = np.array(frame.get_buffer_as_triplet()).reshape([480, 640, 2])
dpt1 = np.asarray(dframe_data[:, :, 0], dtype='float32')
dpt2 = np.asarray(dframe_data[:, :, 1], dtype='float32')
dpt2 *= 255
dpt = dpt1 + dpt2
dim_gray = cv2.convertScaleAbs(dpt, alpha=ALPHA_VALUE)
# 对深度图像进行渲染
depth_colormap = cv2.applyColorMap(dim_gray, COLOR_MAP_TYPE)
if click_x >= 0 and click_y >= 0 and (time.time() - last_click_time) < 5:
depth_colormap = cv2.putText(depth_colormap, distance_text, (click_x, click_y), FONT, FONT_SCALE,
FONT_COLOR, FONT_THICKNESS, cv2.LINE_AA)
cv2.imshow(WINDOW_NAME_DEPTH, depth_colormap)
ret, frame = cap.read()
if ret:
frame = cv2.flip(frame, 1)
cv2.imshow(WINDOW_NAME_COLOR, frame)
key = cv2.waitKey(1)
if key & 0xFF == ord(' '):
break
depth_stream.stop()
dev.close()
openni2.unload()
cap.release()
cv2.destroyAllWindows()
except Exception as e:
print(f"An error occurred: {e}")
安装额外的numpy和opencv就行了,这样就能得到一个可以点击测距的窗口的实例了
深度相机可以和激光雷达一样输出点云图像,可做三维重建,也可把点云图像和rgb视觉融合,涉及相机内参标定,可以参照这位大佬的博客学习上手一个RGBD深度相机:从原理到实践–ROS noetic+Astra S(上):解读深度测距原理和内外参推导_rgbd相机原理-CSDN博客
作者:2301_80488618