blob: 84ddf7b5088af17113d69be408d23199815296a3 [file] [log] [blame]
#include <pcl/io/openni_grabber.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/octree/octree.h>
#include "config.h"
#include "tools.h"
float rgb(int r, int g, int b) {
uint32_t rgb = ((uint32_t) r << 16 | (uint32_t) g << 8 | (uint32_t) b);
return *reinterpret_cast<float*> (&rgb);
}
float getDistance(pcl::PointXYZ p1, pcl::PointXYZ p2) {
return sqrt(pow((p2.x - p1.x), 2) + pow((p2.y - p1.y), 2) + pow((p2.z - p1.z), 2));
}
void copyCloud(const pcl::PointCloud<pcl::PointXYZ>::ConstPtr &cloud1, pcl::PointCloud<pcl::PointXYZ>::Ptr &cloud2) {
cloud2->points.resize(cloud1->size());
for (size_t i = 0; i < cloud1->size(); i++) {
cloud2->points[i].x = cloud1->points[i].x;
cloud2->points[i].y = cloud1->points[i].y;
cloud2->points[i].z = cloud1->points[i].z;
}
return;
}
void copyCloud(const pcl::PointCloud<pcl::PointXYZ>::ConstPtr &cloud1, pcl::PointCloud<pcl::PointXYZ>::Ptr &cloud2, float distance) {
cloud2->points.resize(0);
for (size_t i = 0; i < cloud1->size(); i++) {
if (getDistance(pcl::PointXYZ(0, 0, 0), cloud1->points[i]) < distance) {
cloud2->points.push_back(cloud1->points[i]);
}
}
return;
}
void copyCloud(pcl::PointCloud<pcl::PointXYZ>::Ptr &cloud1, pcl::PointCloud<pcl::PointXYZ>::Ptr &cloud2) {
cloud2->points.resize(cloud1->size());
for (size_t i = 0; i < cloud1->size(); i++) {
cloud2->points[i].x = cloud1->points[i].x;
cloud2->points[i].y = cloud1->points[i].y;
cloud2->points[i].z = cloud1->points[i].z;
}
return;
}
void copyCloud(pcl::PointCloud<pcl::PointXYZ>::Ptr &cloud1, pcl::PointCloud<pcl::PointXYZ>::Ptr &cloud2, float distance) {
cloud2->points.resize(0);
for (size_t i = 0; i < cloud1->size(); i++) {
if (getDistance(pcl::PointXYZ(0, 0, 0), cloud1->points[i]) < distance) {
cloud2->points.push_back(cloud1->points[i]);
}
}
return;
}
void copyCloud(pcl::PointCloud<pcl::PointXYZ>::Ptr &cloud1, pcl::PointCloud<pcl::PointXYZRGB>::Ptr &cloud2, float rgb) {
cloud2->points.resize(cloud1->size());
for (size_t i = 0; i < cloud1->size(); i++) {
cloud2->points[i].x = cloud1->points[i].x;
cloud2->points[i].y = cloud1->points[i].y;
cloud2->points[i].z = cloud1->points[i].z;
cloud2->points[i].rgb = rgb;
}
return;
}
void drawLine(pcl::PointCloud<pcl::PointXYZRGB>::Ptr &cloud, pcl::PointXYZ p1, pcl::PointXYZ p2) {
float dx = p2.x - p1.x, dy = p2.y - p1.y, dz = p2.z - p1.z;
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_tmp(new pcl::PointCloud<pcl::PointXYZ>);
cloud_tmp->points.resize(0);
if (p2.x > p1.x) {
for (float x = p1.x; x < p2.x; x += LINEPOINTSTEP) {
cloud_tmp->push_back(pcl::PointXYZ(x, (p1.y + (x - p1.x) * dy / dx), (p1.z + (x - p1.x) * dz / dx)));
}
} else {
for (float x = p1.x; x > p2.x; x -= LINEPOINTSTEP) {
cloud_tmp->push_back(pcl::PointXYZ(x, (p1.y + (x - p1.x) * dy / dx), (p1.z + (x - p1.x) * dz / dx)));
}
}
cloud->points.resize(cloud_tmp->size());
for (size_t i = 0; i < cloud_tmp->size(); i++) {
cloud->points[i].x = cloud_tmp->points[i].x;
cloud->points[i].y = cloud_tmp->points[i].y;
cloud->points[i].z = cloud_tmp->points[i].z;
cloud->points[i].r = cloud->points[i].g = cloud->points[i].b = 0xff;
}
return;
}
void diffCloud(pcl::PointCloud<pcl::PointXYZ>::Ptr &cloud1, pcl::PointCloud<pcl::PointXYZ>::Ptr &cloud2,
pcl::PointCloud<pcl::PointXYZ>::Ptr &diff) {
boost::shared_ptr<std::vector<int> > newPointIdxVector(new std::vector<int>);
pcl::octree::OctreePointCloudChangeDetector<pcl::PointXYZ> octree(0.007f);
octree.setInputCloud(cloud1);
octree.addPointsFromInputCloud();
octree.switchBuffers();
octree.setInputCloud(cloud2);
octree.addPointsFromInputCloud();
octree.getPointIndicesFromNewVoxels(*newPointIdxVector, 1);
diff.reset(new pcl::PointCloud<pcl::PointXYZ>);
diff->points.reserve(newPointIdxVector->size());
for (std::vector<int>::iterator it = newPointIdxVector->begin(); it != newPointIdxVector->end(); it++) {
diff->points.push_back(cloud2->points[*it]);
}
return;
}