2#include <visp3/core/vpConfig.h>
3#include <visp3/core/vpIoTools.h>
4#include <visp3/io/vpImageIo.h>
5#include <visp3/mbt/vpMbGenericTracker.h>
6#include <visp3/io/vpVideoReader.h>
8#if defined(VISP_HAVE_MINIZ) && defined(VISP_HAVE_WORKING_REGEX)
9#ifdef ENABLE_VISP_NAMESPACE
20 std::vector<double> vec {
t[0],
t[1],
t[2],
tu[0],
tu[1],
tu[2] };
26int main(
int argc,
char **argv)
28 bool opencv_backend =
false;
29 std::string npz_filename =
"npz_tracking_teabox.npz";
30 bool color_mode =
false;
31 bool save_alpha =
false;
32 bool print_cMo =
false;
34 for (
int i = 1;
i < argc;
i++) {
35 if (std::string(argv[i]) ==
"--cv-backend") {
36 opencv_backend =
true;
38 else if ((std::string(argv[i]) ==
"--save" || std::string(argv[i]) ==
"-o") && (i+1 < argc)) {
39 npz_filename = argv[
i+1];
42 else if (std::string(argv[i]) ==
"--color" || std::string(argv[i]) ==
"-c") {
45 else if (std::string(argv[i]) ==
"--alpha" || std::string(argv[i]) ==
"-a") {
48 else if (std::string(argv[i]) ==
"--print-cMo") {
52 std::cout <<
"Options:" << std::endl;
53 std::cout <<
" --cv-backend use OpenCV if available for in-memory PNG encoding" << std::endl;
54 std::cout <<
" --save / -o output filename" << std::endl;
55 std::cout <<
" --color save RGB data" << std::endl;
56 std::cout <<
" --alpha if --color opton, save RGBa data" << std::endl;
57 std::cout <<
" --print-cMo print cMo" << std::endl;
62 std::cout <<
"Save file: " << npz_filename << std::endl;
63 std::cout <<
"OpenCV backend? " << opencv_backend << std::endl;
64 std::cout <<
"Color image? " << color_mode << std::endl;
65 std::cout <<
"Save alpha channel? " << save_alpha << std::endl;
67 std::string opt_videoname =
"model/teabox/teabox.mp4";
68 std::string opt_modelname =
"model/teabox/teabox.cao";
73 if (!parentname.empty())
74 objectname = parentname +
"/" + objectname;
76 std::cout <<
"Video name: " << opt_videoname << std::endl;
89 cam.initPersProjWithoutDistortion(839, 839, 325, 243);
90 tracker.setCameraParameters(cam);
91 tracker.loadModel(objectname +
".cao");
94 cMo[0][0] = 0.4889237963;
cMo[0][1] = 0.8664706489;
cMo[0][2] = 0.1009065709;
cMo[0][3] = -0.07010159786;
95 cMo[1][0] = 0.4218451176;
cMo[1][1] = -0.1335995053;
cMo[1][2] = -0.8967708007;
cMo[1][3] = -0.08363026223;
96 cMo[2][0] = -0.7635445096;
cMo[2][1] = 0.4810195286;
cMo[2][2] = -0.4308363901;
cMo[2][3] = 0.4510066725;
99 const int height = I.getRows();
100 const int width = I.getCols();
103 channel = save_alpha ? 4 : 3;
110 std::vector<unsigned char> img_buffer;
115 visp::cnpy::npz_save(npz_filename,
"camera_name", &vec_camera_name[0], { vec_camera_name.size() },
"w");
120 const double cam_px =
cam.get_px(), cam_py =
cam.get_py(), cam_u0 =
cam.get_u0(), cam_v0 =
cam.get_v0();
126 std::vector<double> vec_poses;
129 std::vector<int> vec_img_data_size;
131 std::vector<unsigned char> vec_img_data;
134 std::vector<double> times;
141 std::cout <<
"\ncMo:\n" <<
cMo << std::endl;
153 times.push_back(end-start);
154 vec_img_data_size.push_back(
static_cast<int>(img_buffer.size()));
155 vec_img_data.insert(vec_img_data.end(), img_buffer.begin(), img_buffer.end());
157 std::vector<double> vec_pose = poseToVec(cMo);
158 vec_poses.insert(vec_poses.end(), vec_pose.begin(), vec_pose.end());
160 std::map<std::string, std::vector<std::vector<double> > > mapOfModels;
161 std::map<std::string, unsigned int> mapOfW;
163 std::map<std::string, unsigned int> mapOfH;
165 std::map<std::string, vpHomogeneousMatrix> mapOfcMos;
167 std::map<std::string, vpCameraParameters> mapOfCams;
169 tracker.getModelForDisplay(mapOfModels, mapOfW, mapOfH, mapOfcMos, mapOfCams);
171 std::vector<std::vector<double>> model = mapOfModels[
camera_name];
173 const std::string model_iter_sz = model_iter +
"_sz";
175 const size_t model_size = model.size();
178 for (
size_t i = 0;
i < model.size();
i++) {
180 int res = snprintf(buffer, 100,
"model_%06zu_%06zu", iter, i);
181 if (res > 0 && res < 100) {
182 const std::string model_iter_data = buffer;
183 std::vector<double> &vec_line = model[
i];
191 std::cout <<
"Mean time for image encoding: " <<
vpMath::getMean(times) <<
" ms ; Median time: "
194 visp::cnpy::npz_save(npz_filename,
"vec_img_data_size", vec_img_data_size.data(), { vec_img_data_size.size() },
"a");
195 visp::cnpy::npz_save(npz_filename,
"vec_img", vec_img_data.data(), { vec_img_data.size() },
"a");
197 assert(iter == vec_poses.size()/6);
198 visp::cnpy::npz_save(npz_filename,
"vec_poses", vec_poses.data(), { static_cast<size_t>(iter), 6 },
"a");
210 std::cout <<
"This tutorial needs c++11 flags" << std::endl;
211#ifndef VISP_HAVE_MINIZ
212 std::cerr <<
"You also need to enable npz I/O functions" << std::endl;
Generic class defining intrinsic camera parameters.
Implementation of an homogeneous matrix and operations on such kind of matrices.
static void convert(const vpImage< unsigned char > &src, vpImage< vpRGBa > &dest)
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 writePNGtoMem(const vpImage< unsigned char > &I, std::vector< unsigned char > &buffer, int backend=IO_DEFAULT_BACKEND)
Definition of the vpImage class member functions.
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)
Real-time 6D object pose tracking using its CAD model.
Implementation of a rotation vector as axis-angle minimal representation.
Class that consider the case of a translation vector.
Class that enables to manipulate easily a video file or a sequence of images. As it inherits from the...
void open(vpImage< vpRGBa > &I) VP_OVERRIDE
void setFileName(const std::string &filename)
void acquire(vpImage< vpRGBa > &I) VP_OVERRIDE
VISP_EXPORT void npz_save(const std::string &zipname, std::string fname, const std::vector< std::string > &data_vec, const std::vector< size_t > &shape, const std::string &mode="w")
VISP_EXPORT double measureTimeMs()