我正在尝试使用普通的液晶投影仪将图像照射到简单的3D形状上,但是以可重复的方式进行。
我需要什么: 我最简单的例子是,我将一个立方体放在桌子上,将投影仪放在距离三脚架一定距离的位置,测量两者之间的距离/方向(使用GOM摄影测量产品http://www.capture3d.com/products-TRITOP.html),打开现有的obj( polygon)模型与立方体的形状完全相同(尺寸非常精确),但有一些“花式”着色,然后将多边形模型投影到LCD投影仪。
我做了什么: 花了一个月试图确定我的投影机的内在/外在常数 - 相机对,焦距,原理点,失真常数......我想我有它们。 (http://code.google.com/p/procamcalib/)
我找到/修改了代码以打开我的obj文件。
我不知道如何处理投影机的这些内在/外在常数。
我正在使用opengl / opencv ...
答案 0 :(得分:1)
一些有用的链接: http://urbanar.blogspot.it/2011/04/from-homography-to-opengl-modelview.html
和 http://cvrr.ucsd.edu/publications/2008/MurphyChutorian_Trivedi_CVGPU08.pdf
当您在k,R,t中分解P矩阵时,其中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();
请告诉我这是否适合你。
答案 1 :(得分:0)
您可以根据here所述的焦距计算相机的视野。获得视野后,可以使用gluPerspective()(或do the calculation yourself - 参见第9.085节)来设置透视矩阵。您显然需要根据投影仪和物体的位置更改模型视图矩阵。我不知道你有什么失真数据,但你可能也需要考虑到这一点。