Visual Servoing Platform  version 3.5.1 under development (2023-06-04)
vpDisplay_rgba.cpp
1 /****************************************************************************
2  *
3  * ViSP, open source Visual Servoing Platform software.
4  * Copyright (C) 2005 - 2022 by Inria. All rights reserved.
5  *
6  * This software is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  * See the file LICENSE.txt at the root directory of this source
11  * distribution for additional information about the GNU GPL.
12  *
13  * For using ViSP with software that can not be combined with the GNU
14  * GPL, please contact Inria about acquiring a ViSP Professional
15  * Edition License.
16  *
17  * See http://visp.inria.fr for more information.
18  *
19  * This software was developed at:
20  * Inria Rennes - Bretagne Atlantique
21  * Campus Universitaire de Beaulieu
22  * 35042 Rennes Cedex
23  * France
24  *
25  * If you have questions regarding the use of this file, please contact
26  * Inria at visp@inria.fr
27  *
28  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
29  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
30  *
31  * Description:
32  * Display implementation.
33  *
34  *****************************************************************************/
35 
36 #include <visp3/core/vpDisplay.h>
37 
38 #include "vpDisplay_impl.h"
39 
40 //************************************************************************
41 // Modifications done in this file should be reported in all vpDisplay_*.cpp
42 // files that implement other types (unsigned char, vpRGB, vpRGBa)
43 //************************************************************************
44 
48 void vpDisplay::close(vpImage<vpRGBa> &I) { vp_display_close(I); }
49 
58 void vpDisplay::displayArrow(const vpImage<vpRGBa> &I, const vpImagePoint &ip1, const vpImagePoint &ip2,
59  const vpColor &color, unsigned int w, unsigned int h, unsigned int thickness)
60 {
61  vp_display_display_arrow(I, ip1, ip2, color, w, h, thickness);
62 }
63 
74 void vpDisplay::displayArrow(const vpImage<vpRGBa> &I, int i1, int j1, int i2, int j2, const vpColor &color,
75  unsigned int w, unsigned int h, unsigned int thickness)
76 {
77  vp_display_display_arrow(I, i1, j1, i2, j2, color, w, h, thickness);
78 }
79 
94  double size, const vpColor &color, unsigned int thickness)
95 {
96  vp_display_display_camera(I, cMo, cam, size, color, thickness);
97 }
98 
112 void vpDisplay::displayCharString(const vpImage<vpRGBa> &I, const vpImagePoint &ip, const char *string,
113  const vpColor &color)
114 {
115  vp_display_display_char_string(I, ip, string, color);
116 }
117 
131 void vpDisplay::displayCharString(const vpImage<vpRGBa> &I, int i, int j, const char *string, const vpColor &color)
132 {
133  vp_display_display_char_string(I, i, j, string, color);
134 }
135 
148 void vpDisplay::displayCircle(const vpImage<vpRGBa> &I, const vpImagePoint &center, unsigned int radius,
149  const vpColor &color, bool fill, unsigned int thickness)
150 {
151  vp_display_display_circle(I, center, radius, color, fill, thickness);
152 }
153 
166 void vpDisplay::displayCircle(const vpImage<vpRGBa> &I, int i, int j, unsigned int radius, const vpColor &color,
167  bool fill, unsigned int thickness)
168 {
169  vp_display_display_circle(I, i, j, radius, color, fill, thickness);
170 }
171 
180 void vpDisplay::displayCross(const vpImage<vpRGBa> &I, const vpImagePoint &ip, unsigned int size, const vpColor &color,
181  unsigned int thickness)
182 {
183  vp_display_display_cross(I, ip, size, color, thickness);
184 }
185 
194 void vpDisplay::displayCross(const vpImage<vpRGBa> &I, int i, int j, unsigned int size, const vpColor &color,
195  unsigned int thickness)
196 {
197  vp_display_display_cross(I, i, j, size, color, thickness);
198 }
199 
208  const vpColor &color, unsigned int thickness)
209 {
210  vp_display_display_dot_line(I, ip1, ip2, color, thickness);
211 }
212 
221 void vpDisplay::displayDotLine(const vpImage<vpRGBa> &I, int i1, int j1, int i2, int j2, const vpColor &color,
222  unsigned int thickness)
223 {
224  vp_display_display_dot_line(I, i1, j1, i2, j2, color, thickness);
225 }
226 
236 void vpDisplay::displayDotLine(const vpImage<vpRGBa> &I, const std::vector<vpImagePoint> &ips, bool closeTheShape,
237  const vpColor &color, unsigned int thickness)
238 {
239  if (ips.size() <= 1)
240  return;
241 
242  for (size_t i = 0; i < ips.size() - 1; i++)
243  vp_display_display_dot_line(I, ips[i], ips[i + 1], color, thickness);
244 
245  if (closeTheShape)
246  vp_display_display_dot_line(I, ips.front(), ips.back(), color, thickness);
247 }
248 
258 void vpDisplay::displayDotLine(const vpImage<vpRGBa> &I, const std::list<vpImagePoint> &ips, bool closeTheShape,
259  const vpColor &color, unsigned int thickness)
260 {
261  if (ips.size() <= 1)
262  return;
263 
264  std::list<vpImagePoint>::const_iterator it = ips.begin();
265 
266  vpImagePoint ip_prev = *(it++);
267  for (; it != ips.end(); ++it) {
268  if (vpImagePoint::distance(ip_prev, *it) > 1) {
269  vp_display_display_dot_line(I, ip_prev, *it, color, thickness);
270  ip_prev = *it;
271  }
272  }
273 
274  if (closeTheShape) {
275  vp_display_display_dot_line(I, ips.front(), ips.back(), color, thickness);
276  }
277 }
278 
315 void vpDisplay::displayEllipse(const vpImage<vpRGBa> &I, const vpImagePoint &center, const double &coef1,
316  const double &coef2, const double &coef3, bool use_normalized_centered_moments,
317  const vpColor &color, unsigned int thickness, bool display_center, bool display_arc)
318 {
319  vpDisplay::displayEllipse(I, center, coef1, coef2, coef3, 0., 2 * M_PI, use_normalized_centered_moments, color,
320  thickness, display_center, display_arc);
321 }
322 
362 void vpDisplay::displayEllipse(const vpImage<vpRGBa> &I, const vpImagePoint &center, const double &coef1,
363  const double &coef2, const double &coef3, const double &smallalpha,
364  const double &highalpha, bool use_normalized_centered_moments, const vpColor &color,
365  unsigned int thickness, bool display_center, bool display_arc)
366 {
367  vp_display_display_ellipse(I, center, coef1, coef2, coef3, smallalpha, highalpha, use_normalized_centered_moments,
368  color, thickness, display_center, display_arc);
369 }
370 
389  double size, const vpColor &color, unsigned int thickness, const vpImagePoint &offset,
390  const std::string& frameName, const vpColor& textColor, const vpImagePoint& textOffset)
391 {
392  vp_display_display_frame(I, cMo, cam, size, color, thickness, offset, frameName, textColor, textOffset);
393 }
394 
404 void vpDisplay::displayLine(const vpImage<vpRGBa> &I, const vpImagePoint &ip1, const vpImagePoint &ip2,
405  const vpColor &color, unsigned int thickness, bool segment)
406 {
407  displayLine(I, static_cast<int>(ip1.get_i()), static_cast<int>(ip1.get_j()), static_cast<int>(ip2.get_i()),
408  static_cast<int>(ip2.get_j()), color, thickness, segment);
409 }
410 
421 void vpDisplay::displayLine(const vpImage<vpRGBa> &I, int i1, int j1, int i2, int j2, const vpColor &color,
422  unsigned int thickness, bool segment)
423 {
424  if (segment) {
425  vp_display_display_line(I, i1, j1, i2, j2, color, thickness);
426  } else {
427  // line equation in image: i = a * j + b
428  double delta_j = static_cast<double>(j2) - static_cast<double>(j1);
429  double delta_i = static_cast<double>(i2) - static_cast<double>(i1);
430  // Test if horizontal line
431  if (std::fabs(delta_i) <= std::numeric_limits<double>::epsilon()) {
432  vp_display_display_line(I, i1, 0, i1, (I.getWidth() - 1), color, thickness);
433  }
434  // Test if vertical line
435  else if (std::fabs(delta_j) <= std::numeric_limits<double>::epsilon()) {
436  vp_display_display_line(I, 0, j1, (I.getHeight() - 1), j1, color, thickness);
437  } else {
438  double a = delta_i / delta_j;
439  double b = static_cast<double>(i1) - a * static_cast<double>(j1);
440  std::vector<vpImagePoint> vip; // Image points that intersect image borders
441  // Test intersection with vertical line j=0
442  vpImagePoint ip_left(b, 0);
443  if (ip_left.get_i() >= 0. && ip_left.get_i() <= (I.getHeight() - 1.)) {
444  vip.push_back(ip_left);
445  }
446  // Test intersection with vertical line j=width-1
447  vpImagePoint ip_right(a * (I.getWidth() - 1) + b, I.getWidth() - 1.);
448  if (ip_right.get_i() >= 0. && ip_right.get_i() <= (I.getHeight() - 1.)) {
449  vip.push_back(ip_right);
450  }
451  if (vip.size() == 2) {
452  vp_display_display_line(I, vip[0], vip[1], color, thickness);
453  return;
454  }
455  // Test intersection with horizontal line i=0
456  vpImagePoint ip_top(0, -b / a);
457  if (ip_top.get_j() >= 0. && ip_top.get_j() <= (I.getWidth() - 1.)) {
458  vip.push_back(ip_top);
459  }
460  if (vip.size() == 2) {
461  vp_display_display_line(I, vip[0], vip[1], color, thickness);
462  return;
463  }
464  // Test intersection with horizontal line i=height-1
465  vpImagePoint ip_bottom(I.getHeight() - 1., (I.getHeight() - 1. - b) / a);
466  if (ip_bottom.get_j() >= 0. && ip_bottom.get_j() <= (I.getWidth() - 1.)) {
467  vip.push_back(ip_bottom);
468  }
469  if (vip.size() == 2) {
470  vp_display_display_line(I, vip[0], vip[1], color, thickness);
471  return;
472  }
473  }
474  }
475 }
476 
486 void vpDisplay::displayLine(const vpImage<vpRGBa> &I, const std::vector<vpImagePoint> &ips, bool closeTheShape,
487  const vpColor &color, unsigned int thickness)
488 {
489  if (ips.size() <= 1)
490  return;
491 
492  for (size_t i = 0; i < ips.size() - 1; i++)
493  vp_display_display_line(I, ips[i], ips[i + 1], color, thickness);
494 
495  if (closeTheShape)
496  vp_display_display_line(I, ips.front(), ips.back(), color, thickness);
497 }
498 
508 void vpDisplay::displayLine(const vpImage<vpRGBa> &I, const std::list<vpImagePoint> &ips, bool closeTheShape,
509  const vpColor &color, unsigned int thickness)
510 {
511  if (ips.size() <= 1)
512  return;
513 
514  std::list<vpImagePoint>::const_iterator it = ips.begin();
515 
516  vpImagePoint ip_prev = *(it++);
517  for (; it != ips.end(); ++it) {
518  if (vpImagePoint::distance(ip_prev, *it) > 1) {
519  vp_display_display_line(I, ip_prev, *it, color, thickness);
520  ip_prev = *it;
521  }
522  }
523 
524  if (closeTheShape) {
525  vp_display_display_line(I, ips.front(), ips.back(), color, thickness);
526  }
527 }
528 
536 void vpDisplay::displayPoint(const vpImage<vpRGBa> &I, const vpImagePoint &ip, const vpColor &color,
537  unsigned int thickness)
538 {
539  vp_display_display_point(I, ip, color, thickness);
540 }
541 
549 void vpDisplay::displayPoint(const vpImage<vpRGBa> &I, int i, int j, const vpColor &color, unsigned int thickness)
550 {
551  vp_display_display_point(I, i, j, color, thickness);
552 }
553 
562 void vpDisplay::displayPolygon(const vpImage<vpRGBa> &I, const std::vector<vpImagePoint> &vip, const vpColor &color,
563  unsigned int thickness, bool closed)
564 {
565  vp_display_display_polygon(I, vip, color, thickness, closed);
566 }
567 
584 void vpDisplay::displayRectangle(const vpImage<vpRGBa> &I, const vpImagePoint &topLeft, unsigned int width,
585  unsigned int height, const vpColor &color, bool fill, unsigned int thickness)
586 {
587  vp_display_display_rectangle(I, topLeft, width, height, color, fill, thickness);
588 }
589 
604 void vpDisplay::displayRectangle(const vpImage<vpRGBa> &I, int i, int j, unsigned int width, unsigned int height,
605  const vpColor &color, bool fill, unsigned int thickness)
606 {
607  vp_display_display_rectangle(I, i, j, width, height, color, fill, thickness);
608 }
609 
625 void vpDisplay::displayRectangle(const vpImage<vpRGBa> &I, const vpRect &rectangle, const vpColor &color, bool fill,
626  unsigned int thickness)
627 {
628  vp_display_display_rectangle(I, rectangle, color, fill, thickness);
629 }
630 
644 void vpDisplay::displayRectangle(const vpImage<vpRGBa> &I, const vpImagePoint &center, float angle, unsigned int width,
645  unsigned int height, const vpColor &color, unsigned int thickness)
646 {
647  vp_display_display_rectangle(I, center, angle, width, height, color, thickness);
648 }
649 
666 void vpDisplay::displayRectangle(const vpImage<vpRGBa> &I, const vpImagePoint &topLeft, const vpImagePoint &bottomRight,
667  const vpColor &color, bool fill, unsigned int thickness)
668 {
669  vp_display_display_rectangle(I, topLeft, bottomRight, color, fill, thickness);
670 }
671 
685 void vpDisplay::displayRectangle(const vpImage<vpRGBa> &I, unsigned int i, unsigned int j, float angle,
686  unsigned int width, unsigned int height, const vpColor &color, unsigned int thickness)
687 {
688  vp_display_display_rectangle(I, i, j, angle, width, height, color, thickness);
689 }
690 
703 void vpDisplay::displayText(const vpImage<vpRGBa> &I, const vpImagePoint &ip, const std::string &s,
704  const vpColor &color)
705 {
706  vp_display_display_text(I, ip, s, color);
707 }
708 
721 void vpDisplay::displayText(const vpImage<vpRGBa> &I, int i, int j, const std::string &s, const vpColor &color)
722 {
723  vp_display_display_text(I, i, j, s, color);
724 }
725 
755 void vpDisplay::flush(const vpImage<vpRGBa> &I) { vp_display_flush(I); }
756 
766 void vpDisplay::flushROI(const vpImage<vpRGBa> &I, const vpRect &roi) { vp_display_flush_roi(I, roi); }
767 
779 void vpDisplay::display(const vpImage<vpRGBa> &I) { vp_display_display(I); }
780 
785 void vpDisplay::displayROI(const vpImage<vpRGBa> &I, const vpRect &roi) { vp_display_display_roi(I, roi); }
786 
804 bool vpDisplay::getClick(const vpImage<vpRGBa> &I, bool blocking) { return vp_display_get_click(I, blocking); }
805 
824 bool vpDisplay::getClick(const vpImage<vpRGBa> &I, vpImagePoint &ip, bool blocking)
825 {
826  return vp_display_get_click(I, ip, blocking);
827 }
828 
850  bool blocking)
851 {
852  return vp_display_get_click(I, ip, button, blocking);
853 }
854 
872 {
873  vpImagePoint ip;
874  return vpDisplay::getClick(I, ip, button, blocking);
875 }
876 
898  bool blocking)
899 {
900  return vp_display_get_click_up(I, ip, button, blocking);
901 }
902 
920 {
921  vpImagePoint ip;
922  return vpDisplay::getClickUp(I, ip, button, blocking);
923 }
924 
1007 bool vpDisplay::getKeyboardEvent(const vpImage<vpRGBa> &I, bool blocking)
1008 {
1009  return vp_display_get_keyboard_event(I, blocking);
1010 }
1011 
1098 bool vpDisplay::getKeyboardEvent(const vpImage<vpRGBa> &I, std::string &key, bool blocking)
1099 {
1100  return vp_display_get_keyboard_event(I, key, blocking);
1101 }
1102 
1189 bool vpDisplay::getKeyboardEvent(const vpImage<vpRGBa> &I, char *key, bool blocking)
1190 {
1191  return vp_display_get_keyboard_event(I, key, blocking);
1192 }
1193 
1204 {
1205  return vp_display_get_pointer_motion_event(I, ip);
1206 }
1207 
1218 {
1219  return vp_display_get_pointer_position(I, ip);
1220 }
1221 
1231 void vpDisplay::setBackground(const vpImage<vpRGBa> &I, const vpColor &color) { vp_display_set_background(I, color); }
1232 
1246 void vpDisplay::setFont(const vpImage<vpRGBa> &I, const std::string &fontname) { vp_display_set_font(I, fontname); }
1247 
1255 void vpDisplay::setTitle(const vpImage<vpRGBa> &I, const std::string &windowtitle)
1256 {
1257  vp_display_set_title(I, windowtitle);
1258 }
1259 
1270 void vpDisplay::setWindowPosition(const vpImage<vpRGBa> &I, int winx, int winy)
1271 {
1272  vp_display_set_window_position(I, winx, winy);
1273 }
1274 
1282 unsigned int vpDisplay::getDownScalingFactor(const vpImage<vpRGBa> &I) { return vp_display_get_down_scaling_factor(I); }
Generic class defining intrinsic camera parameters.
Class to define RGB colors available for display functionnalities.
Definition: vpColor.h:158
static void close(vpImage< unsigned char > &I)
static void setBackground(const vpImage< unsigned char > &I, const vpColor &color)
static bool getClick(const vpImage< unsigned char > &I, bool blocking=true)
static bool getKeyboardEvent(const vpImage< unsigned char > &I, bool blocking=true)
static void displayROI(const vpImage< unsigned char > &I, const vpRect &roi)
static void display(const vpImage< unsigned char > &I)
static void displayLine(const vpImage< unsigned char > &I, const vpImagePoint &ip1, const vpImagePoint &ip2, const vpColor &color, unsigned int thickness=1, bool segment=true)
static void displayEllipse(const vpImage< unsigned char > &I, const vpImagePoint &center, const double &coef1, const double &coef2, const double &coef3, bool use_normalized_centered_moments, const vpColor &color, unsigned int thickness=1, bool display_center=false, bool display_arc=false)
static void displayFrame(const vpImage< unsigned char > &I, const vpHomogeneousMatrix &cMo, const vpCameraParameters &cam, double size, const vpColor &color=vpColor::none, unsigned int thickness=1, const vpImagePoint &offset=vpImagePoint(0, 0), const std::string &frameName="", const vpColor &textColor=vpColor::black, const vpImagePoint &textOffset=vpImagePoint(15, 15))
static void flushROI(const vpImage< unsigned char > &I, const vpRect &roi)
static bool getClickUp(const vpImage< unsigned char > &I, vpImagePoint &ip, vpMouseButton::vpMouseButtonType &button, bool blocking=true)
static void displayCross(const vpImage< unsigned char > &I, const vpImagePoint &ip, unsigned int size, const vpColor &color, unsigned int thickness=1)
static void displayCharString(const vpImage< unsigned char > &I, const vpImagePoint &ip, const char *string, const vpColor &color)
static void setTitle(const vpImage< unsigned char > &I, const std::string &windowtitle)
static void flush(const vpImage< unsigned char > &I)
static void displayArrow(const vpImage< unsigned char > &I, const vpImagePoint &ip1, const vpImagePoint &ip2, const vpColor &color=vpColor::white, unsigned int w=4, unsigned int h=2, unsigned int thickness=1)
static void displayPoint(const vpImage< unsigned char > &I, const vpImagePoint &ip, const vpColor &color, unsigned int thickness=1)
static void setFont(const vpImage< unsigned char > &I, const std::string &font)
static void displayDotLine(const vpImage< unsigned char > &I, const vpImagePoint &ip1, const vpImagePoint &ip2, const vpColor &color, unsigned int thickness=1)
static bool getPointerPosition(const vpImage< unsigned char > &I, vpImagePoint &ip)
static bool getPointerMotionEvent(const vpImage< unsigned char > &I, vpImagePoint &ip)
static void displayCamera(const vpImage< unsigned char > &I, const vpHomogeneousMatrix &cMo, const vpCameraParameters &cam, double size, const vpColor &color, unsigned int thickness)
unsigned int getDownScalingFactor()
Definition: vpDisplay.h:235
static void displayRectangle(const vpImage< unsigned char > &I, const vpImagePoint &topLeft, unsigned int width, unsigned int height, const vpColor &color, bool fill=false, unsigned int thickness=1)
static void setWindowPosition(const vpImage< unsigned char > &I, int winx, int winy)
static void displayText(const vpImage< unsigned char > &I, const vpImagePoint &ip, const std::string &s, const vpColor &color)
static void displayCircle(const vpImage< unsigned char > &I, const vpImagePoint &center, unsigned int radius, const vpColor &color, bool fill=false, unsigned int thickness=1)
static void displayPolygon(const vpImage< unsigned char > &I, const std::vector< vpImagePoint > &vip, const vpColor &color, unsigned int thickness=1, bool closed=true)
Implementation of an homogeneous matrix and operations on such kind of matrices.
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
Definition: vpImagePoint.h:89
double get_j() const
Definition: vpImagePoint.h:132
static double distance(const vpImagePoint &iP1, const vpImagePoint &iP2)
double get_i() const
Definition: vpImagePoint.h:121
unsigned int getWidth() const
Definition: vpImage.h:247
unsigned int getHeight() const
Definition: vpImage.h:189
Defines a rectangle in the plane.
Definition: vpRect.h:78