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

物联沃分享整理
物联沃-IOTWORD物联网 » Astra Pro深度相机初使用–通过openni2调用深度相机(基于python),获取深度信息(学习笔记)

发表回复