pcl_to_image.cpp
Go to the documentation of this file.
00001 #include "pcl_to_image.h"
00002 
00003 using namespace Eigen;
00004 
00005 // [Constructor]
00006 PCLtoImage::PCLtoImage() : it_(nh_) {
00007 
00008   //  cv::namedWindow(WINDOW);
00009 
00010   //string for port names
00011 
00012   // [init subscribers]
00013   pcl2_sub_ = this->nh_.subscribe<sensor_msgs::PointCloud2>("input", 1, &PCLtoImage::pcl2_sub_callback, this);
00014 
00015   // [init publishers]
00016   image_pub_ = it_.advertise("output_image", 1);
00017 
00018   ROS_INFO("Starting PCL to Image");
00019 
00020 }
00021 
00022 
00023 // [subscriber callbacks]
00024 void PCLtoImage::pcl2_sub_callback(const sensor_msgs::PointCloud2::ConstPtr& pcl2_msg_) { 
00025 
00026   // Create the filtering object: downsample the dataset using a leaf size of 1cm
00027 //  pcl::VoxelGrid<sensor_msgs::PointCloud2> sor;
00028 //  sor.setInputCloud (*pcl2_msg_);
00029 //  sor.setLeafSize (0.01f, 0.01f, 0.01f);
00030 //  sor.filter(*pcl2_msg_);
00031 
00032   cv::Mat rgb_image;
00033   pcl::PointCloud<pcl::PointXYZRGB> pcl_xyzrgb_aux_rgb;
00034   pcl::PointCloud<pcl::PointXYZRGB> pcl_xyzrgb_aux_nan;
00035 
00036   pcl::fromROSMsg(*pcl2_msg_, pcl_xyzrgb_);
00037 
00038   //rgb_image.create(pcl_xyzrgb_aux.height, pcl_xyzrgb_aux.width, CV_8UC3); 
00039 
00040   cv_image.header.stamp = ros::Time::now();
00041   cv_image.header.frame_id = "camera";
00042   cv_image.encoding = "bgr8";
00043 
00044   rgb_image = cv::Mat::zeros(rgb_image.size(), CV_8UC3);
00045 
00046   image_from_sparse_pcl2(pcl_xyzrgb_,rgb_image);
00047 
00048   cv_image.image = rgb_image;
00049   
00050   image_pub_.publish(cv_image.toImageMsg());
00051 }
00052 
00053 void PCLtoImage::image_from_sparse_pcl2(pcl::PointCloud<pcl::PointXYZRGB> cloud, cv::Mat& rgb_image){
00054 
00055   pcl::PointCloud<pcl::PointXYZRGB>::iterator pt_iter_xyzrgb = cloud.begin();
00056 
00057   rgb_image.create(cloud.height, cloud.width, CV_8UC3); 
00058 
00059   if(cloud.height != rgb_image.rows || cloud.width != rgb_image.cols){
00060     ROS_ERROR("Size mismatch between point cloud and rgb_image");
00061     ROS_INFO("xyzrgb size %d %d data size %d xyz %d %d data size %d rgb_image %d %d",pcl_xyzrgb_.height, pcl_xyzrgb_.width, pcl_xyzrgb_.size(),cloud.height, cloud.width, cloud.size(), rgb_image.rows, rgb_image.cols);
00062   } else {
00063     for (int rr = 0; rr < cloud.height; ++rr) {
00064       for (int cc = 0; cc < cloud.width; ++cc, ++pt_iter_xyzrgb) {
00065         pcl::PointXYZRGB &pt_xyzrgb = *pt_iter_xyzrgb;
00066         RGBValue color;
00067         color.float_value = pt_xyzrgb.rgb;
00068         if(isnan(pt_iter_xyzrgb->x) && isnan(pt_iter_xyzrgb->y) && isnan(pt_iter_xyzrgb->z)){
00069             rgb_image.at<cv::Vec3b>(rr,cc)[0] = 0;
00070             rgb_image.at<cv::Vec3b>(rr,cc)[1] = 0;
00071             rgb_image.at<cv::Vec3b>(rr,cc)[2] = 0; 
00072         }else{
00073             rgb_image.at<cv::Vec3b>(rr,cc)[0] = color.Blue;
00074             rgb_image.at<cv::Vec3b>(rr,cc)[1] = color.Green;
00075             rgb_image.at<cv::Vec3b>(rr,cc)[2] = color.Red;
00076         }
00077       }
00078     }
00079   }
00080 }
00081 
00082 int main(int argc, char** argv)
00083 {
00084   ros::init(argc, argv, "planar_removal");
00085   PCLtoImage planar_removal;
00086   ros::spin();
00087   return 0;
00088 }
00089 


iri_pcl_filters
Author(s): Sergi Foix
autogenerated on Fri Dec 6 2013 20:44:42