ubuntu18.04 openni2和nite2配置KinectV1(XBOX360)

**

ubuntu18.04 openni2和nite2配置KinectV1(XBOX360)

**

血泪提示,写在前面,安装过程中不要不要插kinect,不要问为什么

先新建一个文件夹kinnet_dirver2,之后把所有下载的文件放进来,方便之后整理和查找错误。
1、安装freenect

$ git clone https://github.com/OpenKinect/libfreenect.git
$ cd libfreenect 
$ mkdir build; cd build
$ cmake .. -DBUILD_OPENNI2_DRIVER=ON 
$ make 
$ sudo make install

2、安装openni2

安装包地址:http://pan.baidu.com/s/1gd9XdIV(推荐OpenNI-Linux-x64-2.2版本)

$ cd OpenNI-Linux-x64-2.2
$ sudo  ./install.sh
$ sudo   gedit  /etc/udev/rules.d/51-kinect.rules

添加以下内容:

UBSYSTEM=="usb", ATTR{idVendor}=="045e", ATTR{idProduct}=="02b0", MODE:="0666", OWNER:="root", GROUP:="video"  
SUBSYSTEM=="usb", ATTR{idVendor}=="045e", ATTR{idProduct}=="02ad", MODE:="0666", OWNER:="root", GROUP:="video"  
SUBSYSTEM=="usb", ATTR{idVendor}=="045e", ATTR{idProduct}=="02ae", MODE:="0666", OWNER:="root", GROUP:="video"  
SUBSYSTEM=="usb", ATTR{idVendor}=="045e", ATTR{idProduct}=="02c2", MODE:="0666", OWNER:="root", GROUP:="video"  
SUBSYSTEM=="usb", ATTR{idVendor}=="045e", ATTR{idProduct}=="02be", MODE:="0666", OWNER:="root", GROUP:="video"  
SUBSYSTEM=="usb", ATTR{idVendor}=="045e", ATTR{idProduct}=="02bf", MODE:="0666", OWNER:="root", GROUP:="video"  

保存关闭。最后一步:把freenect驱动拷进来,参数 –L 要记得

cp -L /usr/local/lib/OpenNI2-FreenectDriver/libFreenectDriver.so  OpenNI-Linux-x64-2.2/Redist/OpenNI2/Drivers
cp -L /usr/local/lib/OpenNI2-FreenectDriver/libFreenectDriver.so  OpenNI-Linux-x64-2.2/Tools/OpenNI2/Drivers

测试安装是否成功
– 连上kinect,输入命令:$ lsusb
– 显示:”…Xbox NUI Camera…Xbox NUI Motor…Xbox NUI Audio…”
– 命令:$ cd OpenNI-Linux-x64-2.2/Tools
– 命令:$ ./NiViewer
– 正常显示深度图及彩色图。

3、安装NITE2.0(与openni2.2搭配)
安装包地址:http://pan.baidu.com/s/1gd9XdIV(推荐NiTE-Linux-x64-2.2版本)

$cd NiTE-Linux-x64-2.0.0
$ sudo  ./install.sh

添加驱动:
cp /usr/local/lib/OpenNI2-FreenectDriver/libFreenectDriver.so NiTE-2.0.0/Samples/Bin/OpenNI2/Drivers
测试:
然后关键的一步,把OpenNI-Linux-x86-2.2/Redist下的libopenNI.so考过来replace掉NiTE-2.0.0/Samples/Bin/下原来的那个文件,在进到NiTE-2.0.0/Samples/Bin/下跑UserViewer时出现了想要的深度图。

实际测试:

使用自己的CMAKELists文件进行测试,连接kinect

project(opencvtest)

set(CMAKE_CXX_STANDARD 11)

find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})

include_directories("/usr/include/openni2")
include_directories("/usr/include/eigen3")

add_executable(opencvtest main.cpp)
target_link_libraries(opencvtest ${OpenCV_LIBS} "/home/linzhiwei/kinect_dirver2/OpenNI-Linux-x64-2.2/Tools/libOpenNI2.so")

