Ubuntu16.04 kinectv1 openni2 libfreenect 获取rgb、depth、fusion图像,并编写cmakelist.txt、main.cpp做二次开发

1.下载libfreenect并编译安装

  git clone https://github.com/OpenKinect/libfreenect.git
    cd  libfreenect
    mkdir build
    cd build
    cmake .. –DBUILE_OPENNI2_DRIVER=ON
    make
    sudo make install

2. OpenNI2的安装

我把下载的openni2放在了home/src文件夹下,下载的网页网上很多,安装过程很简单:

cd ~/src/OpenNI-Linux-x64-2.2

然后运行install.sh

sudo  ./install.sh

生成的环境变量拷到.bashrc (并没有用)

cd  ~
sudo gedit .bashrc

copy进去之后保存退出就ok了。至此完成了OpenNI2的安装。

然后是usb的rules修改,其实freenect自带的有一个,在libfreenect/platform/linux/udev/51-kinect.rules 直接拷到 etc/udev/rules.d/下,没有找到的话在etc/udev/rules.d 下新建一个51-kienct.rules,把以下内容考进去:

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

保存退出就好了,到现在还剩下最后一步:把freenect驱动拷进来,参数 –L 要记得

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

如果要使用里面的例程 记得拷到Tools下,如下

cp -L ${HOME}/local/lib/OpenNI2-FreenectDriver/libFreenectDriver.so  OpenNI-Linux-x64-2.2/Tools/OpenNI2/Drivers

至此完成了所有步骤,如果顺利的话,NiViewer是可以运行的,我在第一次安装的时候是不成功的,具体原因是插上kinect后 ,使用lsusb查看的时候没有Xbot Camera 只有另外两个Motor 和Audio,换了一台电脑就好了,具体原因我也没该清楚,希望能够得到大家的帮助,把这个疑惑解开。所以插上kinect后,使用lsusb命令查看确保有以下三个:
Xbot camera
Xbot motor
Xbot audio
如果没有的话,检查一下是不是2.0端口,或者反复多插拔几次,这些只是经验,希望对大家有用。都有的话,运行以下命令

cd  ~/src/OpenNI-Linux-x64-2.2/Tools 
./NiViewer

会出现rgb和深度图,错误的话会出现opendevice failed

3.cmakelist.txt

复制下来就好,修改成自己的project名字

cmake_minimum_required(VERSION 2.8)
project(test)
include_directories($ENV{HOME}/src/OpenNI-Linux-x64-2.2/Include)
include_directories($ENV{HOME}/src/OpenNI-Linux-x64-2.2/Redist)

#因为环境变量不知道为什么没有生效,所以下面三行是没有用的,
#意思是从./bashrc中找OPENNI2_INCLUDE、OPENNI2_REDIST
#根据message的信息可以知道$ENV{OPENNI2_REDIST}没有任何东西
#include_directories($ENV{OPENNI2_INCLUDE})
#link_directories($ENV{OPENNI2_REDIST})
#message($ENV{OPENNI2_REDIST})

find_package(OpenCV REQUIRED)
add_executable(main main.cpp )
target_link_libraries( main ${OpenCV_LIBS} $ENV{HOME}/src/OpenNI-Linux-x64-2.2/Tools/libOpenNI2.so)

4.main.cpp

 //
    // Created by lgj on 19-5-7.
    //
    /*************************
OpenNI2 Deep, Color and Fusion Image
Author: Xin Chen, 2013.2
Blog: http://blog.csdn.net/chenxin_130
*************************/
    #include <stdlib.h>
    #include <iostream>
    #include <string>
    #include "OpenNI.h"
    #include "opencv2/core/core.hpp"
    #include "opencv2/highgui/highgui.hpp"
    #include "opencv2/imgproc/imgproc.hpp"
    using namespace std;
    using namespace cv;
    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 );
        //cout<<device.isValid()<<endl<<"shebei"<<endl;
        cout<<result<<endl;
        //Array<DeviceInfo>* deviceInfoList;
        //OpenNI::enumerateDevices(deviceInfoList);
       // cout<<(&deviceInfoList)<<endl;
        if (result != STATUS_OK)
        {
            printf("Couldn't open device\n%s\n", OpenNI::getExtendedError());
            return 2;
        }
    
        //【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.getCameraSettings()->setAutoWhiteBalanceEnabled(false);
    
        result = oniColorStream.getCameraSettings()->setAutoExposureEnabled(false);
        result = oniColorStream.setMirroringEnabled(true);
        cout<<"grain"<< oniColorStream.getCameraSettings()->getGain()<<endl;
        result = oniColorStream.getCameraSettings()->setGain(100);
        result = oniColorStream.start();
    
        while( key!=27 )
        {
            cout<<"autoExposure"<<oniColorStream.getCameraSettings()->getAutoExposureEnabled()<<endl;
            cout<<"autoExposure"<<oniColorStream.getCameraSettings()->getAutoExposureEnabled()<<endl;
            cout<<oniColorStream.getCameraSettings()->getExposure()<<endl;
    
            // 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 );
                cout<<"第 "<<oniColorImg.getFrameIndex()<<"帧"<<endl;
                cout<<"FPS"<<oniColorStream.getVideoMode().getFps()<<endl;
    
            }
    
            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;
    }

最后出图像啦

在这里插入图片描述
因为期间卸载,安装过好多次libfreenect 、libfreenect2、openni1.5 openni2.2 nite ,不知道是发生什么问题,导致自己写的另一个程序报错,无法找到usr/lib/libopenni.so
然后重新sudo apt-install libfreenect-dev
sudo apt-install libfreenect2-dev
到usr/lib下面去找,还是找不到那个文件,倒是找到一个libopenni.so.0 把名字改成libopenni.so就ok了

主要参考: https://blog.csdn.net/wsr123wsrwsr/article/details/48376805

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值