I am trying to receive a depth image from an Orbbec Astra Pro camera connected to a Windows 10 machine. I have therfor installed opencv-python 4.0.0.21
and primesense 2.2.0.30.post5
which seems to be latest stable python packages available.
This is the code snippet I am experimenting with:
import numpy as np
import cv2
from primesense import openni2
from primesense import _openni2 as c_api
openni2.initialize("./OpenNI-Windows-x64-2.3/Redist")
if openni2.is_initialized():
print('openni2 ready')
else:
print('openni2 not ready')
dev = openni2.Device.open_any()
depth_stream = dev.create_depth_stream()
depth_stream.set_video_mode(c_api.OniVideoMode(pixelFormat = c_api.OniPixelFormat.ONI_PIXEL_FORMAT_DEPTH_100_UM, resolutionX = 640, resolutionY = 480, fps = 30))
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()
However when cv2.imshow()
is getting called I am receiving:
cv2.error: OpenCV(4.0.0) C:\projects\opencv-python\opencv\modules\highgui\src\window_w32.cpp:1230: error: (-215:Assertion failed) dst.data == (uchar*)dst_ptr in function 'cvShowImage'
I have no idea on how to convert an OpenNI frame to an OpenCV mat data structure and why cv2.imshow()
refuses to show an image. OpenNI seems to correctly initialize, at least it prints openni2 ready
... What am I doing wrong here?
Edit
This seems to be a bug which I have reported here https://github.com/skvark/opencv-python/issues/167
Solution (kind of)
Downgrading OpenCV version to the latest 3.x release made it work!
pip install --upgrade opencv-python==3.4.5.20
Have you tried:
In opencv4 for some reason imshow will not work if you do not use specific dtype