3D проекция - PullRequest
       48

3D проекция

3 голосов
/ 24 августа 2011

Я пытаюсь использовать обычный ЖК-проектор, чтобы придать изображению простую трехмерную форму, но делаю это повторяемым способом.

Что мне нужно: мой самый простой пример - я помещаю кубна столе поместите проектор, прикрепленный к штативу, на некотором расстоянии, измерьте расстояние / ориентацию между ними (с помощью продукта фотогамметрии GOM, http://www.capture3d.com/products-TRITOP.html), откройте существующую модель obj (многоугольник), которая точно такая жесформируйте как куб (очень точный размер), но с некоторой «причудливой» окраской, затем спроецируйте модель многоугольника на ЖК-проектор.

Что я сделал: потратил месяц, пытаясь определить внутреннюю / внешнююконстанты моего проектора - пара камер, фокусное расстояние, принципиальная точка, константы искажения ... и я думаю, что они у меня есть.(http://code.google.com/p/procamcalib/)

Я нашел / изменил код для открытия моего файла obj.

Я застрял в том, что делать с этими внутренними / внешними константами для проектора.

Я использую opengl / opencv ...

Ответы [ 2 ]

1 голос
/ 15 апреля 2013

Несколько полезных ссылок: http://urbanar.blogspot.it/2011/04/from-homography-to-opengl-modelview.html

и http://cvrr.ucsd.edu/publications/2008/MurphyChutorian_Trivedi_CVGPU08.pdf

Когда вы декомпозируете свою P-матрицу в k, R, t, где k - внутренняя матрица, а R, t - относительно поворота и перемещения позы, тогда вы можете сгенерировать соответствующую OpenGL-матрицу следующим образом (мое решение на C ++, но Вы можете понять логику этого):

Eigen::Matrix4d convertIntrinsicToOpenGLProjection(const Eigen::Matrix3d &K,double x0,double y0,double width,double height,double znear,double zfar)
{
    double depth = zfar - znear;
    double q =  -(zfar + znear) / depth;
    double qn = -2.0 * (zfar * znear) / depth;
    Eigen::Matrix4d proj;
    proj << 2*K(0,0)/width, -2*K(0,1)/width, (-2*K(0,2)+width+2*x0)/width, 0 ,
                           0,             -2*K(1,1)/height,(-2*K(1,2)+height+2*y0)/height, 0,
                         0,0,q,qn,
                         0,0,-1,0;
    return proj;
}

Affine3d convertExtrinsicToOpenGLModelView(const Matrix3d &R, const Vector3d &t)
{
    Affine3d MV;
    MV.linear().matrix() << R;
    MV.translation() << t;
    AngleAxis<double> adapter(M_PI,Eigen::Vector3d(1,0,0));
    MV = MV*adapter;
    return MV.inverse();
}
// Decompose P in k,R,t with any DLT direct linear transform procedure or Zhang method
Eigen::Matrix3d K; //intrinsic calibration matrix
    K <<     49.30423  ,   0.00000 ,  387.13187,
        0.00000  ,  26.81592 ,  295.07170,
        0.00000 ,    0.00000   , 1.00000 ;

    int projAreaWidth = 684; //related to the size of your screen
    int projAreaHeight = 608;
    double x0=0,y0=0;
    double zfar=0.1;
    double znear=2000;

Matrix4d P = convertIntrinsicToOpenGLProjection( K,  x0, y0,  width,  height, znear, zfar);
Affine3d MV = convertExtrinsicToOpenGLModelView(R, t);

glPushMatrix();
glLoadMatrixd(P.data());
glMultMatrixd(MV.data());

//draw your object

glPopMatrix();

Дайте мне знать, если это имеет смысл для вас.

0 голосов
/ 02 января 2012

Вы можете рассчитать поле зрения камеры по ее фокусному расстоянию, как описано здесь . Если у вас есть поле зрения, вы можете использовать функцию gluPerspective () (или выполнить вычисления самостоятельно - см. Раздел 9.085), чтобы настроить матрицу перспективы. Вам, очевидно, нужно будет изменить матрицу вида модели в зависимости от того, где находятся проектор и объект. Я не знаю, какие у вас есть данные об искажении, но вам, вероятно, придется это учитывать.

...