pcl下载
官网上可以下载,不过可能需要翻墙,同样后面上传了再给网址~
vs环境配置
- 项目属性包含目录:
- 项目属性库目录:
- 项目属性链接器输入:
pcl_common_release.lib
pcl_features_release.lib
pcl_filters_release.lib
pcl_io_ply_release.lib
pcl_io_release.lib
pcl_kdtree_release.lib
pcl_keypoints_release.lib
pcl_ml_release.lib
pcl_octree_release.lib
pcl_outofcore_release.lib
pcl_people_release.lib
pcl_recognition_release.lib
vtkalglib-8.1.lib
vtkChartsCore-8.1.lib
vtkCommonColor-8.1.lib
vtkCommonComputationalGeometry-8.1.lib
vtkCommonCore-8.1.lib
vtkCommonDataModel-8.1.lib
vtkCommonExecutionModel-8.1.lib
vtkCommonMath-8.1.lib
vtkCommonMisc-8.1.lib
vtkCommonSystem-8.1.lib
vtkCommonTransforms-8.1.lib
vtkDICOMParser-8.1.lib
vtkDomainsChemistry-8.1.lib
vtkexoIIc-8.1.lib
vtkexpat-8.1.lib
vtkFiltersAMR-8.1.lib
vtkFiltersCore-8.1.lib
vtkFiltersExtraction-8.1.lib
vtkFiltersFlowPaths-8.1.lib
vtkFiltersGeneral-8.1.lib
vtkFiltersGeneric-8.1.lib
vtkFiltersGeometry-8.1.lib
vtkFiltersHybrid-8.1.lib
vtkFiltersHyperTree-8.1.lib
vtkFiltersImaging-8.1.lib
vtkFiltersModeling-8.1.lib
vtkFiltersParallel-8.1.lib
vtkFiltersParallelImaging-8.1.lib
vtkFiltersPoints-8.1.lib
vtkFiltersProgrammable-8.1.lib
vtkFiltersSelection-8.1.lib
vtkFiltersSMP-8.1.lib
vtkFiltersSources-8.1.lib
vtkFiltersStatistics-8.1.lib
vtkFiltersTexture-8.1.lib
vtkFiltersTopology-8.1.lib
vtkFiltersVerdict-8.1.lib
vtkfreetype-8.1.lib
vtkGeovisCore-8.1.lib
vtkgl2ps-8.1.lib
vtkhdf5-8.1.lib
vtkhdf5_hl-8.1.lib
vtkImagingColor-8.1.lib
vtkImagingCore-8.1.lib
vtkImagingFourier-8.1.lib
vtkImagingGeneral-8.1.lib
vtkImagingHybrid-8.1.lib
vtkImagingMath-8.1.lib
vtkImagingMorphological-8.1.lib
vtkImagingSources-8.1.lib
vtkImagingStatistics-8.1.lib
vtkImagingStencil-8.1.lib
vtkInfovisCore-8.1.lib
vtkInfovisLayout-8.1.lib
vtkInteractionImage-8.1.lib
vtkInteractionStyle-8.1.lib
vtkInteractionWidgets-8.1.lib
vtkIOAMR-8.1.lib
vtkIOCore-8.1.lib
vtkIOEnSight-8.1.lib
vtkIOExodus-8.1.lib
vtkIOExport-8.1.lib
vtkIOExportOpenGL-8.1.lib
vtkIOGeometry-8.1.lib
vtkIOImage-8.1.lib
vtkIOImport-8.1.lib
vtkIOInfovis-8.1.lib
vtkIOLegacy-8.1.lib
vtkIOLSDyna-8.1.lib
vtkIOMINC-8.1.lib
vtkIOMovie-8.1.lib
vtkIONetCDF-8.1.lib
vtkIOParallel-8.1.lib
vtkIOParallelXML-8.1.lib
vtkIOPLY-8.1.lib
vtkIOSQL-8.1.lib
vtkIOTecplotTable-8.1.lib
vtkIOVideo-8.1.lib
vtkIOXML-8.1.lib
vtkIOXMLParser-8.1.lib
vtkjpeg-8.1.lib
vtkjsoncpp-8.1.lib
vtklibharu-8.1.lib
vtklibxml2-8.1.lib
vtklz4-8.1.lib
vtkmetaio-8.1.lib
vtkNetCDF-8.1.lib
vtknetcdfcpp-8.1.lib
vtkoggtheora-8.1.lib
vtkParallelCore-8.1.lib
vtkpng-8.1.lib
vtkproj4-8.1.lib
vtkRenderingAnnotation-8.1.lib
vtkRenderingContext2D-8.1.lib
vtkRenderingContextOpenGL-8.1.lib
vtkRenderingCore-8.1.lib
vtkRenderingFreeType-8.1.lib
vtkRenderingGL2PS-8.1.lib
vtkRenderingImage-8.1.lib
vtkRenderingLabel-8.1.lib
vtkRenderingLIC-8.1.lib
vtkRenderingLOD-8.1.lib
vtkRenderingOpenGL-8.1.lib
vtkRenderingVolume-8.1.lib
vtkRenderingVolumeOpenGL-8.1.lib
vtksqlite-8.1.lib
vtksys-8.1.lib
vtktiff-8.1.lib
vtkverdict-8.1.lib
vtkViewsContext2D-8.1.lib
vtkViewsCore-8.1.lib
vtkViewsInfovis-8.1.lib
vtkzlib-8.1.lib
pcl_registration_release.lib
pcl_sample_consensus_release.lib
pcl_search_release.lib
pcl_segmentation_release.lib
pcl_stereo_release.lib
pcl_surface_release.lib
pcl_tracking_release.lib
pcl_visualization_release.lib
(有点多哈,基本上常用的都完整地列在这里了)
代码
原理不多讲了,直接上一条龙服务的代码~
深度图转点云
#define to_point
#ifdef to_point
//#include <QtCore/QCoreApplication>
#include <iostream>
#include <string>
using namespace std;
// OpenCV 库
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
// PCL 库
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
// 定义点云类型
typedef pcl::PointXYZRGBA PointT;
typedef pcl::PointCloud<PointT> PointCloud;
/*
color intrinsics: 640 480 308.783 237.412 620.252 620.252
coeffs: 0 0 0 0 0
distortion model: None
depth intrinsics: 640 480 311.704 245.82 474.055 474.055
coeffs: 0.125268 0.107347 0.00599028 0.00498074 0.0363283
distortion model: Inverse Brown Conrady
*/
// 相机内参
const double camera_factor = 1000;
const double camera_cx = 311.704;
const double camera_cy = 245.82;
const double camera_fx = 474.055;
const double camera_fy = 474.055;
int main()
{
//QCoreApplication a(argc, argv);
// 读取./data/rgb.png和./data/depth.png,并转化为点云
// 图像矩阵
cv::Mat rgb, depth;
// 使用cv::imread()来读取图像
rgb = cv::imread("color86.jpg");
// rgb 图像是8UC3的彩色图像
// depth 是16UC1的单通道图像,注意flags设置-1,表示读取原始数据不做任何修改
depth = cv::imread("image1.jpg", -1);
int channels = depth.channels();
printf("w,h:%d,%d,%d\n", depth.rows, depth.cols,channels);//480,640
system("pause");
cv::Mat reverse(depth.rows, depth.cols, CV_8UC1);
uchar* Data_;
for (int i = 0; i < depth.rows; i++)
{
Data_ = reverse.ptr<uchar>(i);
for (int j = 0; j < depth.cols; j++)
{
Data_[j] = 0;
}
}
// 点云变量
// 使用智能指针,创建一个空点云。这种指针用完会自动释放。
PointCloud::Ptr cloud(new PointCloud);
// 遍历深度图
int qaq = 0;
for (int m = 0; m < depth.rows; m++)
for (int n = 0; n < depth.cols; n++)
{
// 获取深度图中(m,n)处的值
uchar d = depth.ptr<uchar>(m)[n];
//printf("d:%d\n", d);
// d 可能没有值,若如此,跳过此点
if (d == 0)
continue;
// d 存在值,则向点云增加一个点
PointT p;
// 计算这个点的空间坐标/ camera_factor
p.z = double(d) ;
p.x = (n - camera_cx) * p.z / camera_fx;
p.y = (m - camera_cy) * p.z / camera_fy;
qaq++;
// 从rgb图像中获取它的颜色
// rgb是三通道的BGR格式图,所以按下面的顺序获取颜色
/*p.b = rgb.ptr<uchar>(m)[n * 3];
p.g = rgb.ptr<uchar>(m)[n * 3 + 1];
p.r = rgb.ptr<uchar>(m)[n * 3 + 2];*/
// 把p加入到点云中
cloud->points.push_back(p);
//system("pause");
}
// 设置并保存点云
cloud->height = 1;
cloud->width = cloud->points.size();
cout << "point cloud size = " << cloud->points.size() << endl;
cloud->is_dense = false;
pcl::io::savePCDFile("151.pcd", *cloud);
system("pause");
//转化回2D
int k = cloud->points.size();
uchar d_=0;
float m_=0.0, n_=0.0;
int mm=0, nn=0;
//int array_[640*480]= { 0 };
for (int i = 0; i < k; i++)
{
d_ = uchar(cloud->points[i].z);
//array_[nn][mm] = d_;*camera_factor
//printf("cloud->points[0].z:%f\n", cloud->points[i].x);
//printf("m_:%f\n", m_);
if (cloud->points[i].z != 0)
{
m_ = cloud->points[i].y*camera_fy/ cloud->points[i].z + camera_cy;
n_ = cloud->points[i].x*camera_fx/ cloud->points[i].z + camera_cx;
mm = int(m_);
nn = int(n_);
if (d_ < 0)
d_ = 0;
if (d_ > 255)
d_ = 255;
//if (mm >= 0 && mm < 480 && nn >= 0 && nn < 640 )
{
reverse.at<uchar>(mm,nn) = d_;
/*cvWaitKey(5);
imshow("reverse", reverse);*/
printf("d_:%d\n", d_);
}
}
}
imshow("reverse", reverse);
cvWaitKey(200);
//uchar* Data_;
//for (int i = 0; i < depth.rows; i++)
//{
// Data_ = reverse.ptr<uchar>(i);
// for (int j = 0; j < depth.cols; j++)
// {
// Data_[j] = array_[i][j];
// }
//}
//imshow("reverse", reverse);
system("pause");
// 清除数据并退出
cloud->points.clear();
cout << "Point cloud saved." << endl;
return 0;
}
显示点云
#define pcl_show
#ifdef pcl_show
#include <iostream>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
using namespace std;
using namespace pcl;
using namespace io;
int main()
{
PointCloud<PointXYZ>::Ptr cloud(new PointCloud<PointXYZ>);
if (io::loadPCDFile("15.pcd", *cloud) == -1)
{
cerr << "can't read file rabbit.pcd" << endl;
return -1;
}
boost::shared_ptr<visualization::PCLVisualizer> viewer(new visualization::PCLVisualizer("3D viewer"));
viewer->setBackgroundColor(0, 0, 0);
vewer->addPointCloud<PointXYZ>(cloud, "sample cloud");
viewer->setPointCloudRenderingProperties(visualization::PCL_VISUALIZER_POINT_SIZE, 2, "sample cloud");
viewer->addCoordinateSystem(1.0);
viewer->initCameraParameters();
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(1000));
}
return 0;
}
#endif
去平面处理
主要是想利用点云的三维成像,将图片中的平面桌子给滤掉,去平面处理,再将处理完的点云转化回灰度图。
//#define llj_
#ifdef llj_
//https://blog.csdn.net/qq_18941713/article/details/84647887//原理
#include <iostream>
#include <string>
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui/highgui.hpp"
#include<opencv2/imgproc.hpp>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl\visualization\cloud_viewer.h>
#include <pcl/sample_consensus/method_types.h>
#include <pcl/sample_consensus/model_types.h>
#include <pcl/segmentation/sac_segmentation.h>
#include <pcl/filters/extract_indices.h>
using namespace std;
using namespace cv;
// 定义点云类型
typedef pcl::PointXYZ PointT;
typedef pcl::PointCloud<PointT> PointCloud;
// 相机内参
const double camera_factor = 1000;
const double camera_cx = 344.1270;
const double camera_cy = 247.7587;
const double camera_fx = 474.055;
const double camera_fy = 474.055;
int main()
{
Mat depth; // 图像矩阵
// depth 是16UC1的单通道图像,注意flags设置-1,表示读取原始数据不做任何修改
depth = cv::imread("652.jpg", 0);
// 点云变量
// 使用智能指针,创建一个空点云。这种指针用完会自动释放。
pcl::PCDReader reader;
PointCloud::Ptr cloud(new PointCloud);
reader.read("151.pcd", *cloud);
pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
pcl::PointIndices::Ptr inliers(new pcl::PointIndices);
// Create the segmentation object
pcl::SACSegmentation<pcl::PointXYZ> seg;
// Optional
seg.setOptimizeCoefficients(true);
// Mandatory
seg.setModelType(pcl::SACMODEL_PLANE);
seg.setMethodType(pcl::SAC_RANSAC);
seg.setDistanceThreshold(5);
seg.setInputCloud(cloud);
seg.segment(*inliers, *coefficients);
//取出平面里的点
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);
pcl::ExtractIndices<pcl::PointXYZ> extract;
extract.setInputCloud(cloud);
extract.setIndices(inliers);
//extract.filter(*cloud_filtered);
// 提取除地面外的物体
extract.setNegative(true);
extract.filter(*cloud_filtered);
seg.setInputCloud(cloud_filtered);
seg.segment(*inliers, *coefficients);
//显示点云
int v1(0);
int v2(1);
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1);
viewer->createViewPort(0.5, 0.0, 1.0, 1.0, v2);
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 0, 255, 0); // green
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color_(cloud_filtered, 255, 0, 0); // green
viewer->addPointCloud<pcl::PointXYZ>(cloud_filtered, single_color_, "sample cloud_filtered", v1);
viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "sample cloud", v2);
viewer->addCoordinateSystem(1.0);
viewer->spin();
//点云转换回深度图
Mat result(depth.size(), CV_8UC1);
uchar* Data_;
for (int i = 0; i < depth.rows; i++)
{
Data_ = result.ptr<uchar>(i);
for (int j = 0; j < depth.cols; j++)
{
Data_[j] = 0;
}
}
cout << depth.size() << endl;
cout << result.size() << endl;
int k = cloud_filtered->points.size();
cout << k;
int i = 0;
for (; i < k; i++)
{
result.at<uchar>((cloud_filtered->points[i].y) / 100, (cloud_filtered->points[i].x) / 50) = (cloud_filtered->points[i].z);
imshow("11", result);
waitKey(5);
}
Mat element = getStructuringElement(MORPH_RECT, Size(10, 10));
dilate(result, result, element);
//显示
imshow("11", result);
waitKey();
// 清除数据并退出
cloud->points.clear();
cout << "Point cloud saved." << endl;
return 0;
}
#endif