Использование 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;
}
смотрите здесь