main.cpp文件:

#include 
#include 
#include 
#include 

#include 


using namespace cv;
using namespace std;
using namespace openni;

void CheckOpenNIError( Status result, string status )
{
    if( result != STATUS_OK )
        cerr << status << " Error: " << OpenNI::getExtendedError() << endl;
}

int main( int argc, char** argv )
{
    Status result = STATUS_OK;

    //OpenNI2 image
    VideoFrameRef oniDepthImg;
    VideoFrameRef oniColorImg;

    //OpenCV image
    cv::Mat cvDepthImg;
    cv::Mat cvBGRImg;
    cv::Mat cvFusionImg;

    cv::namedWindow("depth");
    cv::namedWindow("image");
    cv::namedWindow("fusion");
    char key=0;

    //【1】
    // initialize OpenNI2
    result = OpenNI::initialize();
    CheckOpenNIError( result, "initialize context" );

    // open device
    Device device;
    result = device.open( openni::ANY_DEVICE );

    //【2】
    // create depth stream
    VideoStream oniDepthStream;
    result = oniDepthStream.create( device, openni::SENSOR_DEPTH );

    //【3】
    // set depth video mode
    VideoMode modeDepth;
    modeDepth.setResolution( 640, 480 );
    modeDepth.setFps( 30 );
    modeDepth.setPixelFormat( PIXEL_FORMAT_DEPTH_1_MM );
    oniDepthStream.setVideoMode(modeDepth);
    // start depth stream
    result = oniDepthStream.start();

    // create color stream
    VideoStream oniColorStream;
    result = oniColorStream.create( device, openni::SENSOR_COLOR );
    // set color video mode
    VideoMode modeColor;
    modeColor.setResolution( 640, 480 );
    modeColor.setFps( 30 );
    modeColor.setPixelFormat( PIXEL_FORMAT_RGB888 );
    oniColorStream.setVideoMode( modeColor);

//【4】
    // set depth and color imge registration mode
    if( device.isImageRegistrationModeSupported(IMAGE_REGISTRATION_DEPTH_TO_COLOR ) )
    {
        device.setImageRegistrationMode( IMAGE_REGISTRATION_DEPTH_TO_COLOR );
    }
    // start color stream
    result = oniColorStream.start();

    while( key!=27 )
    {
        // read frame
        if( oniColorStream.readFrame( &oniColorImg ) == STATUS_OK )
        {
            // convert data into OpenCV type
            cv::Mat cvRGBImg( oniColorImg.getHeight(), oniColorImg.getWidth(), CV_8UC3, (void*)oniColorImg.getData() );
            cv::cvtColor( cvRGBImg, cvBGRImg, CV_RGB2BGR );
            cv::imshow( "image", cvBGRImg );
        }

        if( oniDepthStream.readFrame( &oniDepthImg ) == STATUS_OK )
        {
            cv::Mat cvRawImg16U( oniDepthImg.getHeight(), oniDepthImg.getWidth(), CV_16UC1, (void*)oniDepthImg.getData() );
            cvRawImg16U.convertTo( cvDepthImg, CV_8U, 255.0/(oniDepthStream.getMaxPixelValue()));
            //【5】
            // convert depth image GRAY to BGR
            cv::cvtColor(cvDepthImg,cvFusionImg,CV_GRAY2BGR);
            cv::imshow( "depth", cvDepthImg );
        }
        //【6】
        cv::addWeighted(cvBGRImg,0.5,cvFusionImg,0.5,0,cvFusionImg);
        cv::imshow( "fusion", cvFusionImg );
        key = cv::waitKey(20);
    }

    //cv destroy
    cv::destroyWindow("depth");
    cv::destroyWindow("image");
    cv::destroyWindow("fusion");

    //OpenNI2 destroy
    oniDepthStream.destroy();
    oniColorStream.destroy();
    device.close();
    OpenNI::shutdown();
     return 0;
}

测试结果:

你可能感兴趣的:(ubuntu18.04,openni2和nite2)