44 #include <visp/vpConfig.h>
47 #if defined(VISP_HAVE_LIBFREENECT_AND_DEPENDENCIES)
51 #include <visp/vpKinect.h>
52 #include <visp/vpXmlParserCamera.h>
58 : Freenect::FreenectDevice(ctx, index),
59 m_rgb_mutex(), m_depth_mutex(), RGBcam(), IRcam(),
60 rgbMir(), irMrgb(), DMres(DMAP_LOW_RES),
63 m_new_rgb_frame(false),
64 m_new_depth_map(false),
65 m_new_depth_image(false),
66 height(480), width(640)
68 dmap.
resize(height, width);
69 IRGB.
resize(height, width);
70 vpPoseVector r(-0.0266,-0.0047,-0.0055,0.0320578,0.0169041,-0.0076519 );
90 std::cout <<
"vpKinect::start LOW depth map resolution 240x320" << std::endl;
99 std::cout <<
"vpKinect::start MEDIUM depth map resolution 480x640" << std::endl;
108 #if defined(VISP_HAVE_ACCESS_TO_NAS) && defined(VISP_HAVE_XML2)
110 char cameraXmlFile[FILENAME_MAX];
111 sprintf(cameraXmlFile,
"/udd/fspindle/robot/Viper850/Viper850-code/include/const_camera_Viper850.xml");
134 void vpKinect::VideoCallback(
void* rgb, uint32_t )
138 uint8_t* rgb_ =
static_cast<uint8_t*
>(rgb);
139 for (
unsigned i = 0; i< height;i++){
140 for (
unsigned j = 0 ; j < width ; j++)
142 IRGB[i][j].R = rgb_[3*(width*i +j)+0];
143 IRGB[i][j].G = rgb_[3*(width*i +j)+1];
144 IRGB[i][j].B = rgb_[3*(width*i +j)+2];
148 m_new_rgb_frame =
true;
161 void vpKinect::DepthCallback(
void* depth, uint32_t )
165 uint16_t* depth_ =
static_cast<uint16_t*
>(depth);
166 for (
unsigned i = 0; i< height;i++){
167 for (
unsigned j = 0 ; j < width ; j++)
169 dmap[i][j] = 0.1236f * tan(depth_[width*i +j] / 2842.5f + 1.1863f);
170 if(depth_[width*i +j]>1023){
175 m_new_depth_map =
true;
176 m_new_depth_image =
true;
186 if (!m_new_depth_map)
189 m_new_depth_map =
false;
201 m_depth_mutex.
lock();
202 if (!m_new_depth_map && !m_new_depth_image)
209 m_new_depth_map =
false;
210 m_new_depth_image =
false;
214 vpERROR_TRACE(1,
"Image size does not match vpKinect DM resolution");
216 for(
unsigned int i = 0; i < hd; i++)
217 for(
unsigned int j = 0; j < wd; j++){
218 map[i][j] = tempMap[i<<1][j<<1];
220 if (fabs(map[i][j] + 1.f) > std::numeric_limits<float>::epsilon())
221 Imap[i][j] = (
unsigned char)(255*map[i][j]/5);
228 for (
unsigned i = 0; i< height;i++)
229 for (
unsigned j = 0 ; j < width ; j++){
230 map[i][j] = tempMap[i][j];
232 if (fabs(map[i][j] + 1.f) > std::numeric_limits<float>::epsilon())
233 Imap[i][j] = (
unsigned char)(255*map[i][j]/5);
249 if (!m_new_rgb_frame)
252 m_new_rgb_frame =
false;
262 vpERROR_TRACE(1,
"Idepth image size does not match vpKinect DM resolution");
266 IrgbWarped.
resize(hd, wd);
268 double x1=0., y1=0., x2=0., y2=0., Z1, Z2;
275 for (
unsigned int i = 0; i< hd;i++)
276 for (
unsigned int j = 0 ; j < wd ; j++){
281 if (std::fabs(Z1+1) <= std::numeric_limits<double>::epsilon()){
291 if (std::fabs(Z2) > std::numeric_limits<double>::epsilon()){
296 std::cout<<
"Z2 = 0 !!"<<std::endl;
301 unsigned int u_ = (
unsigned int)u;
302 unsigned int v_ = (
unsigned int)v;
304 if ((u_<width)&&(v_<height)){
305 IrgbWarped[i][j] = Irgb[v_][u_];
308 IrgbWarped[i][j] = 0;
317 #endif // VISP_HAVE_LIBFREENECT
Class that allows protection by mutex.
void start(vpKinect::vpDMResolution res=DMAP_LOW_RES)
unsigned int getWidth() const
static void convertPoint(const vpCameraParameters &cam, const double &x, const double &y, double &u, double &v)
Point coordinates conversion from normalized coordinates in meter to pixel coordinates ...
static void convertPoint(const vpCameraParameters &cam, const double &u, const double &v, double &x, double &y)
Point coordinates conversion from pixel coordinates to normalized coordinates in meter...
XML parser to load and save intrinsic camera parameters.
void resize(const unsigned int h, const unsigned int w)
set the size of the image without initializing it.
bool getRGB(vpImage< vpRGBa > &IRGB)
void warpRGBFrame(const vpImage< vpRGBa > &Irgb, const vpImage< float > &Idepth, vpImage< vpRGBa > &IrgbWarped)
Perspective projection with distortion model.
void buildFrom(const vpTranslationVector &t, const vpRotationMatrix &R)
Construction from translation vector and rotation matrix.
Class that provides a data structure for the column vectors as well as a set of operations on these v...
The pose is a complete representation of every rigid motion in the euclidian space.
vpHomogeneousMatrix inverse() const
unsigned int getHeight() const
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
int parse(vpCameraParameters &cam, const std::string &filename, const std::string &camera_name, const vpCameraParameters::vpCameraParametersProjType &projModel, const unsigned int image_width=0, const unsigned int image_height=0)
bool getDepthMap(vpImage< float > &map)
void initPersProjWithDistortion(const double px, const double py, const double u0, const double v0, const double kud, const double kdu)
vpKinect(freenect_context *ctx, int index)