1.源代码
#include"kinect2_grabber.h"
//---------------------------------
#include <kinect.h>
#include<pcl\io\pcd_io.h>
#include <pcl/filters/conditional_removal.h>//滤波
#include <pcl/visualization/cloud_viewer.h> //可视化
#include <pcl/visualization/pcl_visualizer.h>
typedef pcl::PointXYZRGBA PointType;
int main()
{
int c = 0;
int total = 0;//文件名
//pcl::PointCloud<PointType> cloud_filtered;// 按范围过滤后的点云
boost::shared_ptr<pcl::visualization::PCLVisualizer> m_viewer;
//显示窗口初始化
m_viewer.reset(new pcl::visualization::PCLVisualizer("viewer", false));
m_viewer->setBackgroundColor(0, 0, 0);//设置背景颜色
m_viewer->initCameraParameters();
//m_viewer->addCoordinateSystem();//添加红绿蓝坐标轴
m_viewer->createInteractor();
// 获取Kinect设备
// Point Cloud
pcl::PointCloud<PointType>::ConstPtr pointCloud_XYZRGBA; //指针变量
// Retrieved Point Cloud Callback Function 检测到的点云回调函数
boost::mutex mutex; //并发编程互斥锁
boost::function<void(const pcl::PointCloud<PointType>::ConstPtr&)> function = [&pointCloud_XYZRGBA, &mutex](const pcl::PointCloud<PointType>::ConstPtr& ptr) { //只能用ConstPtr,不能用Ptr
boost::mutex::scoped_lock lock(mutex);
/* Point Cloud Processing */
pointCloud_XYZRGBA = ptr->makeShared();
//ptr->makeShared() = NULL;
};
boost::shared_ptr<pcl::Grabber> grabberForKinect = boost::shared_ptr<pcl::Grabber>(new pcl::Kinect2Grabber);// Kinect2Grabber
boost::signals2::connection connection = grabberForKinect->registerCallback(function); // Register Callback Function
grabberForKinect->start(); //Start Grabber
while (!m_viewer->wasStopped()) {
// Update Viewer
c++;
m_viewer->spinOnce(1); //调用交互程序并更新屏幕一次。
boost::mutex::scoped_try_lock lock(mutex);
//cloud_filtered = filterByScope(pointCloud_XYZRGBA, Z_nearby, Z_faraway, X_left, X_right, Y_bottom, Y_top);//截取对应范围图像
if (lock.owns_lock() && pointCloud_XYZRGBA) {
//cloud_filtered = filterByScope(pointCloud_XYZRGBA, Z_nearby, Z_faraway, X_left, X_right, Y_bottom, Y_top);
//5 显示 Point Cloud
if (!m_viewer->updatePointCloud(pointCloud_XYZRGBA->makeShared(), "cloud")) {//pointCloud_XYZRGBA是指针类型,不能用( . )运算符
m_viewer->addPointCloud(pointCloud_XYZRGBA->makeShared(), "cloud");
}
if (c % 10 == 0) {//每隔一段时间保存一次图片
//存储图片。
char name[100];
sprintf(name, "名称.pcd", total++);
pcl::io::savePCDFileASCII(name, *pointCloud_XYZRGBA);//以.pcd的格式保存点云数据到磁盘
}
}
}//while
}
2.头文件kinect2_grabber.h
#pragma once
#pragma once
#pragma once
// Kinect2Grabber is pcl::Grabber to retrieve the point cloud data from Kinect v2 using Kinect for Windows SDK 2.x.
// This source code is licensed under the MIT license. Please see the License in License.txt.
#ifndef KINECT2_GRABBER
#define KINECT2_GRABBER
#define NOMINMAX
#include <Windows.h>
#include <Kinect.h>
#include <pcl/io/boost.h>
#include <pcl/io/grabber.h>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
namespace pcl
{
struct pcl::PointXYZ;
struct pcl::PointXYZI;
struct pcl::PointXYZRGB;
struct pcl::PointXYZRGBA;
template <typename T> class pcl::PointCloud;
template<class Interface>
inline void SafeRelease(Interface *& IRelease)
{
if (IRelease != NULL) {
IRelease->Release();
IRelease = NULL;
}
}
class Kinect2Grabber : public pcl::Grabber
{
public:
Kinect2Grabber();
virtual ~Kinect2Grabber() throw ();
virtual void start();
virtual void stop();
virtual bool isRunning() const;
virtual std::string getName() const;
virtual float getFramesPerSecond() const;
typedef void (signal_Kinect2_PointXYZ)(const boost::shared_ptr<const pcl::PointCloud<pcl::PointXYZ>>&);
typedef void (signal_Kinect2_PointXYZI)(const boost::shared_ptr<const pcl::PointCloud<pcl::PointXYZI>>&);
typedef void (signal_Kinect2_PointXYZRGB)(const boost::shared_ptr<const pcl::PointCloud<pcl::PointXYZRGB>>&);
typedef void (s