1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
|
/*! \example tutorial-pose-from-points-realsense-T265.cpp */
#include <visp3/core/vpConfig.h>
#ifdef VISP_HAVE_MODULE_SENSOR
#include <visp3/sensor/vpRealSense2.h>
#endif
#include <visp3/gui/vpDisplayGDI.h>
#include <visp3/gui/vpDisplayOpenCV.h>
#include <visp3/gui/vpDisplayX.h>
#include "pose_helper.h"
int main(int argc, char **argv)
{
#if (defined(VISP_HAVE_X11) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_OPENCV)) && \
defined(VISP_HAVE_REALSENSE2) && (RS2_API_VERSION > ((2 * 10000) + (31 * 100) + 0))
try {
double opt_square_width = 0.12;
int opt_camera_index = 1; // camera index: 1. Left, 2.Right
for (int i = 0; i < argc; i++) {
if (std::string(argv[i]) == "--camera_index" && i + 1 < argc) {
opt_camera_index = atoi(argv[i + 1]);
} else if (std::string(argv[i]) == "--square_width" && i + 1 < argc) {
opt_square_width = atoi(argv[i + 1]);
} else if (std::string(argv[i]) == "--help" || std::string(argv[i]) == "-h") {
std::cout << "\nUsage: " << argv[0] << " [--camera_index <1.Left | 2.Right> (default: 1)]"
<< " [--square_width <square width in meter (default: 0.12)] [--help] [-h]\n"
<< "\nExample using right camera and square size 0.1:\n"
<< " " << argv[0] << "--camera_index 2 --square_width 0.1\n"
<< std::endl;
return EXIT_SUCCESS;
}
}
vpImage<unsigned char> I;
//! [Grabber]
std::cout << "Use Realsense 2 grabber" << std::endl;
vpRealSense2 g;
rs2::config config;
config.enable_stream(RS2_STREAM_FISHEYE, 1);
config.enable_stream(RS2_STREAM_FISHEYE, 2);
g.open(config);
if (opt_camera_index == 1) // Left camera
g.acquire(&I, NULL, NULL);
else
g.acquire(NULL, &I, NULL);
std::cout << "Read camera parameters from Realsense device" << std::endl;
// Parameters of our camera
vpCameraParameters cam = g.getCameraParameters(
RS2_STREAM_FISHEYE, vpCameraParameters::ProjWithKannalaBrandtDistortion, opt_camera_index);
//! [Grabber]
std::cout << "Square width : " << opt_square_width << std::endl;
std::cout << cam << std::endl;
// The pose container
vpHomogeneousMatrix cMo;
std::vector<vpDot2> dot(4);
std::vector<vpPoint> point; // 3D coordinates of the points
std::vector<vpImagePoint> ip; // 2D coordinates of the points in pixels
double L = opt_square_width / 2.;
point.push_back(vpPoint(-L, -L, 0));
point.push_back(vpPoint(L, -L, 0));
point.push_back(vpPoint(L, L, 0));
point.push_back(vpPoint(-L, L, 0));
#if defined(VISP_HAVE_X11)
vpDisplayX d(I);
#elif defined(VISP_HAVE_GDI)
vpDisplayGDI d(I);
#elif defined(HAVE_OPENCV_HIGHGUI)
vpDisplayOpenCV d(I);
#endif
bool quit = false;
bool apply_cv = false; // apply computer vision
bool init_cv = true; // initialize tracking and pose computation
while (!quit) {
double t_begin = vpTime::measureTimeMs();
if (opt_camera_index == 1)
g.acquire(&I, NULL, NULL);
else
g.acquire(NULL, &I, NULL);
vpDisplay::display(I);
if (apply_cv) {
try {
ip = track(I, dot, init_cv);
computePose(point, ip, cam, init_cv, cMo);
vpDisplay::displayFrame(I, cMo, cam, opt_square_width, vpColor::none, 3);
if (init_cv)
init_cv = false; // turn off the computer vision initialisation specific stuff
{ // Display estimated pose in [m] and [deg]
vpPoseVector pose(cMo);
std::stringstream ss;
ss << "Translation: " << std::setprecision(5) << pose[0] << " " << pose[1] << " " << pose[2] << " [m]";
vpDisplay::displayText(I, 60, 20, ss.str(), vpColor::red);
ss.str(""); // erase ss
ss << "Rotation tu: " << std::setprecision(4) << vpMath::deg(pose[3]) << " " << vpMath::deg(pose[4]) << " "
<< vpMath::deg(pose[5]) << " [deg]";
vpDisplay::displayText(I, 80, 20, ss.str(), vpColor::red);
}
} catch (...) {
std::cout << "Computer vision failure." << std::endl;
apply_cv = false;
init_cv = true;
}
}
vpDisplay::displayText(I, 20, 20, "Right click: quit", vpColor::red);
if (apply_cv) {
vpDisplay::displayText(I, 40, 20, "Computer vision in progress...", vpColor::red);
} else {
vpDisplay::displayText(I, 40, 20, "Left click : start", vpColor::red);
}
vpMouseButton::vpMouseButtonType button;
if (vpDisplay::getClick(I, button, false)) {
if (button == vpMouseButton::button3) {
quit = true;
} else if (button == vpMouseButton::button1) {
apply_cv = true;
}
}
{
std::stringstream ss;
ss << "Time: " << vpTime::measureTimeMs() - t_begin << " ms";
vpDisplay::displayText(I, 20, I.getWidth() - 100, ss.str(), vpColor::red);
}
vpDisplay::flush(I);
}
} catch (const vpException &e) {
std::cout << "Catch an exception: " << e.getMessage() << std::endl;
}
#elif !defined(VISP_HAVE_REALSENSE2)
(void)argc;
(void)argv;
std::cout << "You do not realsense2 SDK functionality enabled..." << std::endl;
std::cout << "Tip:" << std::endl;
std::cout << "- Install librealsense2, configure again ViSP using cmake and build again this example" << std::endl;
return EXIT_SUCCESS;
#elif (VISP_CXX_STANDARD < VISP_CXX_STANDARD_11)
(void)argc;
(void)argv;
std::cout << "You do not build ViSP with c++11 or higher compiler flag" << std::endl;
std::cout << "Tip:" << std::endl;
std::cout << "- Configure ViSP again using cmake -DUSE_CXX_STANDARD=11, and build again this example" << std::endl;
#elif !(defined(VISP_HAVE_X11) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_OPENCV))
(void)argc;
(void)argv;
std::cout << "Install a 3rd party dedicated to image display (X11, GDI, OpenCV), configure and build ViSP again to "
"use this example"
<< std::endl;
#elif !(RS2_API_VERSION > ((2 * 10000) + (31 * 100) + 0))
(void)argc;
(void)argv;
std::cout << "Install librealsense version > 2.31.0" << std::endl;
#endif
}
|