Захват 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
вызов.