2 #include <visp3/core/vpIoTools.h>
3 #include <visp3/gui/vpDisplayX.h>
4 #include <visp3/gui/vpDisplayGDI.h>
5 #include <visp3/gui/vpDisplayOpenCV.h>
6 #include <visp3/io/vpImageIo.h>
7 #include <visp3/core/vpImageDraw.h>
9 #if (defined(VISP_HAVE_X11) || defined(VISP_HAVE_GDI) || defined(HAVE_OPENCV_HIGHGUI)) \
10 && (VISP_CXX_STANDARD >= VISP_CXX_STANDARD_11)
14 std::string toString(
const std::string &name,
int val)
16 auto fmt = name.c_str();
17 int sz = std::snprintf(
nullptr, 0, fmt, val);
18 std::vector<char> buf(sz + 1);
19 std::sprintf(buf.data(), fmt, val);
20 std::string str(buf.begin(), buf.end());
25 template<
typename T,
typename... Args>
26 std::unique_ptr<T> make_unique_compat(Args&&... args)
28 #if ((__cplusplus >= 201402L) || (defined(_MSVC_LANG) && (_MSVC_LANG >= 201402L)))
29 return std::make_unique<T>(args...);
31 return std::unique_ptr<T>(
new T(std::forward<Args>(args)...));
37 int main(
int argc,
char *argv[])
39 #if (defined(VISP_HAVE_X11) || defined(VISP_HAVE_GDI) || defined(HAVE_OPENCV_HIGHGUI)) \
40 && (VISP_CXX_STANDARD >= VISP_CXX_STANDARD_11)
41 bool opencv_backend =
false;
42 std::string npz_filename =
"npz_tracking_teabox.npz";
43 bool print_cMo =
false;
44 bool dump_infos =
false;
46 for (
int i = 1; i < argc; i++) {
47 if (std::string(argv[i]) ==
"--cv-backend") {
48 opencv_backend =
true;
50 else if ((std::string(argv[i]) ==
"--read" || std::string(argv[i]) ==
"-i") && i+1 < argc) {
51 npz_filename = argv[i+1];
53 else if (std::string(argv[i]) ==
"--print-cMo" && i+1 < argc) {
56 else if (std::string(argv[i]) ==
"--dump" && i+1 < argc) {
60 std::cout <<
"Options:" << std::endl;
61 std::cout <<
" --cv-backend use OpenCV if available for in-memory PNG decoding" << std::endl;
62 std::cout <<
" --read / -i input filename" << std::endl;
63 std::cout <<
" --print-cMo print cMo" << std::endl;
64 std::cout <<
" --dump print all the data name in the file" << std::endl;
69 std::cout <<
"Read file: " << npz_filename << std::endl;
70 std::cout <<
"OpenCV backend? " << opencv_backend << std::endl;
77 std::cout << npz_filename <<
" file contains the following data:" << std::endl;
78 for (visp::cnpy::npz_t::const_iterator it = npz_data.begin(); it != npz_data.end(); ++it) {
79 std::cout <<
" " << it->first << std::endl;
86 int height = *arr_height.
data<
int>();
87 int width = *arr_width.
data<
int>();
88 int channel = *arr_channel.
data<
int>();
89 std::cout <<
"height: " << height << std::endl;
90 std::cout <<
"width: " << width << std::endl;
91 std::cout <<
"channel: " << channel << std::endl;
92 std::cout <<
"Color mode? " << (channel > 1) << std::endl;
98 std::vector<char> vec_arr_camera_name = arr_camera_name.
as_vec<
char>();
99 const std::string camera_name = std::string(vec_arr_camera_name.begin(), vec_arr_camera_name.end());
100 std::cout <<
"Camera name: " << camera_name << std::endl;
107 std::cout <<
"Cam: " << cam << std::endl;
112 std::unique_ptr<vpDisplay>
display;
113 #if defined(VISP_HAVE_X11)
114 display = make_unique_compat<vpDisplayX>(I_display, 100, 100,
"Model-based tracker");
115 #elif defined(VISP_HAVE_GDI)
116 display = make_unique_compat<vpDisplayGDI>(I_display, 100, 100,
"Model-based tracker");
117 #elif defined(HAVE_OPENCV_HIGHGUI)
118 display = make_unique_compat<vpDisplayOpenCV>(I_display, 100, 100,
"Model-based tracker");
122 int nb_data = *arr_nb_data.
data<
int>();
123 std::cout <<
"Number of images: " << nb_data << std::endl;
127 int *vec_img_data_size_ptr = arr_vec_img_data_size.
data<
int>();
129 unsigned char *vec_img_ptr = arr_vec_img.
data<
unsigned char>();
130 std::vector<unsigned char> vec_img;
131 size_t img_data_offset = 0;
135 double *vec_poses_ptr = arr_vec_poses.
data<
double>();
136 assert(arr_vec_poses.
shape.size() == 2);
137 assert(arr_vec_poses.
shape[1] == 6);
138 size_t pose_size = arr_vec_poses.
shape[1];
140 std::vector<double> times;
142 for (
int iter = 0; iter < nb_data; iter++) {
145 vec_img = std::vector<unsigned char>(vec_img_ptr + img_data_offset, vec_img_ptr + img_data_offset + vec_img_data_size_ptr[iter]);
156 times.push_back(end-start);
157 img_data_offset += vec_img_data_size_ptr[iter];
159 const std::string str_model_iter_sz = toString(
"model_%06d", iter) +
"_sz";
161 size_t model_sz = *arr_model_iter_sz.
data<
size_t>();
163 for (
size_t i = 0; i < model_sz; i++) {
165 int res = snprintf(buffer, 100,
"model_%06d_%06zu", iter, i);
166 if (res > 0 && res < 100) {
167 std::string str_model_iter_data = buffer;
170 if (arr_model_iter_data.
shape[0] >= 5) {
171 if (std::fabs(arr_model_iter_data.
data<
double>()[0]) <= std::numeric_limits<double>::epsilon()) {
181 vpThetaUVector(vec_poses_ptr[pose_size*iter + 3], vec_poses_ptr[pose_size*iter + 4], vec_poses_ptr[pose_size*iter + 5])
185 std::cout <<
"\ncMo:\n" << cMo << std::endl;
195 std::cout <<
"Mean time for image decoding: " <<
vpMath::getMean(times) <<
" ms ; Median time: "
203 std::cerr <<
"Error, a missing display library is needed (X11, GDI or OpenCV built with HighGUI module)." << std::endl;
Generic class defining intrinsic camera parameters.
static const vpColor none
static bool getClick(const vpImage< unsigned char > &I, bool blocking=true)
static void display(const vpImage< unsigned char > &I)
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 flush(const vpImage< unsigned char > &I)
Implementation of an homogeneous matrix and operations on such kind of matrices.
static void convert(const vpImage< unsigned char > &src, vpImage< vpRGBa > &dest)
static void drawLine(vpImage< unsigned char > &I, const vpImagePoint &ip1, const vpImagePoint &ip2, unsigned char color, unsigned int thickness=1)
vpImageIoBackendType
Image IO backend for only jpeg and png formats image loading and saving.
@ IO_STB_IMAGE_BACKEND
Use embedded stb_image library.
@ IO_OPENCV_BACKEND
Use OpenCV imgcodecs module.
static void readPNGfromMem(const std::vector< unsigned char > &buffer, vpImage< unsigned char > &I, int backend=IO_DEFAULT_BACKEND)
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
static double getMedian(const std::vector< double > &v)
static double getStdev(const std::vector< double > &v, bool useBesselCorrection=false)
static double getMean(const std::vector< double > &v)
Implementation of a rotation vector as axis-angle minimal representation.
Class that consider the case of a translation vector.
void display(vpImage< unsigned char > &I, const std::string &title)
Display a gray-scale image.
VISP_EXPORT npz_t npz_load(std::string fname)
std::map< std::string, NpyArray > npz_t
VISP_EXPORT int wait(double t0, double t)
VISP_EXPORT double measureTimeMs()
std::vector< size_t > shape
std::vector< T > as_vec() const