2014-01-16 5 views
0

Я начинаю программировать с openni и открывать cv Я работаю с kinect. здесь часть кода, которую я использую для получения карты глубины данных (она работает) Теперь мой вопрос: Как я могу получить карту дефтов как изображение взамен? мои данные находятся на DepthPixel * pDepth1, и я хочу отобразить изображение карты глубины (потому что я хочу ее сохранить). Спасибополучить карту глубины из данных глубины kinect openni open cv

VideoFrameRef frame; 

DepthPixel* pDepth1 = NULL; 
DepthPixel* pDepth2 = NULL; 
for (int i = 0; i < 2; i++) 
{ 
    int changedStreamDummy; 
    VideoStream* pStream = &depth; 
    rc = OpenNI::waitForAnyStream(&pStream, 1, &changedStreamDummy, SAMPLE_READ_WAIT_TIMEOUT); 
    if (rc != STATUS_OK) 
    { 
     printf("Wait failed! (timeout is %d ms)\n%s\n", SAMPLE_READ_WAIT_TIMEOUT, OpenNI::getExtendedError()); 
     continue; 
    } 

    rc = depth.readFrame(&frame); 
    if (rc != STATUS_OK) 
    { 
     printf("Read failed!\n%s\n", OpenNI::getExtendedError()); 
     continue; 
    } 

    if (frame.getVideoMode().getPixelFormat() != PIXEL_FORMAT_DEPTH_1_MM && frame.getVideoMode().getPixelFormat() != PIXEL_FORMAT_DEPTH_100_UM) 
    { 
     printf("Unexpected frame format\n"); 
     continue; 
    } 

    if (i == 0){ 
     int dummy; 
     cout << "Press any key to take first pic: "; 
     cin >> dummy; 
     pDepth1 = (DepthPixel*)frame.getData(); 
    } 
    else{ 
     int dummy; 
     cout << "Press any key to take second pic: "; 
     cin >> dummy; 
     pDepth2 = (DepthPixel*)frame.getData(); 
    } 
+0

Насколько я помню, OpenNI поставляет карты глубины kinect с целым числом без знака 16 бит, поэтому CV_16U. Попробуйте 'cv :: Mat depth (frame_height, frame_width, CV_16U, reinterpret_cast (pDepth1));'. Если это сработает, вы можете сохранить его на диск, но не забудьте проверить, как OpenCV конвертирует изображения перед сохранением, возможно, вам придется вручную конвертировать в CV_8U раньше (и потерять точность) или использовать другую библиотеку для сохранения изображений. – Micka

+0

Я не хочу сохранять на диск, я просто хочу показать результат – user1876275

+0

Знаете ли вы, как это сделать? спасибо! – user1876275

ответ

0

Если предположить, что у вас есть ваша зависимость выясняла, следующие работал для меня в прошлом

//set up the capture with the correct settings  
VideoCapture capture = new VideoCapture; 
capture->open(CV_CAP_OPENNI); 
capture->set(CV_CAP_OPENNI_IMAGE_GENERATOR_OUTPUT_MODE, CV_CAP_OPENNI_VGA_30HZ); 

//get an image and display it 
Mat image; 
capture->grab(); 
capture->retrieve(image, CV_CAP_OPENNI_DEPTH_MAP); 

затем работать с изображением, как и любая другая матрица. Помните, что изображение CV_16U в качестве записи записывает глубину в 16-битных целых числах без знака.

Смежные вопросы