我正在尝试使用OpenCV处理来自Kinect的深度图像。我正在使用Python和primesense的绑定(https://pypi.org/project/primesense/),但在显示我从openNI获得的图像时遇到了很多麻烦。我用
import numpy as np
import cv2
from primesense import openni2
openni2.initialize("./Redist") # can also accept the path of the OpenNI redistribution
dev = openni2.Device.open_any()
depth_stream = dev.create_color_stream()
depth_stream.start()
while(True):
frame = depth_stream.read_frame()
print(type(frame)) #prints <class 'primesense.openni2.VideoFrame'>
frame_data = frame.get_buffer_as_uint8()
print(frame_data) # prints <primesense.openni2.c_ubyte_Array_921600 object at 0x000002B3AF5F8848>
image = np.array(frame_data, dtype=np.uint8)
print(type(image)) #prints <class 'numpy.ndarray'>
print(image) #prints [12 24 3 ... 1 3 12], i guess this is the array that makes the image
cv2.imshow('image', image)
depth_stream.stop()
openni2.unload()
这是输出即时消息,只是一个没有图像的窗口:
根本没有关于如何使用这些绑定的文档,因此,我在这里是一个盲点。我以为frame.get_buffer_as_uint8()
给了我准备打印的数组,但它只返回了primesense.openni2.c_ubyte_Array_921600 object at 0x000002B3AF5F8848
。
实际上,我查看了绑定的代码,发现了这一点:
def get_buffer_as_uint8(self):
return self.get_buffer_as(ctypes.c_uint8)
def get_buffer_as_uint16(self):
return self.get_buffer_as(ctypes.c_uint16)
def get_buffer_as_triplet(self):
return self.get_buffer_as(ctypes.c_uint8 * 3)
有人使用过此绑定吗?关于如何使它们工作的任何想法?预先谢谢你
答案 0 :(得分:0)
我找到了解决方法:
您不必使用image = np.array(frame_data, dtype=np.uint8)
来获取图像,而要使用frame_data = frame.get_buffer_as_uint16()
。另外,我也无法正确设置图像形状。
以备将来参考
要使用Python的OpenNI绑定从深度相机(不是Kinect相机)中获取图像,并使用OpenCV处理该图像,请使用以下代码:
import numpy as np
import cv2
from primesense import openni2
from primesense import _openni2 as c_api
openni2.initialize("./Redist") # can also accept the path of the OpenNI redistribution
dev = openni2.Device.open_any()
depth_stream = dev.create_depth_stream()
depth_stream.start()
while(True):
frame = depth_stream.read_frame()
frame_data = frame.get_buffer_as_uint16()
img = np.frombuffer(frame_data, dtype=np.uint16)
img.shape = (1, 480, 640)
img = np.concatenate((img, img, img), axis=0)
img = np.swapaxes(img, 0, 2)
img = np.swapaxes(img, 0, 1)
cv2.imshow("image", img)
cv2.waitKey(34)
depth_stream.stop()
openni2.unload()
要使用彩色相机,可以改为使用dev.create_color_stream()
。