(17)深度点云学习--python安装openni打开奥比中光RGBD

1、主要参考

(1)安装

点云数据处理之安装python-openni_mengjiexu_cn的博客-CSDN博客_openni python

(2)打开摄像头

 2、安装openni和测试摄像头

2.1 下载安装摄像头驱动

(1)去以下地址下载驱动

https://developer.orbbec.com.cn/download.html?id=32

 

(2)安装后可以在硬件管理中看到设备

 

2.2 下载openni(需要用到OpenNI2.dll文件)

(1)在奥比下面的地址下载

https://developer.orbbec.com.cn/download.html?id=65

 (2)解压后,将以下1个文件夹、3个文件复制到我们需要的python目录下

OpenNI2文件夹、OpenNI.ini、OpenNI2.dll、OpenNI2.lib

1)来源 

2)复制到 

2.3使用清华源安装openni

pip install openni -ihttps://pypi.tuna.tsinghua.edu.cn/simple

2.4 测试摄像头

(1)测试代码

from openni import openni2
import numpy as np
import cv2
 

if __name__ == "__main__":
    openni2.initialize()
    dev = openni2.Device.open_any()
    print(dev.get_device_info())

(2)测试结果

3、捕获和显示深度图

(1)测试代码

from openni import openni2
import numpy as np
import cv2
 
 
def mousecallback(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDBLCLK:
        print(y, x, dpt[y, x])
 
 
if __name__ == "__main__":
    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('depth')
    cv2.setMouseCallback('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
        #对于为什么要乘于255的解答
        #深度图像的深度值 是按照16位长度(两字节)的数据格式存储的,也可以认为前八位是高字节,后八位是低字节。
        #因此一张深度图像如果是 640480分辨率的话,那么图像字节大小 就是 640480*2,其中一个字节是8位(255)
        dpt = dpt1 + dpt2
        #cv2里面的函数,就是类似于一种筛选
        '假设我们需要让我们的深度摄像头感兴趣的距离范围有差别地显示,那么我们就需要确定一个合适的alpha值,公式为:有效距离*alpha=255,' \
        '假设我们想让深度摄像头8m距离内的深度被显示,>8m的与8m的颜色显示相同,那么alpha=255/(8*10^3)≈0.03,' \
        '假设我们想让深度摄像头6m距离内的深度被显示,>6m的与6m的颜色显示相同,那么alpha=255/(6*10^3)≈0.0425'
        dim_gray = cv2.convertScaleAbs(dpt, alpha=0.17)
        #对深度图像进行一种图像的渲染,目前有11种渲染方式,大家可以逐一去试下
        depth_colormap = cv2.applyColorMap(dim_gray, 2)  # 有0~11种渲染的模式
 
        cv2.imshow('depth', depth_colormap)
 
        ret, frame = cap.read()
        cv2.imshow('color', frame)
 
        key = cv2.waitKey(1)
        if int(key) == ord('q'):
            break
 
    depth_stream.stop()
    dev.close()

(2)测试结果

3、利用该RGBD摄像头捕获rgb和深度图序列

(1)注意捕获的深度图为16位png格式,关键代码如下

        dpt = dpt1 + dpt2
        #转换一下,重要,陈20221222
        dpt = dpt.astype(np.uint16) 

(2)测试程序

from openni import openni2
import numpy as np
import cv2
 
#深度信息打印 
# def mousecallback(event, x, y, flags, param):
#     if event == cv2.EVENT_LBUTTONDBLCLK:
#         print(y, x, dpt[y, x])
 
 
if __name__ == "__main__":
    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('depth')
    # cv2.setMouseCallback('depth', mousecallback)
    capture_flag = 0
    base_path = 'D:/RGBD_CAMERA/astra_chen_dataset/'
    count = 1
    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
        #对于为什么要乘于255的解答
        #深度图像的深度值 是按照16位长度(两字节)的数据格式存储的,也可以认为前八位是高字节,后八位是低字节。
        #因此一张深度图像如果是 640480分辨率的话,那么图像字节大小 就是 640480*2,其中一个字节是8位(255)
        dpt = dpt1 + dpt2
        #转换一下,重要,陈20221222
        dpt = dpt.astype(np.uint16) 

        #cv2里面的函数,就是类似于一种筛选
        '假设我们需要让我们的深度摄像头感兴趣的距离范围有差别地显示,那么我们就需要确定一个合适的alpha值,公式为:有效距离*alpha=255,' \
        '假设我们想让深度摄像头8m距离内的深度被显示,>8m的与8m的颜色显示相同,那么alpha=255/(8*10^3)≈0.03,' \
        '假设我们想让深度摄像头6m距离内的深度被显示,>6m的与6m的颜色显示相同,那么alpha=255/(6*10^3)≈0.0425'
        dim_gray = cv2.convertScaleAbs(dpt, alpha=0.17)
        #对深度图像进行一种图像的渲染,目前有11种渲染方式,大家可以逐一去试下
        depth_colormap = cv2.applyColorMap(dim_gray, 2)  # 有0~11种渲染的模式
 
        cv2.imshow('depth', depth_colormap)
 
        ret, frame = cap.read()
        cv2.imshow('color', frame)
 
        key = cv2.waitKey(30)
        if int(key) == ord('q'):
            break
        if int(key) == ord('r'):
            capture_flag =1
        if capture_flag==1:
            name = str(count).zfill(8)
            cv2.imwrite(base_path+'depth/'+name+".png",dpt)
            cv2.imwrite(base_path+'image/'+name+".jpg",frame)
            count = count + 1

    depth_stream.stop()
    dev.close()

  • 7
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用奥比中光深度相机获取点云Python代码示例: ```python import openni2 import numpy as np # 初始化奥比中光深度相机 openni2.initialize() # 打开设备 dev = openni2.Device.open_any() # 创建深度流 depth_stream = dev.create_depth_stream() # 启动深度流 depth_stream.start() # 获取深度图像 depth_frame = depth_stream.read_frame() # 将深度图像转换为numpy数组 depth_array = np.array(depth_frame.get_buffer_as_uint16()) # 获取相机参数 depth_stream_profile = depth_stream.get_video_stream().get_sensor_info().get_stream_profile() intrinsics = depth_stream_profile.get_intrinsics() # 计算点云 fx = intrinsics.fx fy = intrinsics.fy cx = intrinsics.ppx cy = intrinsics.ppy depth_scale = depth_stream.get_depth_scale() depth_array = depth_array.astype(float) * depth_scale rows, cols = depth_array.shape c, r = np.meshgrid(np.arange(cols), np.arange(rows), sparse=True) valid = depth_array > 0 z = np.where(valid, depth_array, np.nan) x = np.where(valid, z * (c - cx) / fx, 0) y = np.where(valid, z * (r - cy) / fy, 0) point_cloud = np.dstack((x, y, z)) # 关闭深度流 depth_stream.stop() depth_stream.destroy() # 关闭设备 dev.close() # 反初始化奥比中光深度相机 openni2.unload() ``` 以上代码中,首先使用`openni2.initialize()`初始化奥比中光深度相机,然后使用`dev.create_depth_stream()`创建深度流,并使用`depth_stream.start()`启动深度流。接着,使用`depth_stream.read_frame()`获取深度图像,并使用`depth_frame.get_buffer_as_uint16()`将深度图像转换为numpy数组。然后,使用`depth_stream.get_video_stream().get_sensor_info().get_stream_profile()`获取相机参数,并计算点云。最后,使用`depth_stream.stop()`关闭深度流,使用`dev.close()`关闭设备,最后使用`openni2.unload()`反初始化奥比中光深度相机。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值