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

1

There are 1 answers

0
Antonin GAVREL On

Have you tried:

frame.get_buffer_as_uint32()
img = np.frombuffer(frame_data, dtype=np.uint32)

In opencv4 for some reason imshow will not work if you do not use specific dtype