RealSense SR300 坑6米 生成点云

pcl下载

官网上可以下载,不过可能需要翻墙,同样后面上传了再给网址~

vs环境配置

  1. 项目属性包含目录:
    pcl
  2. 项目属性库目录:
    pcl
  3. 项目属性链接器输入:
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

去平面处理

pcl
主要是想利用点云的三维成像,将图片中的平面桌子给滤掉,去平面处理,再将处理完的点云转化回灰度图。

//#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
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值