39#include <visp3/core/vpConfig.h>
41#if defined(HAVE_OPENCV_HIGHGUI)
50#include <visp3/core/vpDisplay.h>
51#include <visp3/core/vpImageTools.h>
52#include <visp3/core/vpIoTools.h>
53#include <visp3/core/vpMath.h>
54#include <visp3/gui/vpDisplayOpenCV.h>
57#include <visp3/core/vpDisplayException.h>
59#include <opencv2/core/core.hpp>
60#include <opencv2/highgui/highgui.hpp>
61#if (VISP_HAVE_OPENCV_VERSION < 0x050000)
62#include <opencv2/core/core_c.h>
64#if defined(HAVE_OPENCV_IMGPROC)
65#include <opencv2/imgproc/imgproc.hpp>
69#define CV_RGB(r, g, b) cv::Scalar((b), (g), (r), 0)
73#include <visp3/gui/vpDisplayX.h>
79# pragma clang diagnostic push
80# pragma clang diagnostic ignored "-Wnonportable-system-include-path"
86# pragma clang diagnostic pop
93#ifndef DOXYGEN_SHOULD_SKIP_THIS
94class vpDisplayOpenCV::Impl
102 static std::vector<std::string> m_listTitles;
103 static unsigned int m_nbWindows;
127 friend class vpDisplayOpenCV;
131 m_background(), col(nullptr), cvcolor(), font(cv::FONT_HERSHEY_PLAIN), fontScale(0.8),
132 fontHeight(10), x_move(0), y_move(0), move(false), x_lbuttondown(0), y_lbuttondown(0), lbuttondown(false),
133 x_mbuttondown(0), y_mbuttondown(0), mbuttondown(false), x_rbuttondown(0), y_rbuttondown(0), rbuttondown(false),
134 x_lbuttonup(0), y_lbuttonup(0), lbuttonup(false), x_mbuttonup(0), y_mbuttonup(0), mbuttonup(false), x_rbuttonup(0),
135 y_rbuttonup(0), rbuttonup(false)
140 if (col !=
nullptr) {
146 void getImage(vpImage<vpRGBa> &I)
152 std::string init(
const std::string &title,
const int &windowXPosition,
const int &windowYPosition)
154 int flags = cv::WINDOW_AUTOSIZE;
155 std::string outTitle = title;
156 if (outTitle.empty()) {
157 std::ostringstream
s;
159 outTitle = std::string(
"Window ") +
s.str();
166 while (i < m_listTitles.size() && !isInList) {
167 if (m_listTitles[i] == outTitle) {
168 std::ostringstream
s;
170 outTitle = std::string(
"Window ") +
s.str();
177 m_listTitles.push_back(outTitle);
181 cv::namedWindow(outTitle, flags);
182 cv::moveWindow(outTitle.c_str(), windowXPosition, windowYPosition);
192 cv::setMouseCallback(outTitle, on_mouse,
this);
237 fontSize = cv::getTextSize(
"A", font, fontScale, thickness, &baseline);
239 fontHeight = fontSize.height + baseline;
243 void closeDisplay(
const std::string &title)
245 if (col !=
nullptr) {
250 cv::destroyWindow(title);
251 for (
size_t i = 0;
i < m_listTitles.size();
i++) {
252 if (title == m_listTitles[i]) {
253 m_listTitles.erase(m_listTitles.begin() +
static_cast<long int>(i));
259 void displayArrow(
const vpImagePoint &ip1,
const vpImagePoint &ip2,
const vpColor &color,
260 const unsigned int &w,
const unsigned int &h,
const unsigned int &thickness,
const unsigned int &scale)
266 if ((std::fabs(a) <= std::numeric_limits<double>::epsilon()) &&
267 (std::fabs(b) <= std::numeric_limits<double>::epsilon())) {
282 displayLine(ip2, ip4, color, thickness, scale);
288 displayLine(ip2, ip4, color, thickness, scale);
290 displayLine(ip1, ip2, color, thickness, scale);
294 void displayCircle(
const vpImagePoint ¢er,
const unsigned int &radius,
const vpColor &color,
const bool &fill,
295 const unsigned int &thickness,
const unsigned int &scale)
299 int r =
static_cast<int>(radius / scale);
305 cv_color = col[
color.id];
309 int cv_thickness =
static_cast<int>(
thickness);
310 cv::circle(m_background, cv::Point(x, y), r, cv_color, cv_thickness);
313#if VISP_HAVE_OPENCV_VERSION >= 0x030000
314 int filled = cv::FILLED;
316 int filled = CV_FILLED;
318 double opacity =
static_cast<double>(
color.A) / 255.0;
319 overlay([x, y, r, cv_color, filled](cv::Mat image) { cv::circle(image, cv::Point(x, y), r, cv_color, filled); },
324 void displayCross(
const vpImagePoint &ip,
const unsigned int &size,
const vpColor &color,
const unsigned int &thickness,
const unsigned int &scale)
326 vpImagePoint top, bottom, left, right;
327 top.set_i(ip.
get_i() - size / 2);
328 top.set_j(ip.
get_j());
335 displayLine(top, bottom, color, thickness, scale);
336 displayLine(left, right, color, thickness, scale);
339 void displayDotLine(
const vpImagePoint &ip1,
const vpImagePoint &ip2,
const vpColor &color,
340 const unsigned int &thickness,
const unsigned int &scale)
342 vpImagePoint ip1_ = ip1;
343 vpImagePoint ip2_ = ip2;
345 double size = 10. * scale;
347 bool vertical_line =
static_cast<int>(ip2_.
get_j()) ==
static_cast<int>(ip1_.
get_j());
350 std::swap(ip1_, ip2_);
354 std::swap(ip1_, ip2_);
357 double diff_j = vertical_line ? 1 : ip2_.
get_j() - ip1_.
get_j();
358 double deltaj = size / length * diff_j;
359 double deltai = size / length * (ip2_.
get_i() - ip1_.
get_i());
360 double slope = (ip2_.
get_i() - ip1_.
get_i()) / diff_j;
361 double orig = ip1_.
get_i() - slope * ip1_.
get_j();
364 for (
unsigned int i =
static_cast<unsigned int>(ip1_.
get_i()); i < ip2_.
get_i(); i +=
static_cast<unsigned int>(2 * deltai)) {
366 displayLine(vpImagePoint(i, j), vpImagePoint(i + deltai, j), color, thickness, scale);
370 for (
unsigned int j =
static_cast<unsigned int>(ip1_.
get_j()); j < ip2_.
get_j(); j +=
static_cast<unsigned int>(2 * deltaj)) {
371 double i = slope *
j + orig;
372 displayLine(vpImagePoint(i, j), vpImagePoint(i + deltai, j + deltaj), color, thickness, scale);
377 void displayImage(
const vpImage<unsigned char> &I,
const unsigned int &scale,
const unsigned int &width,
const unsigned int &height)
381 cv::Size size(
static_cast<int>(width),
static_cast<int>(height));
382 if (m_background.channels() != channels || m_background.depth() != depth || m_background.rows !=
static_cast<int>(height) ||
383 m_background.cols !=
static_cast<int>(width)) {
384 m_background = cv::Mat(size, CV_MAKETYPE(depth, channels));
388 for (
unsigned int i = 0;
i <
height;
i++) {
389 unsigned char *dst_24 =
static_cast<unsigned char *
>(m_background.data) +
static_cast<int>(i * 3 * width);
390 for (
unsigned int j = 0;
j <
width;
j++) {
391 unsigned char val = I[
i][
j];
399 for (
unsigned int i = 0;
i <
height;
i++) {
400 unsigned char *dst_24 =
static_cast<unsigned char *
>(m_background.data) +
static_cast<int>(i * 3 * width);
401 for (
unsigned int j = 0;
j <
width;
j++) {
402 unsigned char val = I[
i * scale][
j * scale];
411 void displayImage(
const vpImage<vpRGBa> &I,
const unsigned int &scale,
const unsigned int &width,
const unsigned int &height)
415 cv::Size size(
static_cast<int>(width),
static_cast<int>(height));
416 if (m_background.channels() != channels || m_background.depth() != depth || m_background.rows !=
static_cast<int>(height) ||
417 m_background.cols !=
static_cast<int>(width)) {
418 m_background = cv::Mat(size, CV_MAKETYPE(depth, channels));
422 for (
unsigned int i = 0;
i <
height;
i++) {
423 unsigned char *dst_24 =
static_cast<unsigned char *
>(m_background.data) +
static_cast<int>(i * 3 * width);
424 for (
unsigned int j = 0;
j <
width;
j++) {
425 vpRGBa val = I[
i][
j];
433 for (
unsigned int i = 0;
i <
height;
i++) {
434 unsigned char *dst_24 =
static_cast<unsigned char *
>(m_background.data) +
static_cast<int>(i * 3 * width);
435 for (
unsigned int j = 0;
j <
width;
j++) {
436 vpRGBa val = I[
i * scale][
j * scale];
445 void displayImageROI(
const vpImage<unsigned char> &I,
const vpImagePoint &iP,
const unsigned int &w,
446 const unsigned int &h,
const unsigned int &imgWidth,
const unsigned int &imgHeight,
const unsigned int &scale)
450 cv::Size size(
static_cast<int>(imgWidth),
static_cast<int>(imgHeight));
451 if (m_background.channels() != channels || m_background.depth() != depth || m_background.rows !=
static_cast<int>(imgHeight) ||
452 m_background.cols !=
static_cast<int>(imgWidth)) {
453 m_background = cv::Mat(size, CV_MAKETYPE(depth, channels));
457 unsigned int i_min =
static_cast<unsigned int>(iP.
get_i());
458 unsigned int j_min =
static_cast<unsigned int>(iP.
get_j());
459 unsigned int i_max = std::min<unsigned int>(i_min + h, imgHeight);
460 unsigned int j_max = std::min<unsigned int>(j_min + w, imgWidth);
461 for (
unsigned int i = i_min;
i < i_max;
i++) {
462 unsigned char *dst_24 =
static_cast<unsigned char *
>(m_background.data) +
static_cast<int>(i * 3u * imgWidth + j_min * 3u);
463 for (
unsigned int j = j_min;
j < j_max;
j++) {
464 unsigned char val = I[
i][
j];
472 unsigned int i_min = std::max<unsigned int>(
static_cast<unsigned int>(ceil(iP.
get_i() / scale)), 0);
473 unsigned int j_min = std::max<unsigned int>(
static_cast<unsigned int>(ceil(iP.
get_j() / scale)), 0);
474 unsigned int i_max = std::min<unsigned int>(
static_cast<unsigned int>(ceil((iP.
get_i() + h) / scale)), imgHeight);
475 unsigned int j_max = std::min<unsigned int>(
static_cast<unsigned int>(ceil((iP.
get_j() + w) / scale)), imgWidth);
476 for (
unsigned int i = i_min;
i < i_max;
i++) {
477 unsigned char *dst_24 =
static_cast<unsigned char *
>(m_background.data) +
static_cast<int>(i * 3u * imgWidth + j_min * 3u);
478 for (
unsigned int j = j_min;
j < j_max;
j++) {
479 unsigned char val = I[
i * scale][
j * scale];
488 void displayImageROI(
const vpImage<vpRGBa> &I,
const vpImagePoint &iP,
const unsigned int &w,
const unsigned int &h,
const unsigned int &imgWidth,
const unsigned int &imgHeight,
const unsigned int &scale)
492 cv::Size size(
static_cast<int>(imgWidth),
static_cast<int>(imgHeight));
493 if (m_background.channels() != channels || m_background.depth() != depth || m_background.rows !=
static_cast<int>(imgHeight) ||
494 m_background.cols !=
static_cast<int>(imgWidth)) {
495 m_background = cv::Mat(size, CV_MAKETYPE(depth, channels));
499 unsigned int i_min =
static_cast<unsigned int>(iP.
get_i());
500 unsigned int j_min =
static_cast<unsigned int>(iP.
get_j());
501 unsigned int i_max = std::min<unsigned int>(i_min + h, imgHeight);
502 unsigned int j_max = std::min<unsigned int>(j_min + w, imgWidth);
503 for (
unsigned int i = i_min;
i < i_max;
i++) {
504 unsigned char *dst_24 =
static_cast<unsigned char *
>(m_background.data) +
static_cast<int>(i * 3 * imgWidth + j_min * 3);
505 for (
unsigned int j = j_min;
j < j_max;
j++) {
506 vpRGBa val = I[
i][
j];
514 unsigned int i_min = std::max<unsigned int>(
static_cast<unsigned int>(ceil(iP.
get_i() / scale)), 0);
515 unsigned int j_min = std::max<unsigned int>(
static_cast<unsigned int>(ceil(iP.
get_j() / scale)), 0);
516 unsigned int i_max = std::min<unsigned int>(
static_cast<unsigned int>(ceil((iP.
get_i() + h) / scale)), imgHeight);
517 unsigned int j_max = std::min<unsigned int>(
static_cast<unsigned int>(ceil((iP.
get_j() + w) / scale)), imgWidth);
518 for (
unsigned int i = i_min;
i < i_max;
i++) {
519 unsigned char *dst_24 =
static_cast<unsigned char *
>(m_background.data) +
static_cast<int>(i * 3 * imgWidth + j_min * 3);
520 for (
unsigned int j = j_min;
j < j_max;
j++) {
521 vpRGBa val = I[
i * scale][
j * scale];
530 void displayLine(
const vpImagePoint &ip1,
const vpImagePoint &ip2,
const vpColor &color,
const unsigned int &thickness,
const unsigned int &scale)
536 static_cast<int>(thickness));
541 static_cast<int>(thickness));
545 void displayPoint(
const vpImagePoint &ip,
const vpColor &color,
const unsigned int &thickness,
const unsigned int &scale)
552 cvcolor,
static_cast<int>(thickness));
557 col[
color.id],
static_cast<int>(thickness));
562 void displayRectangle(
const vpImagePoint &topLeft,
const unsigned int &w,
const unsigned int &h,
const vpColor &color,
563 const bool &fill,
const unsigned int &thickness,
const unsigned int &scale)
574 cv_color = col[
color.id];
578 int cv_thickness =
static_cast<int>(
thickness);
579 cv::rectangle(m_background, cv::Point(left, top), cv::Point(right, bottom), cv_color, cv_thickness);
582#if VISP_HAVE_OPENCV_VERSION >= 0x030000
583 int filled = cv::FILLED;
585 int filled = CV_FILLED;
587 double opacity =
static_cast<double>(
color.A) / 255.0;
588 overlay([left, top, right, bottom, cv_color, filled](cv::Mat image) {
589 cv::rectangle(image, cv::Point(left, top), cv::Point(right, bottom), cv_color, filled);
595 void displayText(
const vpImagePoint &ip,
const std::string &text,
const vpColor &color,
const unsigned int &scale)
599 cv::putText(m_background, text,
604 cv::putText(m_background, text,
606 fontScale, col[
color.id]);
610 void flushDisplay(
const std::string &title)
612 cv::imshow(title, m_background);
616 void flushDisplayROI(
const std::string &title)
618 cv::imshow(title.c_str(), m_background);
635 u =
static_cast<unsigned int>(x_lbuttondown) * scale;
636 v =
static_cast<unsigned int>(y_lbuttondown) * scale;
644 u =
static_cast<unsigned int>(x_mbuttondown) * scale;
645 v =
static_cast<unsigned int>(y_mbuttondown) * scale;
653 u =
static_cast<unsigned int>(x_rbuttondown) * scale;
654 v =
static_cast<unsigned int>(y_rbuttondown) * scale;
663 }
while (ret ==
false && blocking ==
true);
679 u =
static_cast<unsigned int>(x_lbuttonup) * scale;
680 v =
static_cast<unsigned int>(y_lbuttonup) * scale;
688 u =
static_cast<unsigned int>(x_mbuttonup) * scale;
689 v =
static_cast<unsigned int>(y_mbuttonup) * scale;
697 u =
static_cast<unsigned int>(x_rbuttonup) * scale;
698 v =
static_cast<unsigned int>(y_rbuttonup) * scale;
707 }
while (ret ==
false && blocking ==
true);
711 bool getPointerMotionEvent(vpImagePoint &ip,
const unsigned int &scale)
716 double u =
static_cast<unsigned int>(x_move) / scale;
717 double v =
static_cast<unsigned int>(y_move) / scale;
725 void getPointerPosition(vpImagePoint &ip,
const unsigned int &scale)
727 bool moved = getPointerMotionEvent(ip, scale);
730 u =
static_cast<unsigned int>(x_move) / scale;
731 v =
static_cast<unsigned int>(y_move) / scale;
737 static void on_mouse(
int event,
int x,
int y,
int ,
void *display)
739 Impl *disp =
static_cast<Impl *
>(display);
742 case cv::EVENT_MOUSEMOVE:
749 case cv::EVENT_LBUTTONDOWN:
751 disp->lbuttondown =
true;
752 disp->x_lbuttondown =
x;
753 disp->y_lbuttondown =
y;
756 case cv::EVENT_MBUTTONDOWN:
758 disp->mbuttondown =
true;
759 disp->x_mbuttondown =
x;
760 disp->y_mbuttondown =
y;
763 case cv::EVENT_RBUTTONDOWN:
765 disp->rbuttondown =
true;
766 disp->x_rbuttondown =
x;
767 disp->y_rbuttondown =
y;
770 case cv::EVENT_LBUTTONUP:
772 disp->lbuttonup =
true;
773 disp->x_lbuttonup =
x;
774 disp->y_lbuttonup =
y;
777 case cv::EVENT_MBUTTONUP:
779 disp->mbuttonup =
true;
780 disp->x_mbuttonup =
x;
781 disp->y_mbuttonup =
y;
784 case cv::EVENT_RBUTTONUP:
786 disp->rbuttonup =
true;
787 disp->x_rbuttonup =
x;
788 disp->y_rbuttonup =
y;
797 void overlay(std::function<
void(cv::Mat &)> overlay_function,
const double &opacity)
803 overlay = m_background.clone();
807 overlay = m_background;
810 overlay_function(overlay);
814 cv::addWeighted(overlay, opacity, m_background, 1.0 - opacity, 0.0, m_background);
819VP_ATTRIBUTE_NO_DESTROY std::vector<std::string> vpDisplayOpenCV::Impl::m_listTitles = std::vector<std::string>();
820unsigned int vpDisplayOpenCV::Impl::m_nbWindows = 0;
839 setScale(scaleType, I.getWidth(), I.getHeight());
863 setScale(scaleType, I.getWidth(), I.getHeight());
864 init(I, x, y, title);
883 setScale(scaleType, I.getWidth(), I.getHeight());
906 setScale(scaleType, I.getWidth(), I.getHeight());
907 init(I, x, y, title);
943 if (!title.empty()) {
947 std::ostringstream s;
948 s << vpDisplayOpenCV::Impl::m_nbWindows++;
949 m_title = std::string(
"Window ") + s.str();
955 for (size_t i = 0; i < vpDisplayOpenCV::Impl::m_listTitles.size(); i++) {
956 if (vpDisplayOpenCV::Impl::m_listTitles[i] == m_title) {
957 std::ostringstream s;
958 s << vpDisplayOpenCV::Impl::m_nbWindows++;
959 m_title = std::string(
"Window ") + s.str();
966 vpDisplayOpenCV::Impl::m_listTitles.push_back(
m_title);
1034 if ((I.getHeight() == 0) || (I.getWidth() == 0)) {
1038 init(I.getWidth(), I.getHeight(), x, y, title);
1055 if ((I.getHeight() == 0) || (I.getWidth() == 0)) {
1060 init(I.getWidth(), I.getHeight(), x, y, title);
1092 if (!title.empty()) {
1149 cv::moveWindow(this->
m_title.c_str(), winx, winy);
1268 m_impl->closeDisplay(
m_title);
1284 m_impl->flushDisplay(
m_title);
1297 const unsigned int )
1300 m_impl->flushDisplayROI(
m_title);
1325 unsigned int w,
unsigned int h,
unsigned int thickness)
1328 m_impl->displayArrow(ip1, ip2, color, w, h, thickness,
m_scale);
1349 m_impl->displayText(ip, text, color,
m_scale);
1369 unsigned int thickness)
1372 m_impl->displayCircle(center, radius, color, fill, thickness,
m_scale);
1387 unsigned int thickness)
1390 m_impl->displayCross(ip, size, color, thickness,
m_scale);
1406 unsigned int thickness)
1409 m_impl->displayDotLine(ip1, ip2, color, thickness,
m_scale);
1424 unsigned int thickness)
1427 m_impl->displayLine(ip1, ip2, color, thickness,
m_scale);
1443 m_impl->displayPoint(ip, color, thickness,
m_scale);
1467 const vpColor &color,
bool fill,
unsigned int thickness)
1470 m_impl->displayRectangle(topLeft, w, h, color, fill, thickness,
m_scale);
1491 const vpColor &color,
bool fill,
unsigned int thickness)
1494 unsigned int w =
static_cast<unsigned int>(bottomRight.
get_u() - topLeft.
get_u() + 1);
1495 unsigned int h =
static_cast<unsigned int>(bottomRight.
get_v() - topLeft.
get_v() + 1);
1547 ret =
getClick(ip, button, blocking);
1576 ret =
getClick(ip, button, blocking);
1640 ret = m_impl->getClickUp(ip, button, blocking,
m_scale);
1654 m_impl->getImage(I);
1682 int key_pressed = cv::waitKey(delay);
1684 if (key_pressed == -1)
1722 int key_pressed = cv::waitKey(delay);
1723 if (key_pressed == -1)
1727 std::stringstream ss;
1754 ret = m_impl->getPointerMotionEvent(ip,
m_scale);
1776 m_impl->getPointerPosition(ip,
m_scale);
1793#if defined(VISP_HAVE_X11)
1795 d.getScreenSize(w, h);
1796#elif defined(VISP_HAVE_XRANDR)
1797 std::string command =
"xrandr | grep '*'";
1798 FILE *fpipe = (FILE *)popen(command.c_str(),
"r");
1800 while (fgets(line,
sizeof(line), fpipe)) {
1801 std::string str(line);
1802 std::size_t found = str.find(
"Failed");
1804 if (found == std::string::npos) {
1805 std::vector<std::string> elm;
1807 for (
size_t i = 0; i < elm.size(); i++) {
1808 if (!elm[i].empty()) {
1810 if (resolution.size() == 2) {
1811 std::istringstream sswidth(resolution[0]), ssheight(resolution[1]);
1821#elif defined(_WIN32)
1823 w =
static_cast<unsigned int>(GetSystemMetrics(SM_CXSCREEN));
1824 h =
static_cast<unsigned int>(GetSystemMetrics(SM_CYSCREEN));
1827 "implemented on winrt"));
1837 unsigned int width, height;
1847 unsigned int width, height;
1854#elif !defined(VISP_BUILD_SHARED_LIBS)
1856void dummy_vpDisplayOpenCV() { }
Class to define RGB colors available for display functionalities.
static const vpColor white
static const vpColor darkGray
static const vpColor cyan
static const vpColor orange
static const vpColor darkRed
static const vpColor blue
static const vpColor lightGray
static const vpColor lightBlue
static const vpColor darkGreen
static const vpColor darkBlue
static const vpColor purple
static const vpColor lightGreen
static const vpColor yellow
static const vpColor lightRed
static const vpColor black
static const vpColor green
static const vpColor gray
Error that can be emitted by the vpDisplay class and its derivatives.
@ notInitializedError
Display not initialized.
void displayRectangle(const vpImagePoint &topLeft, unsigned int width, unsigned int height, const vpColor &color, bool fill=false, unsigned int thickness=1) VP_OVERRIDE
vpDisplayOpenCV & operator=(const vpDisplayOpenCV &display)
void flushDisplayROI(const vpImagePoint &iP, unsigned int width, unsigned int height) VP_OVERRIDE
virtual ~vpDisplayOpenCV() VP_OVERRIDE
bool getKeyboardEvent(bool blocking=true) VP_OVERRIDE
void displayPoint(const vpImagePoint &ip, const vpColor &color, unsigned int thickness=1) VP_OVERRIDE
void setFont(const std::string &font) VP_OVERRIDE
void getImage(vpImage< vpRGBa > &I) VP_OVERRIDE
Get the window pixmap and put it in vpRGBa image.
void flushDisplay() VP_OVERRIDE
void getScreenSize(unsigned int &width, unsigned int &height) VP_OVERRIDE
void clearDisplay(const vpColor &color=vpColor::white) VP_OVERRIDE
bool getPointerMotionEvent(vpImagePoint &ip) VP_OVERRIDE
void displayDotLine(const vpImagePoint &ip1, const vpImagePoint &ip2, const vpColor &color, unsigned int thickness=1) VP_OVERRIDE
void displayArrow(const vpImagePoint &ip1, const vpImagePoint &ip2, const vpColor &color=vpColor::white, unsigned int w=4, unsigned int h=2, unsigned int thickness=1) VP_OVERRIDE
unsigned int getScreenWidth() VP_OVERRIDE
void setTitle(const std::string &title) VP_OVERRIDE
void setWindowPosition(int winx, int winy) VP_OVERRIDE
void displayCircle(const vpImagePoint ¢er, unsigned int radius, const vpColor &color, bool fill=false, unsigned int thickness=1) VP_OVERRIDE
void closeDisplay() VP_OVERRIDE
void displayLine(const vpImagePoint &ip1, const vpImagePoint &ip2, const vpColor &color, unsigned int thickness=1) VP_OVERRIDE
void displayImage(const vpImage< unsigned char > &I) VP_OVERRIDE
bool getPointerPosition(vpImagePoint &ip) VP_OVERRIDE
void init(vpImage< unsigned char > &I, int winx=-1, int winy=-1, const std::string &title="") VP_OVERRIDE
void displayText(const vpImagePoint &ip, const std::string &text, const vpColor &color=vpColor::green) VP_OVERRIDE
bool getClickUp(vpImagePoint &ip, vpMouseButton::vpMouseButtonType &button, bool blocking=true) VP_OVERRIDE
bool getClick(bool blocking=true) VP_OVERRIDE
void displayCross(const vpImagePoint &ip, unsigned int size, const vpColor &color, unsigned int thickness=1) VP_OVERRIDE
unsigned int getScreenHeight() VP_OVERRIDE
void displayImageROI(const vpImage< unsigned char > &I, const vpImagePoint &iP, unsigned int width, unsigned int height) VP_OVERRIDE
Use the X11 console to display images on unix-like OS. Thus to enable this class X11 should be instal...
static void display(const vpImage< unsigned char > &I)
int m_windowXPosition
display position
int m_windowYPosition
display position
bool m_displayHasBeenInitialized
display has been initialized
void setScale(vpScaleType scaleType, unsigned int width, unsigned int height)
error that can be emitted by ViSP classes.
@ functionNotImplementedError
Function not implemented.
static void convert(const vpImage< unsigned char > &src, vpImage< vpRGBa > &dest)
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
static double distance(const vpImagePoint &iP1, const vpImagePoint &iP2)
Definition of the vpImage class member functions.
static double sqr(double x)
static int round(double x)
unsigned char B
Blue component.
unsigned char R
Red component.
unsigned char G
Green component.
Defines a rectangle in the plane.
vpImagePoint getTopLeft() const