Go to the documentation of this file.00001 #include "pcl_to_image.h"
00002
00003 using namespace Eigen;
00004
00005
00006 PCLtoImage::PCLtoImage() : it_(nh_) {
00007
00008
00009
00010
00011
00012
00013 pcl2_sub_ = this->nh_.subscribe<sensor_msgs::PointCloud2>("input", 1, &PCLtoImage::pcl2_sub_callback, this);
00014
00015
00016 image_pub_ = it_.advertise("output_image", 1);
00017
00018 ROS_INFO("Starting PCL to Image");
00019
00020 }
00021
00022
00023
00024 void PCLtoImage::pcl2_sub_callback(const sensor_msgs::PointCloud2::ConstPtr& pcl2_msg_) {
00025
00026
00027
00028
00029
00030
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
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