40 #include <visp3/core/vpConfig.h>
43 #if defined(VISP_HAVE_LIBFREENECT_AND_DEPENDENCIES)
47 #include <visp3/core/vpDebug.h>
48 #include <visp3/core/vpXmlParserCamera.h>
49 #include <visp3/sensor/vpKinect.h>
56 : Freenect::FreenectDevice(ctx, index), m_rgb_mutex(), m_depth_mutex(), RGBcam(), IRcam(), rgbMir(), irMrgb(),
57 DMres(DMAP_LOW_RES), hd(240), wd(320), dmap(), IRGB(), m_new_rgb_frame(false), m_new_depth_map(false),
58 m_new_depth_image(false), height(480), width(640)
60 dmap.
resize(height, width);
61 IRGB.
resize(height, width);
62 vpPoseVector r(-0.0266, -0.0047, -0.0055, 0.0320578, 0.0169041,
83 std::cout <<
"vpKinect::start LOW depth map resolution 240x320" << std::endl;
89 std::cout <<
"vpKinect::start MEDIUM depth map resolution 480x640" << std::endl;
97 #if defined(VISP_HAVE_VIPER850_DATA) && defined(VISP_HAVE_PUGIXML)
99 std::string cameraXmlFile = std::string(VISP_VIPER850_DATA_PATH) + std::string(
"/include/const_camera_Viper850.xml");
124 void vpKinect::VideoCallback(
void *rgb, uint32_t )
126 std::lock_guard<std::mutex> lock(m_rgb_mutex);
127 uint8_t *rgb_ =
static_cast<uint8_t *
>(rgb);
128 for (
unsigned i = 0; i < height; i++) {
129 for (
unsigned j = 0; j < width; j++) {
130 IRGB[i][j].R = rgb_[3 * (width * i + j) + 0];
131 IRGB[i][j].G = rgb_[3 * (width * i + j) + 1];
132 IRGB[i][j].B = rgb_[3 * (width * i + j) + 2];
136 m_new_rgb_frame =
true;
149 void vpKinect::DepthCallback(
void *depth, uint32_t )
151 std::lock_guard<std::mutex> lock(m_depth_mutex);
152 uint16_t *depth_ =
static_cast<uint16_t *
>(depth);
153 for (
unsigned i = 0; i < height; i++) {
154 for (
unsigned j = 0; j < width; j++) {
156 0.1236f * tan(depth_[width * i + j] / 2842.5f + 1.1863f);
158 if (depth_[width * i + j] > 1023) {
163 m_new_depth_map =
true;
164 m_new_depth_image =
true;
172 std::lock_guard<std::mutex> lock(m_depth_mutex);
173 if (!m_new_depth_map)
176 m_new_depth_map =
false;
186 m_depth_mutex.lock();
187 if (!m_new_depth_map && !m_new_depth_image) {
188 m_depth_mutex.unlock();
193 m_new_depth_map =
false;
194 m_new_depth_image =
false;
195 m_depth_mutex.unlock();
198 vpERROR_TRACE(1,
"Image size does not match vpKinect DM resolution");
200 for (
unsigned int i = 0; i < hd; i++)
201 for (
unsigned int j = 0; j < wd; j++) {
202 map[i][j] = tempMap[i << 1][j << 1];
204 if (fabs(map[i][j] + 1.f) > std::numeric_limits<float>::epsilon())
205 Imap[i][j] = (
unsigned char)(255 * map[i][j] / 5);
211 for (
unsigned i = 0; i < height; i++)
212 for (
unsigned j = 0; j < width; j++) {
213 map[i][j] = tempMap[i][j];
215 if (fabs(map[i][j] + 1.f) > std::numeric_limits<float>::epsilon())
216 Imap[i][j] = (
unsigned char)(255 * map[i][j] / 5);
230 std::lock_guard<std::mutex> lock(m_rgb_mutex);
231 if (!m_new_rgb_frame)
234 m_new_rgb_frame =
false;
245 vpERROR_TRACE(1,
"Idepth image size does not match vpKinect DM resolution");
249 IrgbWarped.
resize(hd, wd);
251 double x1 = 0., y1 = 0., x2 = 0., y2 = 0., Z1, Z2;
253 double u = 0., v = 0.;
256 for (
unsigned int i = 0; i < hd; i++)
257 for (
unsigned int j = 0; j < wd; j++) {
262 if (std::fabs(Z1 + 1) <= std::numeric_limits<double>::epsilon()) {
272 if (std::fabs(Z2) > std::numeric_limits<double>::epsilon()) {
277 std::cout <<
"Z2 = 0 !!" << std::endl;
283 unsigned int u_ = (
unsigned int)u;
284 unsigned int v_ = (
unsigned int)v;
286 if ((u_ < width) && (v_ < height)) {
287 IrgbWarped[i][j] = Irgb[v_][u_];
290 IrgbWarped[i][j] = 0;
296 #elif !defined(VISP_BUILD_SHARED_LIBS)
298 void dummy_vpKinect() { };
@ perspectiveProjWithDistortion
Perspective projection with distortion model.
void initPersProjWithDistortion(double px, double py, double u0, double v0, double kud, double kdu)
Implementation of column vector and the associated operations.
vpHomogeneousMatrix & buildFrom(const vpTranslationVector &t, const vpRotationMatrix &R)
vpHomogeneousMatrix inverse() const
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
unsigned int getWidth() const
void resize(unsigned int h, unsigned int w)
resize the image : Image initialization
unsigned int getHeight() const
void warpRGBFrame(const vpImage< vpRGBa > &Irgb, const vpImage< float > &Idepth, vpImage< vpRGBa > &IrgbWarped)
bool getDepthMap(vpImage< float > &map)
void start(vpKinect::vpDMResolution res=DMAP_LOW_RES)
vpKinect(freenect_context *ctx, int index)
bool getRGB(vpImage< vpRGBa > &IRGB)
static void convertPoint(const vpCameraParameters &cam, const double &x, const double &y, double &u, double &v)
static void convertPoint(const vpCameraParameters &cam, const double &u, const double &v, double &x, double &y)
Implementation of a pose vector and operations on poses.
XML parser to load and save intrinsic camera parameters.
int parse(vpCameraParameters &cam, const std::string &filename, const std::string &camera_name, const vpCameraParameters::vpCameraParametersProjType &projModel, unsigned int image_width=0, unsigned int image_height=0, bool verbose=true)