Захват RGB от Kinnect с Openni и шоу с OpenCV

Мне нужно захватить цветное RGB-изображение с камеры Kinnect, но я хочу показать его в OpenCV, поскольку это только часть более крупной программы. Я знаю, что OpenCV совместим с OpenNI, если вы установите флаг, но, хотя я очень старался, CMake не смог найти путь к OpenNI2, поэтому я не смог собрать OpenCV с OpenNI. В любом случае, я думаю, что хорошо знать, как вручную конвертировать фреймы OpenNI в фреймы openCV, поэтому я решил пойти по этому пути.

Для захвата цветной рамки в OpenNI я попробовал следующее:

openni::Device device;  
openni::VideoStream  color;
openni::VideoFrameRef colorFrame;

rc = openni::OpenNI::initialize();
rc = device.open(openni::ANY_DEVICE);
rc = color.create(device, openni::SENSOR_COLOR);
rc = color.start();

color.readFrame(&colorFrame);
const openni::RGB888Pixel* imageBuffer = (const openni::RGB888Pixel*)colorFrame.getData();

Но сейчас я не понимаю, как сделать преобразование в cv::Mat.

Кому-нибудь удалось это сделать?

2 ответа

Решение

Хорошо, сначала вы должны отделить инициализацию от цикла для чтения кадров, таким образом.

инициализация

openni::Device device;  
openni::VideoStream  color;
openni::VideoFrameRef colorFrame;

rc = openni::OpenNI::initialize();
rc = device.open(openni::ANY_DEVICE);
rc = color.create(device, openni::SENSOR_COLOR);
rc = color.start();

Mat frame;

Теперь идет основной цикл чтения рамок. Вы сделали почти все, осталось только скопировать буфер в OpenCV Mat.

Петля для чтения рамок

while (true)
{
   color.readFrame(&colorFrame);
   const openni::RGB888Pixel* imageBuffer = (const openni::RGB888Pixel*)colorFrame.getData();

   frame.create(colorFrame.getHeight(), colorFrame.getWidth(), CV_8UC3);
   memcpy( frame.data, imageBuffer, 3*colorFrame.getHeight()*colorFrame.getWidth()*sizeof(uint8_t) );

   cv::cvtColor(frame,frame,CV_BGR2RGB); //this will put colors right
}

Следуя ответу @Jav_Rock выше, для IR и Depth решение аналогично, за исключением следующего (вместо SENSOR_COLOR, CV_8UC3 а также RGB888Pixelсоответственно):

глубина

  • Тип датчика: SENSOR_DEPTH
  • Тип OpenCV: CV_16UC1
  • Данные VideoFrameRef: DepthPixel

Обратите внимание, что вы, вероятно, захотите установить PixelMode для VideoFormat VideoStream в PIXEL_FORMAT_DEPTH_100_UM в противном случае ваше изображение глубины будет выглядеть очень черным.

инфракрасный

  • Тип датчика: SENSOR_IR
  • Тип OpenCV: CV_16UC1
  • Данные VideoFrameRef: Grayscale16Pixel

Наконец, обратите внимание, что ни глубина, ни ИК не нуждаются в cv::cvtColor вызов.

Другие вопросы по тегам