最近入手一个Kinect2.0,在Ubuntu18.04中进行驱动安装测试以及深度图像的保存。
1. 驱动安装与测试
Kinect 2.0 在Windows系统中是有官方提供的现成的驱动程序可以使用的,并且有对应的SDK可以辅助开发人员进行应用开发,但在Linux系统中,就需要在Github上找对应的开源驱动代码,并且进行安装调试。
Kinect 2.0 的开源驱动包位于:https://github.com/OpenKinect
在其内有两类驱动,
- 一类是 libfreenect 用于Kinect1.0的驱动;
- 二类是 libfreenect2 用于二代Kinect2.0的驱动
在本文中用的是Kinect2.0驱动程序,以下内容是针对Ubuntu18.04系统
安装依赖:
sudo apt-get install build-essential cmake pkg-config libturbojpeg libturbojpeg0-dev libjpeg-turbo8-dev mesa-common-dev freeglut3-dev libxrandr-dev libxi-dev
clone下载kinect2.0驱动包libfreenect2:
cd ~/Compile/Kinect2/
git clone https://github.com/OpenKinect/libfreenect2.git
cd libfreenect2
- 编译
mkdir build && cd build
cmake ..
make -j
sudo make install
编译报错
解决: 安装
sudo apt-get install libturbojpeg0-dev
- 设置udev规则文件
sudo cp ../platform/linux/udev/90-kinect2.rules /etc/udev/rules.d/
用lsusb
命令查看kinect2.0是否识别出来,其中045e:02c4
、045e:02d8
、045e:02d9
就是微软的kinect2.0
- 测试驱动是否安装成功
Kinnect2.0重新插拔后,运行测试./bin/Protonect
2.OpenCV通过libfreenect2显示Kinect2深度图与彩色图
编程实现通过Ubuntu读取Kinect的数据,同样需要借助于驱动包所提供的库函数,下面就详细解释如何在程序中实现数据的获取与处理。
找一个工作区间workspace进行测试
touch CMakeLists.txt kinect2test.cpp
kinect2test.cpp
#include
#include
#include
#include
#include //用于输出log日志信息
#include
#include
#include
#include
#include
#include
using namespace std;
using namespace cv;
enum Processor { cl, gl, cpu };
int main(int argc, char *argv[])
{
// 定义全局变量方便调用
libfreenect2::Freenect2 freenect2;
libfreenect2::Freenect2Device *dev = nullptr;
libfreenect2::PacketPipeline *pipeline = nullptr;
//初始化Kinect2.0
if(freenect2.enumerateDevices() == 0)
{
std::cout << "no device connected!" << std::endl;
return -1;
}
string serial = freenect2.getDefaultDeviceSerialNumber();
if(serial == "") return -1;
cout<<"The serial number is :"<setColorFrameListener(&listener);
dev->setIrAndDepthFrameListener(&listener);
//! [listeners]
//! [start]
dev->start();
std::cout << "device serial: " << dev->getSerialNumber() << std::endl;
std::cout << "device firmware: " << dev->getFirmwareVersion() << std::endl;
//! [start]
libfreenect2::Registration* registration = new libfreenect2::Registration(dev->getIrCameraParams(), dev->getColorCameraParams());
libfreenect2::Frame undistorted(512, 424, 4), registered(512, 424, 4), depth2rgb(1920, 1080 + 2, 4);
Mat rgbmat, depthmat, irmat, depthmatUndistorted, rgbd, rgbd2;
while(!(waitKey(1)==27))
{
listener.waitForNewFrame(frames);
libfreenect2::Frame *rgb = frames[libfreenect2::Frame::Color];
libfreenect2::Frame *ir = frames[libfreenect2::Frame::Ir];
libfreenect2::Frame *depth = frames[libfreenect2::Frame::Depth];
//! [loop start]
Mat rgbmat = cv::Mat(rgb->height, rgb->width, CV_8UC4, rgb->data);
Mat irmat = cv::Mat(ir->height, ir->width, CV_32FC1, ir->data);
Mat depthmat =cv::Mat(depth->height, depth->width, CV_32FC1, depth->data);
cv::imshow("rgb", rgbmat);
cv::imshow("ir", irmat / 4500.0f);
cv::imshow("depth", depthmat / 4500.0f);
// //! [registration]
// registration->apply(rgb, depth, &undistorted, ®istered, true, &depth2rgb);
// //! [registration]
// cv::Mat(undistorted.height, undistorted.width, CV_32FC1, undistorted.data).copytTo(depthmatUndistorted);
// cv::Mat(registered.height, registered.width, CV_8UC4, registered.data).copyTo(rgbd);
// cv::Mat(depth2rgb.height, depth2rgb.width, CV_32FC1, depth2rgb.data).copyTo(rgbd2);
// cv::imshow("undistorted", depthmatUndistorted / 4500.0f);
// cv::imshow("registered", rgbd);
// cv::imshow("depth2RGB", rgbd2 / 4500.0f);
//! [loop end]
listener.release(frames);
}
//! [loop end]
//! [stop]
dev->stop();
dev->close();
//! [stop]
delete registration;
std::cout << "Goodbye World!" << std::endl;
return 0;
}
CMakeLists.txt
# cmake needs this line
cmake_minimum_required(VERSION 2.8)
# Enable C++11
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
# Define project name
project(kinect)
# Find OpenCV, you may need to set OpenCV_DIR variable
# to the absolute path to the directory containing OpenCVConfig.cmake file
# via the command line or GUI
find_package(OpenCV REQUIRED)
FIND_PACKAGE(PkgConfig REQUIRED)
FIND_PACKAGE(freenect2 REQUIRED)
include_directories( ${OpenCV_INCLUDE_DIRS} )
include_directories( ${freenect2_INCLUDE_DIRS} )
# Declare the executable target built from your sources
add_executable(kinect kinect.cpp)
# Link your application with OpenCV libraries
target_link_libraries(kinect ${freenect2_LIBRARIES} ${OpenCV_LIBS})
编译
mkdir build && cd build
cmake .. && make
运行./kinect
3. ROS中配置Kinect2
在ROS中配置Kinect的是通过 IAI Kinect2 包的安装实现的,这个包为 ROS 和 Kinect 的连接提供了必要的工具和库。
3.1 IAI Kinect2 功能
IAI Kinect2包提供了以下功能:
- a calibration tool for calibrating the IR sensor of the Kinect One to the RGB sensor and the depth measurements
- a library for depth registration with OpenCL support
- the bridge between libfreenect2 and ROS
- a viewer for the images / point clouds
从以上功能中可以看出,IAI Kinect2包的使用,需要在系统中安装libfreenect2,就是我们第一步中所安装的驱动包。
3.2 安装编译
cd ~/Workspace/catkin_ws_kinect2 && mkdir src && cd src
git clone https://github.com/code-iai/iai_kinect2.git
cd iai_kinect2
rosdep install --from-paths . --ignore-src -r
cd ~/Workspace/catkin_ws_kinect2
catkin_make -DCMALE_BUILD_TYPE="Release"
在执行rosdep install -r --from-paths .时可能汇报错:
没有关系,这些依赖库就是我们之后要安装的,忽视就好了.
source devel/setup.bash
roslaunch kinectt2_bridge kinect2_bridge.launch #使用roslaunch启动相关节点
再开一个终端
source devel/setup.bash
rosrun kinect2_viewer kinect2_viewer sd cloud
在窗口中按下s键进行彩色图像与深度图像的保存,默认保存终端开启的当前目录,可以先建立一个save目录,再执行上述命令进行保存操作用于保存深度图彩色图
可以看出每按一次S键都会保存四副图像(cloud.pcd、color.jpg、depth.png、depth_colored.png),命名从0000开始,同一窗口不断按空格就0001,0002依次保存下去,重新run的话在新窗口又是从0000开始保存,在控制窗口可以使用ctrl+c 关闭节点,在iai_kinect2/kinect2_viewer/src/下打开viewer.cpp可以去查看对应的源码来了解对应参数的意义
5. 保存彩色图像png和深度图像pgm
6. PCL库安装与kinect2数据读取
7. NiTE2
-
- 去这里下载NiTE2的SDK
NiTE-Linux-x64-2.2.tar1.zip
(因为我的台式机是64位系统)
- 去这里下载NiTE2的SDK
-
-
解压
-
3.配置环境变量到.bashrc中
cd /home/clark/Compile/NiTE-Linux-x64-2.2
chmod 777 install.sh
sudo ./install.sh #这一步后会生成一个NiTEDevEnvironment文件
cat NiTEDevEnvironment >> ~/.bashrc #添加到.bashrc环境变量中
-
- 配置libfreenect2-openni2的路径
前往/home/clark/Compile/NiTE-Linux-x64-2.2/Samples/Bin
修改文件OpenNI.ini
中的最后一行为Repository=/usr/local/lib/OpenNI2/Drivers
指向OpenNI2的两个libfreenect2-openni2.so文件所在的目录
- 配置libfreenect2-openni2的路径
-
- 运行Sample的UserViewer例子
cd /home/clark/Compile/NiTE-Linux-x64-2.2/Samples/Bin
./UserViewer
7. 总结
至此,完成了Ubuntu1804环境下利用libfreenect2读取Kinect2数据并在opencv进行显示,利用iai_kinect库建立ROS与Kinect之间的通道Bridge并完成彩色图像深度图像的保存。
8. 参考
- Ubuntu 16.04 中 Kinect 2.0 的 libfreenect2 驱动配置及其图像读取编程实现
- 基于libfreenect2 &ROS 下的iai_kinect2 实现kinectV2的图像获取和保存 【ubuntu18.04】