要同时读取两个摄像头的深度数据需要在openni2库中创建一个新的函数
@classmethod
def open_any_available(cls, id):
z= 0
for cam in cls.enumerate_uris():
if z== id:
try:
return cls(cam)
except OpenNIError:
pass
z+=1
raise Exception("no available cams")
下面是一个简单示例代码
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_available(0)
print(dev.get_device_info())
dev1=openni2.Device.open_any_available(1)
depth_stream = dev.create_depth_stream()
depth_stream.start()
depth_stream1 = dev1.create_depth_stream()
depth_stream1.start()
cap = cv2.VideoCapture(0)
cap1 = cv2.VideoCapture(2)
cv2.namedWindow('depth')
cv2.setMouseCallback('depth',mousecallback)
while True:
frame = depth_stream.read_frame()
frame1 =depth_stream1.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
dframe_data1 = np.array(frame1.get_buffer_as_triplet()).reshape([480, 640, 2])
dpt11 = np.asarray(dframe_data1[:, :, 0], dtype='float32')
dpt21 = np.asarray(dframe_data1[:, :, 1], dtype='float32')
dpt21 *= 255
dpt31 = dpt11 + dpt21
cv2.imshow('depth', dpt)
cv2.imshow('depth1', dpt31)
ret,frame = cap.read()
#ret1,frame1 = cap1.read()
cv2.imshow('color', frame)
#cv2.imshow('color1', frame1)
key = cv2.waitKey(1)
if int(key) == ord('q'):
break
depth_stream.stop()
dev.close()