39 #ifndef PCL_VISUALIZATION_IMAGE_VISUALIZER_HPP_
40 #define PCL_VISUALIZATION_IMAGE_VISUALIZER_HPP_
45 template <
typename T>
void
47 const std::string &layer_id,
53 data_.reset (
new unsigned char[data_size_]);
56 for (
size_t i = 0; i < cloud.
points.size (); ++i)
58 memcpy (&data_[i * 3], reinterpret_cast<const unsigned char*> (&cloud.
points[i].rgba), sizeof (
unsigned char) * 3);
60 unsigned char aux = data_[i*3];
61 data_[i*3] = data_[i*3+2];
63 for (
int j = 0; j < 3; ++j)
71 template <
typename T>
void
73 const std::string &layer_id,
79 data_.reset (
new unsigned char[data_size_]);
82 for (
size_t i = 0; i < cloud.
points.size (); ++i)
84 memcpy (&data_[i * 3], reinterpret_cast<const unsigned char*> (&cloud.
points[i].rgba), sizeof (
unsigned char) * 3);
86 unsigned char aux = data_[i*3];
87 data_[i*3] = data_[i*3+2];
89 for (
int j = 0; j < 3; ++j)
93 return (addRGBImage (data_.get (), cloud.
width, cloud.
height, layer_id, opacity));
97 template <
typename T>
bool
101 double r,
double g,
double b,
102 const std::string &layer_id,
double opacity)
109 LayerMap::iterator am_it = std::find_if (layer_map_.begin (), layer_map_.end (), LayerComparator (layer_id));
110 if (am_it == layer_map_.end ())
112 PCL_DEBUG (
"[pcl::visualization::ImageViewer::addMask] No layer with ID'=%s' found. Creating new one...\n", layer_id.c_str ());
113 am_it = createLayer (layer_id, image_viewer_->GetRenderWindow ()->GetSize ()[0] - 1, image_viewer_->GetRenderWindow ()->GetSize ()[1] - 1, opacity,
true);
116 am_it->canvas->SetDrawColor (r * 255.0, g * 255.0, b * 255.0, opacity * 255.0);
121 for (
size_t i = 0; i < mask.
points.size (); ++i)
126 am_it->canvas->DrawPoint (
int (p_projected.
x),
127 int (
float (image->
height) - p_projected.
y));
134 template <
typename T>
bool
138 const std::string &layer_id,
double opacity)
145 LayerMap::iterator am_it = std::find_if (layer_map_.begin (), layer_map_.end (), LayerComparator (layer_id));
146 if (am_it == layer_map_.end ())
148 PCL_DEBUG (
"[pcl::visualization::ImageViewer::addMask] No layer with ID'=%s' found. Creating new one...\n", layer_id.c_str ());
149 am_it = createLayer (layer_id, image_viewer_->GetRenderWindow ()->GetSize ()[0] - 1, image_viewer_->GetRenderWindow ()->GetSize ()[1] - 1, opacity,
true);
152 am_it->canvas->SetDrawColor (255.0, 0.0, 0.0, opacity * 255.0);
157 for (
size_t i = 0; i < mask.
points.size (); ++i)
162 am_it->canvas->DrawPoint (
int (p_projected.
x),
163 int (
float (image->
height) - p_projected.
y));
170 template <
typename T>
bool
174 double r,
double g,
double b,
175 const std::string &layer_id,
double opacity)
182 LayerMap::iterator am_it = std::find_if (layer_map_.begin (), layer_map_.end (), LayerComparator (layer_id));
183 if (am_it == layer_map_.end ())
185 PCL_DEBUG (
"[pcl::visualization::ImageViewer::addPlanarPolygon] No layer with ID'=%s' found. Creating new one...\n", layer_id.c_str ());
186 am_it = createLayer (layer_id, image_viewer_->GetRenderWindow ()->GetSize ()[0] - 1, image_viewer_->GetRenderWindow ()->GetSize ()[1] - 1, opacity,
true);
189 am_it->canvas->SetDrawColor (r * 255.0, g * 255.0, b * 255.0, opacity * 255.0);
200 am_it->canvas->DrawSegment (
int (p1.
x), int (
float (image->
height) - p1.
y),
201 int (p2.
x), int (
float (image->
height) - p2.
y));
209 am_it->canvas->DrawSegment (
int (p1.
x), int (
float (image->
height) - p1.
y),
210 int (p2.
x), int (
float (image->
height) - p2.
y));
216 template <
typename T>
bool
220 const std::string &layer_id,
double opacity)
227 LayerMap::iterator am_it = std::find_if (layer_map_.begin (), layer_map_.end (), LayerComparator (layer_id));
228 if (am_it == layer_map_.end ())
230 PCL_DEBUG (
"[pcl::visualization::ImageViewer::addPlanarPolygon] No layer with ID'=%s' found. Creating new one...\n", layer_id.c_str ());
231 am_it = createLayer (layer_id, image_viewer_->GetRenderWindow ()->GetSize ()[0] - 1, image_viewer_->GetRenderWindow ()->GetSize ()[1] - 1, opacity,
true);
234 am_it->canvas->SetDrawColor (255.0, 0.0, 0.0, opacity * 255.0);
245 am_it->canvas->DrawSegment (
int (p1.
x), int (
float (image->
height) - p1.
y),
246 int (p2.
x), int (
float (image->
height) - p2.
y));
254 am_it->canvas->DrawSegment (
int (p1.
x), int (
float (image->
height) - p1.
y),
255 int (p2.
x), int (
float (image->
height) - p2.
y));
260 template <
typename T>
bool
265 double r,
double g,
double b,
266 const std::string &layer_id,
double opacity)
273 LayerMap::iterator am_it = std::find_if (layer_map_.begin (), layer_map_.end (), LayerComparator (layer_id));
274 if (am_it == layer_map_.end ())
276 PCL_DEBUG (
"[pcl::visualization::ImageViewer::addRectangle] No layer with ID'=%s' found. Creating new one...\n", layer_id.c_str ());
277 am_it = createLayer (layer_id, image_viewer_->GetRenderWindow ()->GetSize ()[0] - 1, image_viewer_->GetRenderWindow ()->GetSize ()[1] - 1, opacity,
true);
284 T p1, p2, p3, p4, p5, p6, p7, p8;
285 p1.x = min_pt.x; p1.y = min_pt.y; p1.z = min_pt.z;
286 p2.x = min_pt.x; p2.y = min_pt.y; p2.z = max_pt.z;
287 p3.x = min_pt.x; p3.y = max_pt.y; p3.z = min_pt.z;
288 p4.x = min_pt.x; p4.y = max_pt.y; p4.z = max_pt.z;
289 p5.x = max_pt.x; p5.y = min_pt.y; p5.z = min_pt.z;
290 p6.x = max_pt.x; p6.y = min_pt.y; p6.z = max_pt.z;
291 p7.x = max_pt.x; p7.y = max_pt.y; p7.z = min_pt.z;
292 p8.x = max_pt.x; p8.y = max_pt.y; p8.z = max_pt.z;
294 std::vector<pcl::PointXY> pp_2d (8);
305 min_pt_2d.
x = min_pt_2d.
y = std::numeric_limits<float>::max ();
306 max_pt_2d.
x = max_pt_2d.
y = std::numeric_limits<float>::min ();
308 for (
size_t i = 0; i < pp_2d.size (); ++i)
310 if (pp_2d[i].x < min_pt_2d.
x) min_pt_2d.
x = pp_2d[i].x;
311 if (pp_2d[i].y < min_pt_2d.
y) min_pt_2d.
y = pp_2d[i].y;
312 if (pp_2d[i].x > max_pt_2d.
x) max_pt_2d.
x = pp_2d[i].x;
313 if (pp_2d[i].y > max_pt_2d.
y) max_pt_2d.
y = pp_2d[i].y;
315 min_pt_2d.
y = float (image->
height) - min_pt_2d.
y;
316 max_pt_2d.
y = float (image->
height) - max_pt_2d.
y;
318 am_it->canvas->SetDrawColor (r * 255.0, g * 255.0, b * 255.0, opacity * 255.0);
320 am_it->canvas->DrawSegment (
int (min_pt_2d.
x), int (min_pt_2d.
y), int (min_pt_2d.
x), int (max_pt_2d.
y));
321 am_it->canvas->DrawSegment (
int (min_pt_2d.
x), int (max_pt_2d.
y), int (max_pt_2d.
x), int (max_pt_2d.
y));
322 am_it->canvas->DrawSegment (
int (max_pt_2d.
x), int (max_pt_2d.
y), int (max_pt_2d.
x), int (min_pt_2d.
y));
323 am_it->canvas->DrawSegment (
int (max_pt_2d.
x), int (min_pt_2d.
y), int (min_pt_2d.
x), int (min_pt_2d.
y));
329 template <
typename T>
bool
334 const std::string &layer_id,
double opacity)
341 LayerMap::iterator am_it = std::find_if (layer_map_.begin (), layer_map_.end (), LayerComparator (layer_id));
342 if (am_it == layer_map_.end ())
344 PCL_DEBUG (
"[pcl::visualization::ImageViewer::addRectangle] No layer with ID'=%s' found. Creating new one...\n", layer_id.c_str ());
345 am_it = createLayer (layer_id, image_viewer_->GetRenderWindow ()->GetSize ()[0] - 1, image_viewer_->GetRenderWindow ()->GetSize ()[1] - 1, opacity,
true);
352 T p1, p2, p3, p4, p5, p6, p7, p8;
353 p1.x = min_pt.x; p1.y = min_pt.y; p1.z = min_pt.z;
354 p2.x = min_pt.x; p2.y = min_pt.y; p2.z = max_pt.z;
355 p3.x = min_pt.x; p3.y = max_pt.y; p3.z = min_pt.z;
356 p4.x = min_pt.x; p4.y = max_pt.y; p4.z = max_pt.z;
357 p5.x = max_pt.x; p5.y = min_pt.y; p5.z = min_pt.z;
358 p6.x = max_pt.x; p6.y = min_pt.y; p6.z = max_pt.z;
359 p7.x = max_pt.x; p7.y = max_pt.y; p7.z = min_pt.z;
360 p8.x = max_pt.x; p8.y = max_pt.y; p8.z = max_pt.z;
362 std::vector<pcl::PointXY> pp_2d (8);
373 min_pt_2d.
x = min_pt_2d.
y = std::numeric_limits<float>::max ();
374 max_pt_2d.
x = max_pt_2d.
y = std::numeric_limits<float>::min ();
376 for (
size_t i = 0; i < pp_2d.size (); ++i)
378 if (pp_2d[i].x < min_pt_2d.
x) min_pt_2d.
x = pp_2d[i].x;
379 if (pp_2d[i].y < min_pt_2d.
y) min_pt_2d.
y = pp_2d[i].y;
380 if (pp_2d[i].x > max_pt_2d.
x) max_pt_2d.
x = pp_2d[i].x;
381 if (pp_2d[i].y > max_pt_2d.
y) max_pt_2d.
y = pp_2d[i].y;
383 min_pt_2d.
y = float (image->
height) - min_pt_2d.
y;
384 max_pt_2d.
y = float (image->
height) - max_pt_2d.
y;
386 am_it->canvas->SetDrawColor (0.0, 255.0, 0.0, opacity * 255.0);
387 am_it->canvas->DrawSegment (
int (min_pt_2d.
x), int (min_pt_2d.
y), int (min_pt_2d.
x), int (max_pt_2d.
y));
388 am_it->canvas->DrawSegment (
int (min_pt_2d.
x), int (max_pt_2d.
y), int (max_pt_2d.
x), int (max_pt_2d.
y));
389 am_it->canvas->DrawSegment (
int (max_pt_2d.
x), int (max_pt_2d.
y), int (max_pt_2d.
x), int (min_pt_2d.
y));
390 am_it->canvas->DrawSegment (
int (max_pt_2d.
x), int (min_pt_2d.
y), int (min_pt_2d.
x), int (min_pt_2d.
y));
396 template <
typename T>
bool
400 double r,
double g,
double b,
401 const std::string &layer_id,
double opacity)
408 LayerMap::iterator am_it = std::find_if (layer_map_.begin (), layer_map_.end (), LayerComparator (layer_id));
409 if (am_it == layer_map_.end ())
411 PCL_DEBUG (
"[pcl::visualization::ImageViewer::addRectangle] No layer with ID'=%s' found. Creating new one...\n", layer_id.c_str ());
412 am_it = createLayer (layer_id, image_viewer_->GetRenderWindow ()->GetSize ()[0] - 1, image_viewer_->GetRenderWindow ()->GetSize ()[1] - 1, opacity,
true);
415 am_it->canvas->SetDrawColor (r * 255.0, g * 255.0, b * 255.0, opacity * 255.0);
420 std::vector<pcl::PointXY> pp_2d (mask.
points.size ());
421 for (
size_t i = 0; i < mask.
points.size (); ++i)
425 min_pt_2d.
x = min_pt_2d.
y = std::numeric_limits<float>::max ();
426 max_pt_2d.
x = max_pt_2d.
y = std::numeric_limits<float>::min ();
428 for (
size_t i = 0; i < pp_2d.size (); ++i)
430 if (pp_2d[i].x < min_pt_2d.
x) min_pt_2d.
x = pp_2d[i].x;
431 if (pp_2d[i].y < min_pt_2d.
y) min_pt_2d.
y = pp_2d[i].y;
432 if (pp_2d[i].x > max_pt_2d.
x) max_pt_2d.
x = pp_2d[i].x;
433 if (pp_2d[i].y > max_pt_2d.
y) max_pt_2d.
y = pp_2d[i].y;
435 min_pt_2d.
y = float (image->
height) - min_pt_2d.
y;
436 max_pt_2d.
y = float (image->
height) - max_pt_2d.
y;
438 am_it->canvas->DrawSegment (
int (min_pt_2d.
x), int (min_pt_2d.
y), int (min_pt_2d.
x), int (max_pt_2d.
y));
439 am_it->canvas->DrawSegment (
int (min_pt_2d.
x), int (max_pt_2d.
y), int (max_pt_2d.
x), int (max_pt_2d.
y));
440 am_it->canvas->DrawSegment (
int (max_pt_2d.
x), int (max_pt_2d.
y), int (max_pt_2d.
x), int (min_pt_2d.
y));
441 am_it->canvas->DrawSegment (
int (max_pt_2d.
x), int (min_pt_2d.
y), int (min_pt_2d.
x), int (min_pt_2d.
y));
447 template <
typename T>
bool
451 const std::string &layer_id,
double opacity)
458 LayerMap::iterator am_it = std::find_if (layer_map_.begin (), layer_map_.end (), LayerComparator (layer_id));
459 if (am_it == layer_map_.end ())
461 PCL_DEBUG (
"[pcl::visualization::ImageViewer::addRectangle] No layer with ID'=%s' found. Creating new one...\n", layer_id.c_str ());
462 am_it = createLayer (layer_id, image_viewer_->GetRenderWindow ()->GetSize ()[0] - 1, image_viewer_->GetRenderWindow ()->GetSize ()[1] - 1, opacity,
true);
465 am_it->canvas->SetDrawColor (0.0, 255.0, 0.0, opacity * 255.0);
470 std::vector<pcl::PointXY> pp_2d (mask.
points.size ());
471 for (
size_t i = 0; i < mask.
points.size (); ++i)
475 min_pt_2d.
x = min_pt_2d.
y = std::numeric_limits<float>::max ();
476 max_pt_2d.
x = max_pt_2d.
y = std::numeric_limits<float>::min ();
478 for (
size_t i = 0; i < pp_2d.size (); ++i)
480 if (pp_2d[i].x < min_pt_2d.
x) min_pt_2d.
x = pp_2d[i].x;
481 if (pp_2d[i].y < min_pt_2d.
y) min_pt_2d.
y = pp_2d[i].y;
482 if (pp_2d[i].x > max_pt_2d.
x) max_pt_2d.
x = pp_2d[i].x;
483 if (pp_2d[i].y > max_pt_2d.
y) max_pt_2d.
y = pp_2d[i].y;
485 min_pt_2d.
y = float (image->
height) - min_pt_2d.
y;
486 max_pt_2d.
y = float (image->
height) - max_pt_2d.
y;
488 am_it->canvas->DrawSegment (
int (min_pt_2d.
x), int (min_pt_2d.
y), int (min_pt_2d.
x), int (max_pt_2d.
y));
489 am_it->canvas->DrawSegment (
int (min_pt_2d.
x), int (max_pt_2d.
y), int (max_pt_2d.
x), int (max_pt_2d.
y));
490 am_it->canvas->DrawSegment (
int (max_pt_2d.
x), int (max_pt_2d.
y), int (max_pt_2d.
x), int (min_pt_2d.
y));
491 am_it->canvas->DrawSegment (
int (max_pt_2d.
x), int (min_pt_2d.
y), int (min_pt_2d.
x), int (min_pt_2d.
y));
497 #endif // PCL_VISUALIZATION_IMAGE_VISUALIZER_HPP_