Цвет и глубина отображения с использованием OpenNI и OpenCV

Недавно я много писал о доступе к глубинным изображениям с камеры Kinect, используя OpenNI и OpenCV.

Следуя некоторым учебникам и советам из других постов, я смог написать этот скрипт для показа 2D цветового потока камеры (если вторая часть закомментирована) и потока глубины, который еще не работает:

#include <opencv2/opencv.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <OpenNI.h>

int main()
{
openni::Device device;

openni::VideoStream  color;
openni::VideoStream depth;

openni::VideoFrameRef depthFrame;
openni::VideoFrameRef colorFrame;

openni::Status rc = openni::STATUS_OK;

rc = openni::OpenNI::initialize();
rc = device.open(openni::ANY_DEVICE);

rc = color.create(device, openni::SENSOR_COLOR);
rc = color.start();
rc = depth.create(device, openni::SENSOR_DEPTH);
rc = depth.start();

cv::Mat framecolor;
cv::Mat framedepth;

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

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

cv::cvtColor(framecolor, framecolor, CV_BGR2RGB); //this will put colors right
cv::imshow("framecolor", framecolor);
////////////////////////////Second Part/////////////////////////////////////
depthFrame.getVideoMode();
const openni::DepthPixel* imageBuffer2 = (const openni::DepthPixel*)depthFrame.getData();

framedepth.create(depthFrame.getHeight(), depthFrame.getWidth(), CV_16U);
memcpy(framecolor.data, imageBuffer2, 3 * depthFrame.getHeight()*depthFrame.getWidth() * sizeof(uint16_t));
framedepth.convertTo(framedepth, CV_8U);
cv::imshow("framedepth", framedepth);

if (cvWaitKey(30)>=0)
{
break;
}
}
cv::destroyAllWindows();
return 0;
}

Ошибка, которую я получаю, приводит меня к файлу openNI.g со следующим:

введите описание изображения здесь

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

Может ли кто-нибудь помочь с необходимыми типами файлов или процедур?

2

Решение

в коде есть ошибка,

framedepth.create(depthFrame.getHeight(), depthFrame.getWidth(), CV_16U);
memcpy(**framecolor.data**, imageBuffer2, 3 * depthFrame.getHeight()*depthFrame.getWidth() * sizeof(uint16_t));
framedepth.convertTo(framedepth, CV_8U)

должно быть

framedepth.create(depthFrame.getHeight(), depthFrame.getWidth(), CV_16U);
memcpy(**framedepth.data**, imageBuffer2, 3 * depthFrame.getHeight()*depthFrame.getWidth() * sizeof(uint16_t));
framedepth.convertTo(framedepth, CV_8U)
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector