Использование Microsoft Kinect с Opencv 3.0.0

Здравствуйте, я пытаюсь получить карты несоответствия от Microsoft Kinect для Xbox 360. У меня есть opencv 3.0.0 и openni2 с установленной libfreenect. Когда я запускаю свой код

#include "opencv2/opencv.hpp"

using namespace cv;

int main(int, char**){

    VideoCapture capture( CAP_OPENNI2 );
    namedWindow("win",1);

    for(;;){
        Mat depthMap;
        capture >> depthMap;
        imshow("win",depthMap);
        if( waitKey( 30 ) >= 0 ) break;
    }

    return 0;
}

Мой Kinect начинает проецировать ИК-модель, но затем я получаю кучу ошибок

OpenNI2-FreenectDriver: Using libfreenect v0.5.3

OpenNI2-FreenectDriver: Found device freenect://0

OpenNI2-FreenectDriver: Opening device freenect://0

[Stream 70] Negotiated packet size 1920

write_register: 0x0105 <= 0x00

write_register: 0x0006 <= 0x00

write_register: 0x0012 <= 0x03

write_register: 0x0013 <= 0x01

write_register: 0x0014 <= 0x1e

write_register: 0x0006 <= 0x02

write_register: 0x0017 <= 0x00

[Stream 80] Negotiated packet size 1920

write_register: 0x000c <= 0x00

write_register: 0x000d <= 0x01

write_register: 0x000e <= 0x1e

write_register: 0x0005 <= 0x01

[Stream 70] Lost 2 total packets in 0 frames (inf lppf)

[Stream 70] Lost 5 total packets in 0 frames (inf lppf)

write_register: 0x0047 <= 0x00

OpenNI2-FreenectDriver: (ERROR) Unexpected size for XN_STREAM_PROPERTY_ZERO_PLANE_DISTANCE

OpenCV Error: Unspecified error (CvCapture_OpenNI2::readCamerasParams : Could not read virtual plane distance! ) in readCamerasParams, file /home/ubuntu/opencv-3.0.0/modules/videoio/src/cap_openni2.cpp, line 379 terminate called after throwing an instance of 'cv::Exception' what(): /home/ubuntu/opencv-3.0.0/modules/videoio/src/cap_openni2.cpp:379: error: (-2) CvCapture_OpenNI2::readCamerasParams : Could not read virtual plane distance! in function readCamerasParams

Aborted

1 ответ

libfreenect исправлена ​​необходимая ошибка.

cd OpenNI2-FreenectDriver / src vim DepthStream.hpp

В строке 173 проверка для XN_STREAM_PROPERTY_ZERO_PLANE_DISTANCE ожидает pDataSize размера без знака long long. Тем не менее, OpenNI2 ожидает int32_t (размер 8 против размера 4), поэтому ошибка в порядке. Эта ошибка не появляется, если вы используете только OpenNI2 или NiTE2, так как они не запрашивают это свойство. Однако, если вы используете OpenCV+OpenNI2, указанное свойство будет запрошено.

Фикс. Изменить случай XN_STREAM_PROPERTY_ZERO_PLANE_DISTANCE с помощью:

 case XN_STREAM_PROPERTY_ZERO_PLANE_DISTANCE:    // unsigned long long or unsigned int (for OpenNI2/OpenCV)

    if ( *pDataSize != sizeof(unsigned long long) && *pDataSize != sizeof(unsigned int) )
      { 
        LogError("Unexpected size for XN_STREAM_PROPERTY_ZERO_PLANE_DISTANCE!!!");
        return ONI_STATUS_ERROR;
      } else {
          if( *pDataSize == sizeof(unsigned long long) ) {
              *(static_cast<unsigned long long*>(data)) = ZERO_PLANE_DISTANCE_VAL;
          } else {
              *(static_cast<unsigned int*>(data)) = (unsigned int) ZERO_PLANE_DISTANCE_VAL;
          }
      return ONI_STATUS_OK;
       }

смотрите здесь

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