I am trying to compile this program to generate point cloud using kinect on Ubuntu 14.04
/*
* This file is part of the OpenKinect Project. http://www.openkinect.org
*
* Copyright (c) 2010 individual OpenKinect contributors. See the CONTRIB file
* for details.
*
* Andrew Miller <[email protected]>
*
* This code is licensed to you under the terms of the Apache License, version
* 2.0, or, at your option, the terms of the GNU General Public License,
* version 2.0. See the APACHE20 and GPL2 files for the text of the licenses,
* or the following URLs:
* http://www.apache.org/licenses/LICENSE-2.0
* http://www.gnu.org/licenses/gpl-2.0.txt
*
* If you redistribute this file in source form, modified or unmodified, you
* may:
* 1) Leave this header intact and distribute it under the same terms,
* accompanying it with the APACHE20 and GPL20 files, or
* 2) Delete the Apache 2.0 clause and accompany it with the GPL2 file, or
* 3) Delete the GPL v2 clause and accompany it with the APACHE20 file
* In all cases you must keep the copyright notice intact and include a copy
* of the CONTRIB file.
*
* Binary distributions must follow the binary distribution requirements of
* either License.
*/
#include "libfreenect.h"
#include "libfreenect_sync.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#if defined(__APPLE__)
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
int window;
GLuint gl_rgb_tex;
int mx=-1,my=-1; // Prevous mouse coordinates
int rotangles[2] = {0}; // Panning angles
float zoom = 1; // zoom factor
int color = 1; // Use the RGB texture or just draw it as color
// Do the projection from u,v,depth to X,Y,Z directly in an opengl matrix
// These numbers come from a combination of the ros kinect_node wiki, and
// nicolas burrus' posts.
void LoadVertexMatrix()
{
float fx = 594.21f;
float fy = 591.04f;
float a = -0.0030711f;
float b = 3.3309495f;
float cx = 339.5f;
float cy = 242.7f;
GLfloat mat[16] = {
1/fx, 0, 0, 0,
0, -1/fy, 0, 0,
0, 0, 0, a,
-cx/fx, cy/fy, -1, b
};
glMultMatrixf(mat);
}
// This matrix comes from a combination of nicolas burrus's calibration post
// and some python code I haven't documented yet.
void LoadRGBMatrix()
{
float mat[16] = {
5.34866271e+02, 3.89654806e+00, 0.00000000e+00, 1.74704200e-02,
-4.70724694e+00, -5.28843603e+02, 0.00000000e+00, -1.22753400e-02,
-3.19670762e+02, -2.60999685e+02, 0.00000000e+00, -9.99772000e-01,
-6.98445586e+00, 3.31139785e+00, 0.00000000e+00, 1.09167360e-02
};
glMultMatrixf(mat);
}
void mouseMoved(int x, int y)
{
if (mx>=0 && my>=0) {
rotangles[0] += y-my;
rotangles[1] += x-mx;
}
mx = x;
my = y;
}
void mousePress(int button, int state, int x, int y)
{
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
mx = x;
my = y;
}
if (button == GLUT_LEFT_BUTTON && state == GLUT_UP) {
mx = -1;
my = -1;
}
}
void no_kinect_quit(void)
{
printf("Error: Kinect not connected?\n");
exit(1);
}
void DrawGLScene()
{
short *depth = 0;
char *rgb = 0;
uint32_t ts;
if (freenect_sync_get_depth((void**)&depth, &ts, 0, FREENECT_DEPTH_11BIT) < 0)
no_kinect_quit();
if (freenect_sync_get_video((void**)&rgb, &ts, 0, FREENECT_VIDEO_RGB) < 0)
no_kinect_quit();
static unsigned int indices[480][640];
static short xyz[480][640][3];
int i,j;
for (i = 0; i < 480; i++) {
for (j = 0; j < 640; j++) {
xyz[i][j][0] = j;
xyz[i][j][1] = i;
xyz[i][j][2] = depth[i*640+j];
indices[i][j] = i*640+j;
}
}
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glPushMatrix();
glScalef(zoom,zoom,1);
glTranslatef(0,0,-3.5);
glRotatef(rotangles[0], 1,0,0);
glRotatef(rotangles[1], 0,1,0);
glTranslatef(0,0,1.5);
LoadVertexMatrix();
// Set the projection from the XYZ to the texture image
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glScalef(1/640.0f,1/480.0f,1);
LoadRGBMatrix();
LoadVertexMatrix();
glMatrixMode(GL_MODELVIEW);
glPointSize(1);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_SHORT, 0, xyz);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(3, GL_SHORT, 0, xyz);
if (color)
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, gl_rgb_tex);
glTexImage2D(GL_TEXTURE_2D, 0, 3, 640, 480, 0, GL_RGB, GL_UNSIGNED_BYTE, rgb);
glPointSize(2.0f);
glDrawElements(GL_POINTS, 640*480, GL_UNSIGNED_INT, indices);
glPopMatrix();
glDisable(GL_TEXTURE_2D);
glutSwapBuffers();
}
void keyPressed(unsigned char key, int x, int y)
{
if (key == 27) {
freenect_sync_stop();
glutDestroyWindow(window);
exit(0);
}
if (key == 'w')
zoom *= 1.1f;
if (key == 's')
zoom /= 1.1f;
if (key == 'c')
color = !color;
}
void ReSizeGLScene(int Width, int Height)
{
glViewport(0,0,Width,Height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60, 4/3., 0.3, 200);
glMatrixMode(GL_MODELVIEW);
}
void InitGL(int Width, int Height)
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glEnable(GL_DEPTH_TEST);
glGenTextures(1, &gl_rgb_tex);
glBindTexture(GL_TEXTURE_2D, gl_rgb_tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
ReSizeGLScene(Width, Height);
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH);
glutInitWindowSize(640, 480);
glutInitWindowPosition(0, 0);
window = glutCreateWindow("LibFreenect");
glutDisplayFunc(&DrawGLScene);
glutIdleFunc(&DrawGLScene);
glutReshapeFunc(&ReSizeGLScene);
glutKeyboardFunc(&keyPressed);
glutMotionFunc(&mouseMoved);
glutMouseFunc(&mousePress);
InitGL(640, 480);
glutMainLoop();
return 0;
}
I have libfreenect
, opengl
installed. But the linker gives the following error. I tried
find /usr -name *freenect*sync*
to locate the libraries I am missing and got the following output
/usr/lib/x86_64-linux-gnu/libfreenect_sync.so
/usr/lib/x86_64-linux-gnu/libfreenect_sync.so.0.2
/usr/lib/x86_64-linux-gnu/libfreenect_sync.so.0.2.0
/usr/include/libfreenect_sync.h
When I tried after including this -L/usr/lib/x86_64-linux-gnu
, the linker produced the following error.
lakshayg@lakshayg:~/freenect/pclview$ make
g++ -I/usr/X11R6/include `pkg-config --cflags libfreenect` glpclview.cpp -o glpclview `pkg-config --libs libfreenect` -L/usr/X11R6/lib/ -L/usr/lib/x86_64-linux-gnu -lGL -lGLU -lglut
/tmp/cclq9nUn.o: In function `DrawGLScene()':
glpclview.cpp:(.text+0x269): undefined reference to `freenect_sync_get_depth'
glpclview.cpp:(.text+0x28f): undefined reference to `freenect_sync_get_video'
/tmp/cclq9nUn.o: In function `keyPressed(unsigned char, int, int)':
glpclview.cpp:(.text+0x5cd): undefined reference to `freenect_sync_stop'
collect2: error: ld returned 1 exit status
make: *** [glpclview] Error 1
lakshayg@lakshayg:~/freenect/pclview$
Here is the Makefile I am using for the code
FLAGS = `pkg-config --cflags libfreenect`
INCLUDE = -I/usr/X11R6/include
LIBS = `pkg-config --libs libfreenect` -L/usr/X11R6/lib/ -L/usr/lib/x86_64-linux-gnu -lGL -lGLU -lglut
glpclview: glpclview.cpp
g++ $(INCLUDE) $(FLAGS) $? -o $@ $(LIBS)
I am relatively new to linux and completely stumped at this point. What should I do so that the program compiles successfully ?
I finally figured out how to compile it!
g++ glpclview.cpp -o glpclview -lfreenect -lfreenect_sync -lGL -lGLU -lglut
I was missing the
-lfreenect_sync
flag to link the freenect sync drivers.