depth_image_to_pcl.cpp
Go to the documentation of this file.
1 
8 
9 namespace pses_kinect_utilities
10 {
11 
13 {
14  cl_init = false;
15  kernel_init = false;
16  buffer_init = false;
17 }
18 
20  : md(md), tf(tf)
21 {
22  cl_init = false;
23  kernel_init = false;
24  buffer_init = false;
25  cloud = PointCloud(md.width, md.height);
26 }
27 
28 void DepthImageToPCL::setMetaData(const MetaData& md) { this->md = md; }
29 void DepthImageToPCL::setTFData(const Transform& tf) { this->tf = tf; }
30 
32 
33 void DepthImageToPCL::init_CL(const std::string& kernel_file)
34 {
40  buffers = std::vector<BufferPtr>();
41  cl_init = true;
42 }
43 
44 void DepthImageToPCL::program_kernel(const std::string& kernel_function)
45 {
46  if (!cl_init)
47  throw std::runtime_error("Cl components have not yet been initilized!");
48  kernel = create_ocl_kernel(program, kernel_function);
49  kernel_init = true;
50 }
51 
53 {
54  if (!cl_init || !kernel_init)
55  throw std::runtime_error(
56  "Cl components or program kernel have not yet been initilized!");
57  buffers.push_back(
58  create_ocl_buffer<unsigned short>(context, md.n_pixels, R_ACCESS));
59  buffers.push_back(
60  create_ocl_buffer<float>(context, md.n_pixels * 4, RW_ACCESS));
61  kernel->setArg(0, *buffers[0]);
62  kernel->setArg(1, *buffers[1]);
63  kernel->setArg(2, md);
64  kernel->setArg(3, tf);
65  buffer_init = true;
66 }
67 
68 PointCloudPtr DepthImageToPCL::convert_to_pcl(const sensor_msgs::Image::ConstPtr img_in)
69 {
70  if (!cl_init || !kernel_init || !buffer_init)
71  throw std::runtime_error("Cl components, program kernel or buffers have "
72  "not yet been initilized!");
73  fill_buffer(img_in->data.data());
74  queue->enqueueNDRangeKernel(*kernel, cl::NullRange,
75  cl::NDRange(md.n_pixels / 10), cl::NullRange);
76  queue->finish();
77  read_buffer();
78  return cloud.makeShared();
79 }
80 
81 void DepthImageToPCL::fill_buffer(const unsigned char* image)
82 {
83  write_ocl_buffer(queue, buffers[0], md.n_pixels * 2, image);
84 }
85 
87 {
88  read_ocl_buffer(queue, buffers[1], md.n_pixels, cloud.points.data());
89 }
90 } // namespace pses_kinect_utilities
void read_ocl_buffer(QueuePtr queue, BufferPtr buffer, std::vector< T > &array)
Contains the camera calibration.
void fill_buffer(const unsigned char *image)
ContextPtr get_ocl_context(DevicePtr device)
QueuePtr create_ocl_command_queue(ContextPtr context, DevicePtr device)
static const int R_ACCESS
StringPtr load_kernel_definition(const std::string &path)
void program_kernel(const std::string &kernel_function)
void write_ocl_buffer(QueuePtr queue, BufferPtr buffer, std::vector< T > &array)
PointCloud::Ptr PointCloudPtr
Shortcut for a pointer of a XYZ Point cloud of the pcl library.
PointCloudPtr convert_to_pcl(const sensor_msgs::Image::ConstPtr rawImgPtr)
void init_CL(const std::string &kernel_file)
Contains some parameters and metada data of the camera.
KernelPtr create_ocl_kernel(ProgramPtr program, const std::string &program_name)
static const int RW_ACCESS
This namespace is used by the nodelets inside our package pses_kinect_utilities.
pcl::PointCloud< pcl::PointXYZ > PointCloud
Shortcut for a XYZ Point cloud of the pcl library.
ProgramPtr build_ocl_program(DevicePtr device, ContextPtr context, StringPtr kernel)


pses_kinect_utilities
Author(s): Nicolas Acero
autogenerated on Sun Nov 26 2017 19:23:52