Как преобразовать OpenNI VideoFrame в структуру данных OpenCV Mat? - PullRequest
0 голосов
/ 26 января 2019

Я ищу общие описания / спецификации для формата объекта openni VideoFrame, который я пытаюсь преобразовать в opencv Mat.

Есть ли официальный сайт / документация?На ros.org я обнаружил следующее, описывающее классы VideoFrameRef и OniFrame.Но, во-первых, похоже, что это связано с libfreenect, а во-вторых, я не нахожу какой-либо конкретной информации о структуре фрейма (например, размеры, каналы и т.

Код ниже - фрагмент, с которым я экспериментирую.Часть преобразования в while loop создает только черный видеопоток.

import sys
import numpy as np
import cv2
from openni import openni2
from openni import _openni2 as c_api

openni2.initialize("./Redist")

device = openni2.Device.open_any()

ir_stream = device.create_ir_stream()
ir_stream.set_video_mode(c_api.OniVideoMode(pixelFormat = c_api.OniPixelFormat.ONI_PIXEL_FORMAT_GRAY16, resolutionX = 320, resolutionY = 240, fps = 30))
ir_stream.start()

while(True):
    frame = ir_stream.read_frame()
    frame_data = frame.get_buffer_as_uint16()
    img = np.frombuffer(frame_data, dtype=np.uint16)
    img.shape = (1, 240, 320)
    img = np.concatenate((img, img, img), axis=0)
    img = np.swapaxes(img, 0, 2)
    img = np.swapaxes(img, 0, 1)
    cv2.imshow("image", img)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        cv2.destroyAllWindows()
        break

ir_stream.stop()
openni2.unload()

1 Ответ

0 голосов
/ 27 января 2019

Я хотел бы ответить на свой вопрос, так как уверен, что другие могут извлечь пользу из этого рабочего примера.

cv2.imshow() понимает uint8 (0..255), uint32 (0..2 ** 32-1) и float (0..1), поэтому мы должны привести массив, используя img.astype(np.float) / 1024

import numpy as np
import cv2
from openni import openni2
from openni import _openni2 as c_api

openni2.initialize("./Redist")
device = openni2.Device.open_any()

ir_stream = device.create_ir_stream()
ir_stream.set_video_mode(c_api.OniVideoMode(pixelFormat = c_api.OniPixelFormat.ONI_PIXEL_FORMAT_GRAY16, resolutionX = 320, resolutionY = 240, fps = 30))
ir_stream.start()

while(True):
    frame = ir_stream.read_frame()

    # returns a 1-dim c_ushort_array of len: 76'800 = 320x240 each pixel having an uint16 value 0..65535
    frame_data = frame.get_buffer_as_uint16()

    # converting to numpy.ndarray which is still 1-dimension only
    img = np.frombuffer(frame_data, dtype=np.uint16)

    # convert to 3-dimensional array
    img.shape = (240, 320)

    # normalize values 
    img = img.astype(np.float) / 1024

    # Display image
    cv2.imshow("image", img)

    # Wait for input
    if cv2.waitKey(1) & 0xFF == ord('q'):
        cv2.destroyAllWindows()
        break

ir_stream.stop()
openni2.unload()

Связанные сообщения stackoverflow:

...