Vieinco

09-01-2010, 07:07 AM

I try to reconstruct some 3d scene from real world.

From camera calibration by chessboard i had: Matrix(R|T) - transformation matrix (rotation|translation), and internal camera paramenters (focal, cx,cy) - matrix K. And now i'll try to reconstruct chessboard in OpenGL.

Step #1: i perfomed projection calculation by matrix operation (using pure C++)

1. M = K*(R|T)

2. V = M*ObjectModelPoint

3. ScreenX = v.x/v.z; ScreenY = v.y/v.z;

4. Draw point on ScreenX, ScreenY coordinates.

And i had correct recunstruction (visual prove)...

Step #2: I try to translate visualization process via OpenGL.

Step #2.1 If i try to perform some calculation sequence like OpenGL pipeline (according with documentation), i would have code like this

1. (R|T)*ObjectModelPoint = eyePoint

2. ProjectionMatrix * eyePoint = clipPoint

// <= glFrustum( cx, cx - w, cy, cy - h, focal, 3*focal);

// glGetFloatv(GL_PROJECTION_MATRIX, ProjectionMatrix); to get ProjectionMatrix

3. clip all points out of -1,1

4. ndcPoint = clipPoint / clipPoint.w

5. ViewPoint = ViewportMatrix * ndcPoint

// ViewportMatrix - matrix equevalent to glViewport operation

6. draw point at ViewPoint.x, ViewPoint.y

And I have correct visualization (and check all transformation formula manualy)

Step #2.2(!!!) I try to use OpenGL pipeline

1. glViewport(0, 0, w, h);

2. glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glFrustum( cx , cx - w, cy, cy - h, z, 3*z);

// glGetFloatv return the same matrix like ProjectionMatrix in step 2.1

3. glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

gluLookAt( 0.0, 0.0, -focal, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0);

glMultMatrixf(Matrix(R|T));

4. set ObjectModelPoints // glBegin(GL_QUADS); glVertex3d(....)....

BUT in this step i have incorrect visualization :sick:

Position and orientation of model looks like a correct (if a zoom it), but scale factor is toooooo smaaalll (i have aproximatly 5 on 5 pixels object =)) )

Where I fail?! or may be OpenGL pipeline do some also?....

// I can give sources of test project

From camera calibration by chessboard i had: Matrix(R|T) - transformation matrix (rotation|translation), and internal camera paramenters (focal, cx,cy) - matrix K. And now i'll try to reconstruct chessboard in OpenGL.

Step #1: i perfomed projection calculation by matrix operation (using pure C++)

1. M = K*(R|T)

2. V = M*ObjectModelPoint

3. ScreenX = v.x/v.z; ScreenY = v.y/v.z;

4. Draw point on ScreenX, ScreenY coordinates.

And i had correct recunstruction (visual prove)...

Step #2: I try to translate visualization process via OpenGL.

Step #2.1 If i try to perform some calculation sequence like OpenGL pipeline (according with documentation), i would have code like this

1. (R|T)*ObjectModelPoint = eyePoint

2. ProjectionMatrix * eyePoint = clipPoint

// <= glFrustum( cx, cx - w, cy, cy - h, focal, 3*focal);

// glGetFloatv(GL_PROJECTION_MATRIX, ProjectionMatrix); to get ProjectionMatrix

3. clip all points out of -1,1

4. ndcPoint = clipPoint / clipPoint.w

5. ViewPoint = ViewportMatrix * ndcPoint

// ViewportMatrix - matrix equevalent to glViewport operation

6. draw point at ViewPoint.x, ViewPoint.y

And I have correct visualization (and check all transformation formula manualy)

Step #2.2(!!!) I try to use OpenGL pipeline

1. glViewport(0, 0, w, h);

2. glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glFrustum( cx , cx - w, cy, cy - h, z, 3*z);

// glGetFloatv return the same matrix like ProjectionMatrix in step 2.1

3. glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

gluLookAt( 0.0, 0.0, -focal, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0);

glMultMatrixf(Matrix(R|T));

4. set ObjectModelPoints // glBegin(GL_QUADS); glVertex3d(....)....

BUT in this step i have incorrect visualization :sick:

Position and orientation of model looks like a correct (if a zoom it), but scale factor is toooooo smaaalll (i have aproximatly 5 on 5 pixels object =)) )

Where I fail?! or may be OpenGL pipeline do some also?....

// I can give sources of test project