2015-06-08 3 views
0

У меня есть потоковые данные kinect в cv::Mat. Я пытаюсь запустить пример кода, использующего OpenNI.Преобразование cv :: Mat to openni :: VideoFrameRef

Можно ли каким-либо образом преобразовать свой Mat в формат OpenNI?

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

Я использую OpenCV 3, Visual Studio 2013, Kinect v2 для Windows.

Соответствующий код:

void CDifodoCamera::loadFrame() 
{ 
    //Read the newest frame 
    openni::VideoFrameRef framed; //I assume I need to replace this with my Mat... 
    depth_ch.readFrame(&framed); 

    const int height = framed.getHeight(); 
    const int width = framed.getWidth(); 

    //Store the depth values 
    const openni::DepthPixel* pDepthRow = (const openni::DepthPixel*)framed.getData(); 
    int rowSize = framed.getStrideInBytes()/sizeof(openni::DepthPixel); 

    for (int yc = height-1; yc >= 0; --yc) 
    { 
     const openni::DepthPixel* pDepth = pDepthRow; 
     for (int xc = width-1; xc >= 0; --xc, ++pDepth) 
     { 
      if (*pDepth < 4500.f) 
       depth_wf(yc,xc) = 0.001f*(*pDepth); 

      else 
       depth_wf(yc,xc) = 0.f; 
     } 

     pDepthRow += rowSize; 
    } 
} 
+0

Зачем вам нужно открыть? Я имею в виду, что этот примерный код можно переписать для работы непосредственно с opencv-изображением и без openni .... – api55

+0

Еще лучше! Я просто не был уверен, как получить Мат. Как я могу переписать его, чтобы сделать эту работу? Спасибо за ваше время. – anti

ответ

1

Прежде всего, необходимо понять, как приходит ваши данные ... Если это уже в cv::Mat вы должны получать два изображения, одно для информации RGB, которая обычно является 3-канальный uchar cv::Mat и другое изображение для информации о глубине, которая обычно сохраняется в 16-битном представлении в миллиметрах (вы не можете сохранять float mat в качестве изображений, но вы можете использовать файлы yml/xml с помощью opencv).

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

void CDifodoCamera::loadFrame() 
{ 
    //Read the newest frame 
    //the depth image should be png since it is the one which supports 16 bits and it must have the ANYDEPTH flag 
    cv::Mat depth_im = cv::imread("img_name.png",CV_LOAD_IMAGE_ANYDEPTH); 

    const int height = depth_im.rows; 
    const int width = depth_im.cols; 

    for (int y = 0; y < height; y++) 
    { 
     for (int x = 0; x < width; x++) 
     { 
      if (depth_im<unsigned short>(y,x) < 4500) 
       depth_wf(y,x) = 0.001f * (float)depth_im<unsigned short>(y,x); 

      else 
       depth_wf(y,x) = 0.f; 
     } 
    } 
} 

Я надеюсь, что это поможет. Если у вас есть вопрос, просто спросите :)

+0

Привет, и спасибо! depth_wf определяется как:/** Матрица, в которой хранятся исходные рамки глубины с разрешением изображения */\t \t Eigen :: MatrixXf depth_wf; > Я получаю ошибки с вашим кодом, «имя типа не разрешено», «без знака» и «плавать». Еще раз спасибо – anti

+1

Если это 'Eigen :: Matrix', то это без типа (посмотрите на мой отредактированный пост). Другой (depth_im) должен быть с типом, так как он является opencv Mat – api55

+0

ОК, я думаю, я его получил. Еще раз спасибо! – anti