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